【Oracle】テーブル単位でリストアする際に既存データを保護する方法

【Oracle】テーブル単位でリストアする際に既存データを保護する方法 Oracle

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=replacetruncate を使って上書きしても、元のデータは別テーブルとして残ります。

安全策③:データのみインポートする(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の活用により、データの上書きや損失を防ぐことができます。

本番環境へのリストア時には、必ず事前検証を行い、安全な手順で慎重に操作を進めましょう。