読者です 読者をやめる 読者になる 読者になる

マスター表を削除したときに対のジョブも削除される

ORACLE

JPOUGのイベントでも話した内容ですが、データポンプが処理中に何かしらの異常を起こしたりすると、実行ユーザのスキーマの中にマスター表が残存してしまいます。
さらにそのマスター表を作成したジョブ(マスター表と同名)がDBA_DATAPUMP_JOBS(ユーザ単位だとUSER_DATAPUMP_JOBS)にも残存してしまいます。

残存してしまうとどこかのタイミングで明示的に削除してあげる必要があります(方法はKROWNに記載されています)

で、このマスター表とデータポンプジョブの関係なのですが、私が試した範囲では、マスター表を削除すると、対になるデータポンプジョブも必ず削除されるので「マスター表だけが残存する、あるいは、データポンプジョブだけが残存するような状況」が再現できなくて困っているという話です。

とりいそぎ今回はマスター表をdropしてデータポンプジョブが削除された後にマスター表だけ FLASHBACK TABLE 〜 TO BEFORE DROP したらマスター表だけ復活してくれないかな、と思い試してみました。

(1) recyclebinを有効化する

SQL> ALTER SESSION SET recyclebin = ON;

(2) 残存するマスター表とデータポンプジョブを確認する

SQL> select table_name from user_tables where table_name='SYS_EXPORT_TABLE_01';

TABLE_NAME
-------------------
SYS_EXPORT_TABLE_01


SQL> select JOB_NAME,STATE from user_datapump_jobs where JOB_NAME='SYS_EXPORT_TABLE_01';

JOB_NAME            STATE
------------------- -----------
SYS_EXPORT_TABLE_01 NOT RUNNING

(3) マスター表をDROPする

SQL> drop table SYS_EXPORT_TABLE_01;

表が削除されました。

(4) マスター表とデータポンプジョブが削除されたか確認する

SQL> SELECT OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE FROM RECYCLEBIN;

OBJECT_NAME                    ORIGINAL_NAME             OPERATION TYPE     
------------------------------ ------------------------- --------- ---------
SYS_IL0000115508C00045$$       SYS_IL0000115508C00045$$  DROP      LOB INDEX
SYS_LOB0000115508C00045$$      SYS_LOB0000115508C00045$$ DROP      LOB      
BIN$x+X7iNV2h/ngQKjAZTgasg==$0 SYS_EXPORT_TABLE_01       DROP      TABLE    

SQL> select table_name from user_tables where table_name='SYS_EXPORT_TABLE_01';

レコードが選択されませんでした。

SQL> select JOB_NAME,STATE from user_datapump_jobs where JOB_NAME='SYS_EXPORT_TABLE_01';

レコードが選択されませんでした。

(5) マスター表を元に戻す

SQL> FLASHBACK TABLE SYS_EXPORT_TABLE_01 TO BEFORE DROP;

フラッシュバックが完了しました。

(6) ゴミ箱の中身とマスター表とデータポンプジョブを確認する

SQL> SELECT * FROM RECYCLEBIN;

レコードが選択されませんでした。

SQL> select table_name from user_tables where table_name='SYS_EXPORT_TABLE_01';

TABLE_NAME
------------------------------
SYS_EXPORT_TABLE_01

SQL> select JOB_NAME,STATE from user_datapump_jobs where JOB_NAME='SYS_EXPORT_TABLE_01';

JOB_NAME                       STATE
------------------------------ ------------------------------
SYS_EXPORT_TABLE_01            NOT RUNNING

うーん、残念。
マスター表をフラッシュバックするとデータポンプジョブまで復活しちゃう。

ここらへんの内部動作仕様を説明できる方がいらっしゃればご一報いただきたく存じます。