Oracleエラー対応(ORA-31684):import/impdp時で発生するORA-31684について

現役DBAが解説 ~Oracleエラー対応~

エラーメッセージ

ORA-31684: オブジェクト型CONSTRAINT:"OWNER"."SYS_C0017376"はすでに存在します

原因

インポートするデータベースに同名のオブジェクトが存在している場合にORA-31684が発生します。

解決策

すでに同名の表が存在する場合は、オプション「TABLE_EXISTS_ACTION=REPLACE」で既存の表を削除した後、ダンプファイルから表の定義と行をインポートできます。

例: impdpコマンド

IMPDP SYSTEM DIRECTORY=DUMP_DIR FULL=Y TABLE_EXISTS_ACTION=REPLACE DUMPFILE=FI
LE.DMP LOGFILE=LOGFILE.LOG

※TABLE_EXISTS_ACTIONには以下を指定することができます

SKIP 既に同名の表が存在する場合、何も行わず次のオブジェクトに移動します。
APPEND  既存の表に対してダンプファイルに含まれる行を追加でロードします。
TRUNCATE 既存の行を全て削除して、ダンプファイルから行をロードします。
REPLACE 既存の表を削除して、ダンプファイルから表の定義と行をロードします。

表以外の制約などでORA-31684が発生した場合、原因の一つとして制約名を指定しないで制約が作成された可能性があります。この場合、ORACLEがデフォルトで名前を決定するため、偶然一致する名前の既存オブジェクトが存在しているとORA-31684が起こります。
※ORACLEがデフォルトで決めるオブジェクト名はSYS_*****です。

この場合、下記の手順で、ダンプファイルからSQL(DDL)を抜き出し、目的のオブジェクト名部分を手動で修正し、個別にインポートすることで解決できます。

1.ダンプファイルからSQL(DDL)を抽出

例: ダンプファイルからSQL(DDL)を作成

IMPDP SYSTEM DIRECTORY=DUMP_DIR LOGFILE=LOGFILE.LOG FULL=Y SQLFILE=SQL_DDL.SQL

2.抽出したSQLファイルから目的のDDLを抜き出す

Linuxならmoreやlessコマンドで目的のDDLを抜き出して編集できますし、viで直接編集しても良いです。Windowsであればサクラエディタや秀丸で編集できます。

3.編集したDDLを実行

SQL*PlusやObject Browserなどでデータベースに接続し、編集したDDLを実行します。
※接続するユーザは、目的のオブジェクトがあるスキーマに対するCREATE権限を持っている必要があります。