Oracle IMPDP 本番スキーマのデータをRemapしてテストスキーマにインポートさせるコマンド

Oracle Database

概要

以下の様な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