OracleでData Pump Import(impdp
)を使って特定のテーブルだけをリストアしたい場合、既存のデータやテーブル構造を壊さずに安全に復元するには注意が必要です。本記事では、テーブル単位でのリストア時に既存データを保護する方法と、トラブルを避けるための実践的なテクニックを紹介します。
基本:impdpで既存テーブルがある場合の挙動
impdp
コマンドで既存のテーブルに対してインポートを実行した場合、特に設定がなければデフォルト動作としてスキップされます。これはData Pumpのtable_exists_action
パラメータによって制御できます。
既存テーブルの扱いを制御するオプション
オプション | 動作内容 |
---|---|
SKIP | テーブルが存在する場合は何もしない(デフォルト) |
APPEND | 既存データに対して追加で挿入 |
REPLACE | 既存テーブルを削除して再作成(データと構造が失われる) |
TRUNCATE | テーブルのデータを削除して再挿入(構造は保持) |
安全策①:REMAP_TABLEで別名テーブルにリストア
最も安全な方法は、元のテーブルとは別名でインポートすることです。これにより、既存データに一切手を加えず、データの比較や検証が可能になります。
impdp scott/tiger directory=DATA_PUMP_DIR dumpfile=emp_backup.dmp logfile=emp_restore.log tables=emp remap_table=emp:emp_restore
このコマンドでは、ダンプ内のemp
テーブルをemp_restore
という名前でインポートします。
安全策②:事前に既存データをバックアップ(CREATE TABLE AS)
どうしても同名のテーブルにインポートしなければならない場合は、事前に既存データをコピーしておくことで保護できます。
CREATE TABLE emp_backup AS SELECT * FROM emp;
その後、table_exists_action=replace
や truncate
を使って上書きしても、元のデータは別テーブルとして残ります。
安全策③:データのみインポートする(content=data_only)
テーブル構造はそのままに、データだけをインポートしたい場合は content=data_only
オプションを使います。
impdp scott/tiger directory=DATA_PUMP_DIR dumpfile=emp_backup.dmp logfile=imp.log tables=emp content=data_only table_exists_action=append
append
と組み合わせることで、既存データに追加挿入する形式でインポートできます。
事前チェック:REPORT OBSOLETEとログの確認
本格的にリストアを実行する前に、対象となるテーブルやファイルの状態を事前に確認しましょう。Data Pumpではlogfile
で詳細が出力されるため、エラーや衝突がないか確認することが重要です。
まとめ
Oracleでテーブル単位のリストアを安全に行うには、既存テーブルへの影響を回避する戦略が欠かせません。remap_table
での別名リストアや、事前バックアップ、table_exists_action
の活用により、データの上書きや損失を防ぐことができます。
本番環境へのリストア時には、必ず事前検証を行い、安全な手順で慎重に操作を進めましょう。