Oracel DBA_DATAPUMP_JOBSの強制終了の仕方

こんにちは。

DBA_DATAPUMP_JOBSの強制終了の仕方で困ったので2パターンの方法お伝えしたいと思います。1パターン目は色々なサイトに載っていたのですが、出来なかったので2パターン目も記載します。

DBA_DATAPUMP_JOBSの強制終了までの経緯

Oracleでデータポンプでインポートしていた時に、表領域が不足して止まってしまいました。

Oracle Error
ORA-39171: ジョブは再開可能な状態で待機中です。
ORA-01659: 1を超えるMINEXTENTSを表領域XXXXXに割当てできません。

「ジョブは再開可能な状態で待機中」とあるし、表領域を追加したら、自動で始まると思ったのですが、始まらなかったのでまず再開させようと思い「①ジョブ確認方法」にてジョブ名を取得し、start_jobしてみました。

①ジョブ確認方法(SQL*Plus)

sqlplus / as sysdba
SQL> set linesize 200
SQL> col owner_name for a10
SQL> col job_name for a20
SQL> col operation for a10
SQL> col job_mode for a10
SQL> col state for a12
SQL> col degree for 999
SQL> col attached_sessions for 999
SQL> col datapump_sessions for 999
SQL> select * from dba_datapump_jobs;

②ジョブ停止(上のSQL*Plusはexit)

impdp user/pass@database attach=SYS_IMPORT_FULL_01
Import> stop_job
Are you sure you wish to stop this job ([yes]/no): yes

③ジョブ再開

impdp user/pass@database attach=SYS_IMPORT_FULL_01
Import> start_job

と、こうなるはずだったんですけど、「Import>」が出てこず

Oracle Error
ORA-39097: データ・ポンプ・ジョブで予期しないエラー-1427が見つかりました
ORA-39065: DISPATCHでマスター・プロセスの予期しない例外が発生しました
ORA-01427: 単一行副問合せにより2つ以上の行が戻されます

というエラーになり、①ジョブ確認方法で見ると、ジョブも残ったままなので、強制終了する方法を探しました。

方法1:DBA_DATAPUMP_JOBSを強制終了

一般的にはこれで強制終了するらしいです。上記エラーで出来ませんでしたが。。

impdp user/pass@database attach=SYS_IMPORT_FULL_01
Import>  kill_job
Are you sure you wish to stop this job ([yes]/no): yes

方法2:SQLパッケージからDBA_DATAPUMP_JOBSを中断して強制終了

DECLARE
v1 NUMBER;
BEGIN
v1:=DBMS_DATAPUMP.ATTACH('SYS_IMPORT_FULL_01','SYS');
DBMS_DATAPUMP.STOP_JOB (v1,1,0);
END;
/

DBA_DATAPUMP_JOBSをクリーンアップ

もう一度ジョブを確認したところ、まだ残っていました。

sqlplus / as sysdba
SQL> set linesize 200
SQL> col owner_name for a10
SQL> col job_name for a20
SQL> col operation for a10
SQL> col job_mode for a10
SQL> col state for a12
SQL> col degree for 999
SQL> col attached_sessions for 999
SQL> col datapump_sessions for 999
SQL> select * from dba_datapump_jobs;

OWNER_NAME JOB_NAME             OPERATION  JOB_MODE   STATE        DEGREE ATTACHED_SESSIONS DATAPUMP_SESSIONS
---------- -------------------- ---------- ---------- ------------ ------ ----------------- -----------------
XXXXX      SYS_IMPORT_FULL_01   IMPORT     FULL       NOT RUNNING       0          0                 0

state=’NOT RUNNING’ かつ attached_sessions=0なので、マスタテーブルを削除します。

SQL> set head off
SQL> SELECT 'drop table ' || owner_name || '.' || job_name || ';' FROM dba_datap
ump_jobs WHERE state='NOT RUNNING' and attached_sessions=0;
drop table XXXXX.SYS_IMPORT_FULL_01;

SQL> drop table XXXXX.SYS_IMPORT_FULL_01;
表が削除されました。

これでもう一度ジョブを確認して、先ほどのレコードが無い事が確認出来たら終了です。これで同じジョブ名でDBA_DATAPUMP_JOBSを実行できるようになります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)