こんにちは。
DBA_DATAPUMP_JOBSの強制終了の仕方で困ったので2パターンの方法お伝えしたいと思います。1パターン目は色々なサイトに載っていたのですが、出来なかったので2パターン目も記載します。
DBA_DATAPUMP_JOBSの強制終了までの経緯
Oracleでデータポンプでインポートしていた時に、表領域が不足して止まってしまいました。
Oracle Error ORA-39171: ジョブは再開可能な状態で待機中です。 ORA-01659: 1を超えるMINEXTENTSを表領域XXXXXに割当てできません。
「ジョブは再開可能な状態で待機中」とあるし、表領域を追加したら、自動で始まると思ったのですが、始まらなかったのでまず再開させようと思い「①ジョブ確認方法」にてジョブ名を取得し、start_jobしてみました。
①ジョブ確認方法(SQL*Plus)
1
2
3
4
5
6
7
8
9
10
11
| 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)
1
2
3
| impdp user/pass@database attach=SYS_IMPORT_FULL_01
Import> stop_job
Are you sure you wish to stop this job ([yes]/no): yes
|
③ジョブ再開
1
2
| 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を強制終了
一般的にはこれで強制終了するらしいです。上記エラーで出来ませんでしたが。。
1
2
3
| 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を中断して強制終了
1
2
3
4
5
6
7
| DECLARE
v1 NUMBER;
BEGIN
v1:=DBMS_DATAPUMP.ATTACH('SYS_IMPORT_FULL_01','SYS');
DBMS_DATAPUMP.STOP_JOB (v1,1,0);
END;
/
|
DBA_DATAPUMP_JOBSをクリーンアップ
もう一度ジョブを確認したところ、まだ残っていました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 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なので、マスタテーブルを削除します。
1
2
3
4
5
6
7
| 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を実行できるようになります。