業務でシステムを納品する際にコンティンジェンシープランとして行った時のメモです。
⑴コマンドプロンプトでSqlPlusにログイン。あらかじめ設定ファイルを作成しておき、その設定ファイルのディレクトリ上で下記のようにログインすると、設定ファイル通りに動作させることができる。
Sqlplus UserID/Password@接続識別子 @sql設定ファイル.sql
⑵本番環境がDBにスキーマが1つしかない状態だったので、スキーマを指定してデータをエクスポート(バックアップ)
これでディレクトリオブジェクトに指定されているフォルダ配下にdmpファイルとlogファイルが作成される。
expdp UserID/Password directory=ディレクトリオブジェクト schemas=hirosato logfile = hirosato_expdp.log
⑶リカバリを実行したい時
⑵でエクスポートしたdmpファイルをインポートする。ただし前のデータが残っている場合を想定しているので、table_exists_action = replaceを指定する。これによりテーブル自体を一度削除してからインポートすることができる。前のデータが残っている状態だと正しくインポートできない。
impdp UserID/Password directory=ディレクトリオブジェクト table_exists_action = replace logfile = hirosato_impdp.log
table_exists_action = replaceではテーブルを削除できても、ビューやパッケージなどのオブジェクトは削除できない。それらのオブジェクトを削除するコマンドは現在impdpにはないので、きちんとリカバリを実行するのならば、ビューやパッケージを削除するdrop文を作るかスキーマ自体を一度削除してからimpdpするしかない。
*本番環境にスキーマが1つしかない状態だったのでimpdpのスキーマ単位でデータを入れ替えるremap_schemaが使用できなかった。もちろん本番環境でスキーマ自体をdropさせてからインポートさせるわけにもいかなかった。Oracleさんには早くimpdpにオブジェクト削除機能をつけてほしい。