質問: Oracle11Gを使用しています。 ある大量にデータのあるテーブルに対して、Impdpを実行したいのですが、不安があるので質問します。 このテーブルはほぼ1日中INSERT、UPDATEを実行され、追加・更新されています。 このテーブルに、大量のデータをImpdpでインポートしたいのです。 質問は、Impdpでインポートしている最中に、他のプロセスからトランザクションを開始し、INSERTやUPDATEを実行しても、問題ないのでしょうか? 主キーが重複する事は無いようにしているので、インポートに失敗する事は無いと思います。 試しに、Impdpでインポート中にSQLPlusからINSERT文を実行してみたのですが、一応実行は出来るみたいです。 しかし、他のプロセスからはトランザクションを使って色々と複雑な処理を実行しているので、トランザクションのコミット、ロールバックまでちゃんと保証されるのだろうか、というと自信がもてません。 こちらのページで、トランザクションというキーワードで検索しましたが、REMAP_DATAというオプションの項目に簡単な説明があるだけで、よくわかりませんでした。 https://docs.oracle.com/cd/E49329_01/server.121/b71303/dp_import.htm Impdpを実行中に、他のプロセスからのトランザクションを使う事は可能なのでしょうか?保証されるのでしょうか? 出来れば根拠つきでお願いしたいです。
回答: せっかくなので検証してみました。 対象のテーブルを、EMPテーブルとします。 他の端末からSQL Developerを使用して以下のようなSQLを実行しました。 > > SELECT * FROM EMP for update > > > この状態で、DBサーバ上で以下のようにimpdpを実行しました。 $ impdp user_id/pass directory=TMP_DIR tables=EMP DUMPFILE=EMP.dmp LOGFILE=EMP_LOG table_exists_action=append > > "SAMPLE_USER"."SYS_IMPORT_TABLE_01"を起動しています: user_id/******** directory=TMP_DIR tables=EMP DUMPFILE=EMP.dmp LOGFILE=EMP_LOG table_exists_action=append > > オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です > > > この状態で止まりました。 SQL Developer側をロールバックした所、処理が継続しました。 ちなみに、SQL Developer側で、以下のような行ロックにしても、同様でした。 (EMPテーブルにEMP_IDが1のレコードがあること、インポートするデータにEMP_IDが1のレコードが無い事が前提です) > > SELECT * FROM EMP WHERE EMP_ID = 1 ; > > > 多分ですけど、impdpはテーブル全体をロックする必要があり、待機しているのだろうと思われます。 ちなみにimpdpのtable_exists_actionをtruncateにして同じような実験をすると、即座にエラーとなりました。 truncateの処理が失敗したからだと思われます。 簡単ですが以上です。