ablog

不器用で落着きのない技術者のメモ

Oracle で dump を import するときに表領域を変更する方法

開発現場でよくある問題。Oracle の dump を import したいけど、環境によって表領域構成が違って、そのまま import できない。export 元と同じ構成の表領域を作って、import 後に move するとかすればできるけど、ディスク容量が足りないとそれもできない。先に DDL 実行して、セグメントを作成しておいて、ignore=y で import するとかでもできるけど、いずれも手順がめんどう。


Data Pump を使うとサクっとできます。
Oracle Database から DDL 文を生成する SQL スクリプト - ablog
みたいなめんどうなことをする必要はありません。

検証ポイント

  • Data Pump で export した dump を import するときに import 先の表領域を変更できること。
  • dump が複数の表領域内のセグメントを含む場合、それぞれの表領域について import 先表領域を指定できること。

検証手順

  • SCOTT_DATA 表領域、SCOTT_INDX 表領域を作成する。
  • SCOTT ユーザを作成する。
  • SCOTT_DATA 表領域にテーブル TBL1、SCOTT_INDX 表領域にインデックス INDX1 を作成する。OWNER は SCOTT。
  • TBL1 にレコードを insert する。
  • Data Pump でスキーマ・モードで SCOTT スキーマを export する。
  • Data Pump でスキーマ・モードで SCOTT スキーマを import する。このとき、SCOTT_DATA 表領域、SCOTT_INDX 表領域を USERS 表領域に remap する。
  • USERS 表領域に TBL1 と INDX1 が import されていることを確認する。

検証結果

  • SCOTT_DATA 表領域、SCOTT_INDX 表領域を作成する。
SQL> conn / as sydba
SQL> create tablespace scott_data datafile '/export/home/oracle/oradata/orcl/scott_data01.dbf' size 5m;
SQL> create tablespace scott_indx datafile '/export/home/oracle/oradata/orcl/scott_indx01.dbf' size 5m;
  • SCOTT ユーザを作成する。
SQL> create user scott identified by tiger
default tablespace scott_data
temporary tablespace temp
quota unlimited on scott_data
quota unlimited on scott_indx;
SQL> grant connect to scott;
  • SCOTT_DATA 表領域にテーブル TBL1、SCOTT_INDX 表領域にインデックス INDX1 を作成する。OWNER は SCOTT。
SQL> create table scott.tbl1 (id number(4)) tablespace scott_data;
SQL> create index scott.indx1 on scott.tbl1 (id) tablespace scott_indx;
  • TBL1 にレコードを insert する。
SQL> conn scott/tiger
SQL> begin
	for i in 1..100 loop
		insert into tbl1 (id) values(i);
	end loop;
end;
/
SQL> commit;
SQL> select count(1) from tbl1;

  COUNT(1)
----------
       100
SQL> exit
SQL> conn / as sysdba
SQL> create or replace directory dump_dir as '/export/home/oracle/admin/orcl/dpdump';
SQL> grant read, write on directory dump_dir to system;
$ expdp system/manager directory=dump_dir dumpfile=scott.dmp schemas=scott logfile=exp_scott.log flashback_time=\"TO_TIMESTAMP\(TO_CHAR\(SYSDATE,\'YYYY-MM-DD HH24:MI:SS\'\),\'YYYY-MM-DD HH24:MI:SS\'\)\"
  • Data Pump でスキーマ・モードで SCOTT スキーマを import する。このとき、SCOTT_DATA 表領域、SCOTT_INDX 表領域を USERS 表領域に remap する。
$ sqlplus / as sysdba
SQL> drop user scott cascade;
SQL> exit
$ impdp system/manager directory=dump_dir dumpfile=scott.dmp schemas=scott remap_tablespace=scott_data:users remap_tablespace=scott_indx:users logfile=imp_scott.log
  • USERS 表領域に TBL1 と INDX1 が import されていることを確認する。
$ sqlplus / as sysdba
SQL> alter user scott identified by tiger;
SQL> conn scott/tiger
SQL> set linesize 200
SQL> col segment_name for a20
SQL> col tablespace_name for a20
SQL> select segment_name, tablespace_name from user_segments;

SEGMENT_NAME         TABLESPACE_NAME
-------------------- --------------------
INDX1                USERS
TBL1                 USERS

おk、USERS 表領域にテーブルとインデックスができている!