Data Pumpジョブの失敗
Data Pumpは、実行時に接続ユーザー(useridパラメーター)のスキーマにジョブの状況を管理するテーブルを作成します。一般的に知られているテーブル名は、DBA_DATAPUMP_JOBSビューのJOB_NAME列と同じ名前のテーブルです。自動作成されるテーブル名はData Pump実行時のパラメーターによって変化しますが、SYS_EXPORT_SCHEMA_01やSYS_IMPORT_FULL_01等になります。
Data Pumpジョブの後始末
Data Pumpジョブを強制的に止めた場合、ジョブ名がDBA_DATAPUMP_JOBSビューに残ることがあります。ジョブを削除するために、同一名称のテーブルを削除することでData Pumpジョブのクリーンアップを行います。
SQL> SELECT OWNER_NAME, JOB_NAME FROM DBA_DATAPUMP_JOBS;
OWNER_NAME JOB_NAME
------------ -----------------------
APLUSER SYS_IMPORT_SCHEMA_01
SQL> DROP TABLE APLUSER.SYS_IMPORT_SCHEMA_01;
表が削除されました。
次にジョブ名以外のテーブルも作成される現象を説明しています。
ある日から統計情報を取得する DBMS_STATS.GATHER_SCHEMA_STATS プロシージャがが失敗するようになりました。
SQL> BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS (
ownname => 'APLUSER',
options => 'GATHER',
estimate_percent => 15,
cascade => TRUE
);
END;
/
BEGIN
*
行1でエラーが発生しました。
ORA-20000: Statistics collection failed for 2 objects in the schema
ORA-06512: "SYS.DBMS_STATS", 行38928
ORA-06512: "SYS.DBMS_STATS", 行38257
ORA-06512: "SYS.DBMS_STATS", 行38225
ORA-06512: "SYS.DBMS_STATS", 行38285
ORA-06512: 行2
失敗するオブジェクトを探していると、ET$で始まる見慣れないテーブルを見つけました。
SQL> SELECT TABLE_NAME, LAST_ANALYZED FROM USER_TABLES ORDER BY 2;
TABLE_NAME LAST_ANA
------------------------------ ---------
TABLE_A 18-02-20
...
ET$001910FB0001
ET$0019836D0001
200行が選択されました。
このテーブルに対して統計情報を取得すると、Data Pumpが自動作成するテーブルらしいということがわかりました。
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('APLUSER', 'ET$001910FB0001');
BEGIN DBMS_STATS.GATHER_TABLE_STATS('APLUSER', 'ET$001910FB0001'); END;
*
行1でエラーが発生しました。
ORA-20011: Approximate NDV failed: ORA-29913:
OCIEXTTABLEOPENコールアウトの実行中にエラーが発生しました。KUP-11024:
この外部表は、データ・ポンプ・ジョブ内からのみアクセスできます。ORA-06512: "SYS.DBMS_STATS",
行36873
ORA-06512: "SYS.DBMS_STATS", 行36507
ORA-06512: "SYS.DBMS_STATS", 行35428
ORA-06512: "SYS.DBMS_STATS", 行33883
ORA-06512: "SYS.DBMS_STATS", 行32254
ORA-06512: "SYS.DBMS_STATS", 行32234
ORA-06512: "SYS.DBMS_STATS", 行33472
ORA-06512: "SYS.DBMS_STATS", 行35304
ORA-06512: "SYS.DBMS_STATS", 行36230
ORA-06512: "SYS.DBMS_STATS", 行36716
ORA-06512: 行1
このため該当テーブルを削除するとDBMS_STATSジョブが正常に稼働するようになりました。