こんにちは。
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を実行できるようになります。
コメント