開発現場でよくある問題。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\'\)\"
$ 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 表領域にテーブルとインデックスができている!