このブログを検索

2011年2月20日日曜日

Data Pumpによる過去分データをインポートする

今担当している案件では頻繁に過去データの調査があるため、ときどきバックアップから開発DBにインポートしています。
インポートにはData Pumpを使っています。
Recovery Managerではない理由は次の通り。
・インポート先(開発DB)の容量不足でエクスポートデータを置けない
・サーバ間マテリアライズドビューが多数あるので、テーブルとインデックス以外をリカバリしたくない
・週次でRMANフルバックアップという運用をしているため、リカバリがめんどうw
1.はじめに
Oracleには2種類のエクスポート/インポートコマンドがあります。
Data Pumpを使っている理由は、速度とスキーマ変更機能です。
2.作業の流れ
ここでは、マテビューのマスタ側サーバのエクスポートデータをインポートします。
そのままインポートするとマテビューログや統計情報も含まれるので、次の流れで 行います。
(1)バックアップサーバからエクスポートデータをコピー
(2)DDLの抽出ディレクトリの確認
(3)エクスポートデータからDDLだけをファイル出力
(4)DDLファイルを編集し、テーブルおよびインデックス以外を削除
(5)編集したDDLを実行してcreate table|index
(6)エクスポートデータからレコードデータのみをインポート
(7)analyze
(1)バックアップサーバからエクスポートデータをコピー
エクスポートデータのコピー例
$ ssh sssdev1
$ /backup/databasefile/201008/sssdb3/
$ scp sss01_db_i_dp20100820.dmp.gz  oracle@sssdb11:/usr/local/dbdata/
(2)DDLの抽出ディレクトリの確認
ディレクトリ設定がされているか確認します。
ここではEXPDP_DATAを使います。
select * from dba_directories;
OWNER      DIRECTORY_NAME            DIRECTORY_PATH
---------- ------------------------- ---------------------------------------------
SYS        ORACLE_OCM_CONFIG_DIR     /opt/app/oracle/product/10.2.0/db/ccr/state
SYS        DATA_PUMP_DIR             /opt/app/oracle/product/10.2.0/db/rdbms/log/
SYS        EXPDP_DATA                /usr/local/dbdata
(3)エクスポートデータからDDLだけをファイル出力
本番システムで使っていないスキーマにインポートしたい時はremap_schemaが非常に便利です。
remap_tableの方が便利ですが、たしか11gからだったと思います。
ここではtestdocomoという調査用に作ったスキーマに変換します。
$ vi testdocomo.par1_0820 
directory=expdp_data
dumpfile=sss01_db_i_dp20100820.dmp   ★エクスポートしたデータ
logfile=sss01_db_i_sql20100820.log
job_name=job_impdp
sqlfile=sss01_db_i_20100820.sql   ★DDLのファイル出力
remap_schema=sss01docomo:testdocomo   ★別スキーマにも変換可能
remap_tablespace=sss01_i_data:test_i_data   ★別表領域にも変換可能
remap_tablespace=sss01_i_idx:test_i_idx
remap_tablespace=mvlog_i_data:test_i_data
INCLUDE=TABLE:"IN ('T_ACCESS1','T_USER1')"   ★テーブル指定も可能

$ impdp testdocomo/xxxxxxxxxxxx parfile=testdocomo.par1_0820 
(4)DDLファイルを編集し、テーブルおよびインデックス以外を削除
TABLE, INDEX, CONSTRAINT以外を削除します。
特に、マテビューログのSYS用DDLは、元のスキーマ名で設定するので注意。
また、ビットマップインデックスは、通常のインデックスとは別項目で出力することも注意。
$ grep "^-- new obj" sss01_db_i_20100902.sql 
-- new object type path is: SCHEMA_EXPORT/TABLE/TABLE
-- new object type path is: SCHEMA_EXPORT/TABLE/INDEX/INDEX
-- new object type path is: SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
-- new object type path is: SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
-- new object type path is: SCHEMA_EXPORT/TABLE/COMMENT
-- new object type path is: SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
-- new object type path is: SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS
-- new object type path is: SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
-- new object type path is: SCHEMA_EXPORT/TABLE/POST_TABLE_ACTION
-- new object type path is: SCHEMA_EXPORT/TABLE/MATERIALIZED_VIEW_LOG
(5)編集したDDLを実行してcreate table|index
テーブルおよびインデックス作成例
$ sqlplus testdocomo/xxxxxxxxxxxx
SQL> @sss01_db_i_20100820.sql
(6)エクスポートデータからレコードデータのみをインポート
レコードデータのインポート例
$ cat testdocomo.par2_0820 
directory=expdp_data
dumpfile=sss01_db_i_dp20100820.dmp
logfile=sss01_db_i_sql20100820.log
job_name=job_impdp
remap_schema=sss01docomo:testdocomo
remap_tablespace=sss01_i_data:test_i_data
remap_tablespace=sss01_i_idx:test_i_idx
remap_tablespace=mvlog_i_data:test_i_data
CONTENT=DATA_ONLY   ★レコードデータのみを指定
INCLUDE=TABLE:"IN ('T_ACCESS1','T_USER1')"   ★テーブル指定も可能

$ impdp testdocomo/xxxxxxxxxxxx parfile=testdocomo.par2_0820 
(7)analyze
データ量が多いときはやった方が精神衛生上よいです。
analyze table TBL_SG1_0820 compute statistics;   ★インデックスもanalyze

0 件のコメント:

コメントを投稿