概要
以下の様な1つのOracle DBインスタンスに本番用スキーマと、テスト用スキーマが存在しており、本番系アプリケーションからはProductionスキーマを、テスト系アプリケーションからはStagingスキーマを参照しているシステムを想定しています。
本番スキーマ Productionは本番系のため日々最新データが存在しています。テストスキーマ Stagingはテスト用のため、テスト作業を行う際に本番スキーマの内容を反映させるためにインポートを行います。但し、本番スキーマや他のスキーマの内容を変えてはいけません。
IMPDPに利用するコマンドを実際に実行し、確認しました。

結論
以下 IMPDPコマンドでダンプファイル内にある本番スキーマ Productionの内容を、テストスキーマ Stagingのオブジェクトとして復元します。schemaには元のスキーマであるProductionを指定、remap_schema, remap_tablespaceには本番系をテスト系にリマップしてインポートさせます。
schemaには元のスキーマであるProductionを設定しなければならなかったです。
IMPDP SYSTEM/パスワード
directory=expdir
dumpfile=production.dmp
logfile=impdp.log
schemas=production
remap_schema=production:staging
remap_tablespace=tbs_production:tbs_staging
EXCLUDE=STATISTICS
directory=expdir | ディレクトリオブジェクトを指定 |
dumpfile=full.dmp | ダンプファイル名を指定 |
logfile=impdp.log | ログファイル名を指定 |
schemas=production | インポート対象のスキーマを指定 ここでは本番スキーマ Production |
remap_schema=production:staging | インポート時にスキーマをRemap productionスキーマのオブジェクトをstagingスキーマにインポート |
remap_tablespace=tbs_production:tbs_staging | インポート時に表領域をRemap tbs_production表領域からtbs_staging表領域にインポート |
検証環境の準備
環境作成
以下コマンドを実行し環境を構築します。
--表領域の作成
CREATE TABLESPACE TBS_PRODUCTION DATAFILE '略\DF_PRODUCTION.DBF' SIZE 100M;
CREATE TABLESPACE TBS_STAGING DATAFILE '略\DF_STAGING.DBF' SIZE 100M;
--ユーザーの作成
CREATE USER PRODUCTION
IDENTIFIED BY "Password1234"
DEFAULT TABLESPACE TBS_PRODUCTION
TEMPORARY TABLESPACE TEMP;
CREATE USER STAGING
IDENTIFIED BY "Password1234"
DEFAULT TABLESPACE TBS_STAGING
TEMPORARY TABLESPACE TEMP;
--権限付与 (検証のためなので最大限の権限を付与しておく)
GRANT DBA TO PRODUCTION;
GRANT DBA TO STAGING;
GRANT UNLIMITED TABLESPACE TO PRODUCTION;
GRANT UNLIMITED TABLESPACE TO STAGING;
--検証用テーブル作成
CREATE TABLE PRODUCTION.TABLEA ( id number(10), note varchar2(100) );
CREATE TABLE STAGING.TABLEA ( id number(10), note varchar2(100) );
--検証用データ投入
INSERT INTO PRODUCTION.TABLEA (ID, NOTE) VALUES (1, 'Production');
INSERT INTO PRODUCTION.TABLEA (ID, NOTE) VALUES (2, 'Production');
INSERT INTO PRODUCTION.TABLEA (ID, NOTE) VALUES (3, 'Production');
INSERT INTO STAGING.TABLEA (ID, NOTE) VALUES (1, 'Staging');
INSERT INTO STAGING.TABLEA (ID, NOTE) VALUES (2, 'Staging');
INSERT INTO STAGING.TABLEA (ID, NOTE) VALUES (3, 'Staging');
--エクスポート用のディレクトリオブジェクト作成
CREATE DIRECTORY EXPDIR AS 'C:\oracle_dmp';
確認
オブジェクトが作成されたこと、テーブルの中身を確認しておく。
select owner, table_name, tablespace_name from dba_tables where owner in ('PRODUCTION', 'STAGING');
OWNER TABLE_NAME TABLESPACE_NAME
---------- -------------------- ------------------------------
STAGING TABLEA TBS_STAGING
PRODUCTION TABLEA TBS_PRODUCTION
select * from PRODUCTION.TABLEA;
ID NOTE
---------- ------------------------------
1 Production
2 Production
3 Production
select * from STAGING.TABLEA;
ID NOTE
---------- ------------------------------
1 Staging
2 Staging
3 Staging
エクスポート
--エクスポート1 対象:フル
EXPDP SYSTEM/パスワード
directory=expdir
dumpfile=full.dmp
logfile=full.log
reuse_dumpfiles=yes
full=y
⇒ProductionやStagingのほか、その他スキーマもエクスポートされます。
--エクスポート2 対象:Production
EXPDP SYSTEM/Password01
directory=expdir
dumpfile=production.dmp
logfile=production.log
reuse_dumpfiles=yes
schemas=production
⇒Productionスキーマのみエクスポートされます。
エクスポート後の処理
ダンプファイルからインポートを行う際に、データが変更されたかどうか確認するため、TableAにレコードを追加します。また、StagingスキーマをDROPします。
--エクスポート後のレコード追加
INSERT INTO PRODUCTION.TABLEA (ID, NOTE) VALUES (4, 'Production');
INSERT INTO PRODUCTION.TABLEA (ID, NOTE) VALUES (5, 'Production');
INSERT INTO STAGING.TABLEA (ID, NOTE) VALUES (4, 'Staging');
INSERT INTO STAGING.TABLEA (ID, NOTE) VALUES (5, 'Staging');
--StagingスキーマのDROP
DROP USER STAGING CASCADE;
検証1 Fullのインポート、Stagingスキーマ指定(失敗)
コマンド
IMPDP SYSTEM/パスワード
directory=expdir
dumpfile=full.dmp
logfile=impdp_test1.log
schemas=staging
remap_schema=production:staging
remap_tablespace=tbs_production:tbs_staging
インポート結果
Import: Release 12.1.0.2.0 - Production on x xx月 xx xx:xx:xx xxxx
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
マスター表"SYSTEM"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
SYSTEM."SYS_IMPORT_SCHEMA_01"を起動しています: SYSTEM/******** directory=expdir dumpfile=full.dmp logfile=impdp_test1.log schemas=staging remap_schema=production:staging remap_tablespace=tbs_production:tbs_staging
オブジェクト型DATABASE_EXPORT/SCHEMA/USERの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/GRANT/SYSTEM_GRANTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/ROLE_GRANTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/DEFAULT_ROLEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/TABLEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATAの処理中です
. . "STAGING"."TABLEA" 5.570 KB 3行がインポートされました
ジョブ"SYSTEM"."SYS_IMPORT_SCHEMA_01"がx xx月 xx xx:xx:xx xxx elapsed 0 00:00:01で正常に完了しました
結果確認
インポート時にスキーマ、表領域はStagingにリマップできたが、Staging.TableAの内容がもともとStaging環境のものがインポートされてしまった。(失敗)
select owner, table_name, tablespace_name from dba_tables where owner in ('PRODUCTION', 'STAGING');
OWNER TABLE_NAME TABLESPACE_NAME
---------- -------------------- ------------------------------
PRODUCTION TABLEA TBS_PRODUCTION
STAGING TABLEA TBS_STAGING
select * from STAGING.TABLEA;
ID NOTE
---------- ------------------------------
1 Staging
2 Staging
3 Staging
検証2 Fullのインポート、Productionスキーマ指定(成功)
コマンド
IMPDP SYSTEM/パスワード
directory=expdir
dumpfile=full.dmp
logfile=impdp_test2.log
schemas=production
remap_schema=production:staging
remap_tablespace=tbs_production:tbs_staging
インポート結果
Import: Release 12.1.0.2.0 - Production on x xx月 xx xx:xx:xx xxxx
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
マスター表"SYSTEM"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
SYSTEM."SYS_IMPORT_SCHEMA_01"を起動しています: SYSTEM/******** directory=expdir dumpfile=full.dmp logfile=impdp_test2.log schemas=production remap_schema=production:staging remap_tablespace=tbs_production:tbs_staging EXCLUDE=STATISTICS
オブジェクト型DATABASE_EXPORT/SCHEMA/USERの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/GRANT/SYSTEM_GRANTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/ROLE_GRANTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/DEFAULT_ROLEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/TABLEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATAの処理中です
. . "STAGING"."TABLEA" 5.578 KB 3行がインポートされました
ジョブ"SYSTEM"."SYS_IMPORT_SCHEMA_01"がx xx月 xx xx:xx:xx xxxx elapsed 0 00:00:01で正常に完了しました
結果確認
インポート時にスキーマ、表領域はStagingにリマップできており、Staging.TableAの内容がもともとProduction環境のものがインポートできた。また、Production.TableAはダンプファイルから上書きされることなく5行レコードが入っている。
select owner, table_name, tablespace_name from dba_tables where owner in ('PRODUCTION', 'STAGING');
OWNER TABLE_NAME TABLESPACE_NAME
---------- -------------------- ------------------------------
PRODUCTION TABLEA TBS_PRODUCTION
STAGING TABLEA TBS_STAGING
select * from STAGING.TABLEA;
ID NOTE
---------- ------------------------------
1 Production
2 Production
3 Production
select * from PRODUCTION.TABLEA;
ID NOTE
---------- ------------------------------
1 Production
2 Production
3 Production
4 Production
4 Production