【Oracle】Data Pump ジョブの一時停止・再開・強制停止|attach・STOP_JOB・KILL_JOB・残存ジョブのクリーンアップまで解説

【Oracle】Data Pump ジョブの一時停止・再開・強制停止|attach・STOP_JOB・KILL_JOB・残存ジョブのクリーンアップまで解説 Oracle

Data Pump(expdp / impdp)の実行中に「負荷が高すぎるので一時停止したい」「ターミナルが切断されたが再接続したい」「不要なジョブを強制停止したい」といった場面は頻繁にあります。

Data Pump にはジョブの一時停止・再開・強制停止機能が組み込まれており、attach で実行中のジョブに接続して対話モードで操作できます。本記事では、attach の使い方対話モードの全コマンドSTOP_JOB / KILL_JOB の違い残存ジョブのクリーンアップまで解説します。

この記事でわかること
・attach で実行中の Data Pump ジョブに接続する方法
・対話モードの全コマンド一覧(STOP/START/KILL/STATUS/PARALLEL 等)
・STOP_JOB と KILL_JOB の違い(再開可能 vs 強制終了)
・Ctrl+C の動作(ジョブは停止せず対話モードに切り替わる)
・ターミナル切断後にジョブに再接続する方法
・残存ジョブの確認と強制クリーンアップ(DBA_DATAPUMP_JOBS)
・job_name の命名規則と指定方法
スポンサーリンク

job_name でジョブに名前を付ける

Data Pump ジョブにはデフォルトで SYS_EXPORT_SCHEMA_01 のような名前が付きますが、job_name パラメータで任意の名前を指定できます。attach 時にジョブを識別しやすくするため、常に job_name を指定することを推奨します。

Shell(job_name の指定)
# ジョブ名を指定してエクスポート
expdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_export_%U.dmp \
    logfile=hr_export.log \
    schemas=HR \
    parallel=4 \
    job_name=HR_DAILY_EXPORT

# ジョブ名を指定してインポート
impdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_export_%U.dmp \
    logfile=hr_import.log \
    schemas=HR \
    job_name=HR_DAILY_IMPORT

attach で実行中のジョブに接続する

Shell(attach の基本)
# ジョブ名を指定して接続
expdp hr/password attach=HR_DAILY_EXPORT

# impdp ジョブの場合
impdp hr/password attach=HR_DAILY_IMPORT

# ジョブ名がわからない場合: DBA_DATAPUMP_JOBS で確認してから接続
expdp hr/password attach=SYS_EXPORT_SCHEMA_01
SQL(実行中のジョブ名を確認)
-- Data Pump ジョブの一覧
SELECT owner_name, job_name, operation, job_mode,
       state, degree, attached_sessions
FROM dba_datapump_jobs
WHERE state <> 'NOT RUNNING'
ORDER BY owner_name;

-- state の値:
-- EXECUTING:   実行中
-- NOT RUNNING: 停止中(STOP_JOB で停止 / 完了)
-- DEFINING:    定義中
-- IDLING:      アイドル
attach は「ジョブを停止させない」接続
attach で接続しても実行中のジョブは中断されません。対話モードに入るだけで、ジョブはバックグラウンドで動き続けます。進捗確認だけなら何の影響もありません。

対話モードの全コマンド一覧

コマンド 動作 再開
STATUS 現在の進捗を表示
STATUS=N N 秒ごとに進捗を自動表示
STOP_JOB ジョブを一時停止(ワーカーを安全に停止) 可能(START_JOB で再開)
STOP_JOB=IMMEDIATE ジョブを即時停止(現在のブロックで中断) 可能
START_JOB 停止したジョブを再開
KILL_JOB ジョブを強制終了 不可(ダンプは不完全)
PARALLEL=N ワーカー数を動的に変更
ADD_FILE ダンプファイルを追加
CONTINUE_CLIENT 対話モードを終了してログ表示に戻る
EXIT_CLIENT 対話モードを終了(ジョブはバックグラウンドで継続)
HELP コマンド一覧を表示

ジョブの一時停止と再開

Shell(一時停止 → 再開の流れ)
# (1) 実行中のジョブに接続
expdp hr/password attach=HR_DAILY_EXPORT

# (2) 対話モードで一時停止
Export> STOP_JOB
Are you sure you wish to stop this job ([yes]/no): yes
# ワーカーが安全に停止するまで少し時間がかかる

# (3) ターミナルを閉じても OK(ジョブは停止状態で保持される)

# (4) 後日、再接続して再開
expdp hr/password attach=HR_DAILY_EXPORT
Export> START_JOB
# ジョブが停止した位置から再開される
Shell(即時停止: STOP_JOB=IMMEDIATE)
# 通常の STOP_JOB はワーカーが現在の処理を完了するまで待つ
# IMMEDIATE は現在のブロックで即座に中断
Export> STOP_JOB=IMMEDIATE

# STOP_JOB と STOP_JOB=IMMEDIATE の違い:
# STOP_JOB:           現在のテーブル/行の処理完了を待つ(安全)
# STOP_JOB=IMMEDIATE: 即座に停止(数秒以内に止まる)
# どちらも再開可能
STOP_JOB は再開できる
STOP_JOB で停止したジョブは中断した位置を記憶しています。START_JOB で再開すると、停止した位置から処理を続行します。サーバー負荷が高い時間帯に一時停止し、負荷が下がったら再開する運用に便利です。

KILL_JOB でジョブを強制終了する

Shell(KILL_JOB)
# ジョブに接続
expdp hr/password attach=HR_DAILY_EXPORT

# 強制終了
Export> KILL_JOB
Are you sure you wish to stop this job ([yes]/no): yes
# ジョブが即座に終了し、ワーカープロセスが削除される
操作 再開可能 ダンプファイル 用途
STOP_JOB 可能 途中まで書き込み済み(不完全) 一時停止して後で再開したい
STOP_JOB=IMMEDIATE 可能 途中まで書き込み済み すぐに停止して後で再開したい
KILL_JOB 不可 不完全(使用不可) 不要なジョブを完全に破棄したい
KILL_JOB は最終手段
KILL_JOB で強制終了したジョブは再開できません。ダンプファイルも不完全な状態で残るため、インポートには使えません。「一時停止して後で再開したい」場合は必ず STOP_JOB を使ってください。KILL_JOB は「ジョブ自体が不要になった」「エラーで止まらない」場合の最終手段です。

Ctrl+C の動作

Ctrl+C はジョブを停止しない
Data Pump 実行中に Ctrl+C を押すと、ジョブは停止せず対話モードに切り替わります。ジョブはバックグラウンドで動き続けます。
Ctrl+C → 対話モード → STOP_JOB で一時停止
Ctrl+C → 対話モード → CONTINUE_CLIENT でログ表示に戻る
Ctrl+C → 対話モード → EXIT_CLIENT で切断(ジョブはバックグラウンド継続)

ターミナル切断後の復帰

SSH 切断やターミナルクローズでクライアントが切断されても、Data Pump ジョブはサーバー側で動き続けます。attach で再接続すれば進捗確認や操作が可能です。

Shell(切断後の再接続)
# ターミナルが切断された後...

# (1) ジョブが動いているか確認
sqlplus / as sysdba
SQL> SELECT job_name, state FROM dba_datapump_jobs;
-- HR_DAILY_EXPORT  EXECUTING  ← まだ動いている

# (2) attach で再接続
expdp hr/password attach=HR_DAILY_EXPORT

# (3) 進捗確認
Export> STATUS
nohup や screen/tmux を併用する
SSH 切断を防ぐため、長時間の Data Pump ジョブはnohupscreentmux の中で実行することを推奨します。
nohup expdp hr/password parfile=export.par &
万が一切断されても attach で復帰可能ですが、予防するに越したことはありません。

STATUS で進捗を確認する

Shell(STATUS コマンド)
# 接続後に進捗を 1 回表示
Export> STATUS

# 30 秒ごとに自動表示
Export> STATUS=30

# 出力例:
# Worker 1 Status:
#   Process Name:  DW00
#   State:         EXECUTING
#   Object Schema: HR
#   Object Name:   EMPLOYEES
#   Object Type:   TABLE_DATA
#   Completed Objects:  15
#   Total Objects:      42
#   Completed Rows:     1,234,567
#   Worker Parallelism: 4

PARALLEL を動的に変更する

Shell(パラレル度の変更)
# 接続後にパラレル度を変更
Export> PARALLEL=8
# ワーカー数が即座に 8 に増加

Export> PARALLEL=2
# ワーカー数を 2 に縮小(負荷を下げたい場合)

パラレル処理の詳細は「Data Pump のパラレル処理で高速化する方法」を参照してください。

残存ジョブの確認と強制クリーンアップ

Data Pump ジョブが異常終了した場合、マスターテーブル(ジョブ管理用の一時テーブル)が残り、次のジョブで「ジョブが既に存在する」エラーが発生することがあります。

SQL(残存ジョブの確認)
-- NOT RUNNING のジョブ(終了済み / 異常終了)を確認
SELECT owner_name, job_name, operation, job_mode, state
FROM dba_datapump_jobs
ORDER BY state, owner_name;

-- state = NOT RUNNING で attached_sessions = 0 のジョブがゴミ
SQL(残存ジョブのクリーンアップ)
-- 方法(1): attach して KILL_JOB
-- expdp hr/password attach=SYS_EXPORT_SCHEMA_01
-- Export> KILL_JOB

-- 方法(2): マスターテーブルを直接 DROP(attach できない場合)
-- マスターテーブル名 = ジョブ名と同じ
DROP TABLE hr.SYS_EXPORT_SCHEMA_01 PURGE;

-- 方法(3): DBMS_DATAPUMP で強制削除(11g+)
BEGIN
    DBMS_DATAPUMP.DETACH('SYS_EXPORT_SCHEMA_01');
    DBMS_DATAPUMP.STOP_JOB('SYS_EXPORT_SCHEMA_01', 1, 0);
EXCEPTION WHEN OTHERS THEN
    NULL;
END;
/
DROP TABLE hr.SYS_EXPORT_SCHEMA_01 PURGE;
マスターテーブルを DROP する前にジョブが本当に停止しているか確認
DBA_DATAPUMP_JOBS で state = EXECUTING のジョブを DROP すると、実行中のジョブが異常終了します。state = NOT RUNNING かつ attached_sessions = 0 であることを確認してから DROP してください。

実務パターン集

パターン(1): 夜間バッチの負荷制御

Shell
# 夜間バッチで parallel=8 でエクスポート開始
expdp system/password \
    directory=DP_DIR \
    dumpfile=nightly_%U.dmp \
    full=y parallel=8 \
    job_name=NIGHTLY_EXPORT

# 朝になって業務開始 → 負荷を下げたい
# 別ターミナルで:
expdp system/password attach=NIGHTLY_EXPORT
Export> PARALLEL=2
# → ワーカーを 8 → 2 に縮小して負荷を軽減

# さらに負荷が厳しければ一時停止
Export> STOP_JOB
# → 昼休みに再開
Export> START_JOB

パターン(2): SSH 切断からの復帰

Shell
# SSH が切断された...

# 再接続後:
# (1) ジョブが動いているか確認
sqlplus / as sysdba <<EOF
SELECT job_name, state FROM dba_datapump_jobs;
EOF

# (2) attach で復帰
expdp system/password attach=NIGHTLY_EXPORT
Export> STATUS
# → 進捗を確認。問題なければそのまま EXIT_CLIENT

パターン(3): エラーで止まらないジョブの強制終了

Shell
# ジョブがエラーで EXECUTING のまま止まらない
expdp system/password attach=STUCK_JOB

# まず STOP_JOB を試す
Export> STOP_JOB=IMMEDIATE

# 止まらない場合は KILL_JOB
Export> KILL_JOB

# それでも DBA_DATAPUMP_JOBS に残る場合
# マスターテーブルを直接 DROP
-- DROP TABLE hr.STUCK_JOB PURGE;

よくあるエラーと対処

エラー / 問題 原因 対処法
ORA-31626: ジョブが存在しない マスターテーブルが残存しているが attach のジョブ名が間違い DBA_DATAPUMP_JOBS で正しいジョブ名を確認
ORA-31634: ジョブは既に存在する 前回のジョブのマスターテーブルが残存 DROP TABLE owner.job_name PURGE でクリーンアップ
attach しても対話モードに入れない ジョブのオーナーが別ユーザー ジョブを作成したユーザーで接続するか、DBA 権限で接続
STOP_JOB しても停止しない ワーカーが大きなテーブルを処理中 STOP_JOB=IMMEDIATE で強制。それでもダメなら KILL_JOB

よくある質問

QCtrl+C でジョブは停止しますか?
A停止しません。Ctrl+C は対話モード(Export> プロンプト)に切り替わるだけで、ジョブはバックグラウンドで動き続けます。ジョブを停止するには対話モードで STOP_JOB を実行してください。
QSTOP_JOB と KILL_JOB はどちらを使うべきですか?
A基本的にはSTOP_JOB を使ってください。STOP_JOB は再開(START_JOB)が可能です。KILL_JOB は再開できず、ダンプファイルも不完全になります。KILL_JOB は「ジョブ自体が不要」「エラーで止まらない」場合の最終手段です。
Qターミナルを閉じたらジョブはどうなりますか?
Aジョブはサーバー側で動き続けます。Data Pump はサーバープロセスとして実行されるため、クライアントのターミナルが切断されてもジョブは中断しません。attach で再接続すれば進捗確認や操作が可能です。
QSTOP_JOB で停止したジョブはいつまで保持されますか?
Aジョブ情報(マスターテーブル)は明示的に削除するまで永久に保持されます。START_JOB で再開するか、KILL_JOB で削除するまで DBA_DATAPUMP_JOBS に残ります。不要になったら KILL_JOB またはマスターテーブルの DROP で削除してください。
Qjob_name を指定しなかった場合のデフォルト名は?
ASYS_EXPORT_SCHEMA_01SYS_IMPORT_TABLE_01 のように自動生成されます。末尾の番号は同名ジョブが存在する場合に 02, 03… と増えます。attach 時に名前がわからなくなるため、常に job_name を指定することを推奨します。
QDBA_DATAPUMP_JOBS に NOT RUNNING のジョブが大量に残っています
A正常完了したジョブのマスターテーブルが残存している状態です。以下で一括クリーンアップできます。
SELECT 'DROP TABLE ' || owner_name || '.' || job_name || ' PURGE;' FROM dba_datapump_jobs WHERE state = 'NOT RUNNING';
出力された DROP 文を確認してから実行してください。

まとめ

Data Pump ジョブの管理操作をまとめます。

やりたいこと コマンド
実行中のジョブに接続 expdp user/pass attach=JOB_NAME
進捗を確認 STATUS / STATUS=30(30 秒ごと)
ジョブを一時停止(再開可能) STOP_JOB / STOP_JOB=IMMEDIATE
停止したジョブを再開 START_JOB
ジョブを強制終了(再開不可) KILL_JOB
パラレル度を動的変更 PARALLEL=N
対話モードを抜ける(ジョブ継続) EXIT_CLIENT
対話モードを抜けてログ表示に戻る CONTINUE_CLIENT
残存ジョブの確認 SELECT * FROM DBA_DATAPUMP_JOBS
残存ジョブの強制削除 DROP TABLE owner.job_name PURGE

Data Pump の基本は「Data Pump の使い方完全ガイド」、パラレル処理は「パラレル処理で高速化する方法」も併せて参照してください。