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 を指定することを推奨します。
# ジョブ名を指定してエクスポート
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 で実行中のジョブに接続する
# ジョブ名を指定して接続 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
-- 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 で接続しても実行中のジョブは中断されません。対話モードに入るだけで、ジョブはバックグラウンドで動き続けます。進捗確認だけなら何の影響もありません。
対話モードの全コマンド一覧
| コマンド | 動作 | 再開 |
|---|---|---|
| STATUS | 現在の進捗を表示 | ― |
| STATUS=N | N 秒ごとに進捗を自動表示 | ― |
| STOP_JOB | ジョブを一時停止(ワーカーを安全に停止) | 可能(START_JOB で再開) |
| STOP_JOB=IMMEDIATE | ジョブを即時停止(現在のブロックで中断) | 可能 |
| START_JOB | 停止したジョブを再開 | ― |
| KILL_JOB | ジョブを強制終了 | 不可(ダンプは不完全) |
| PARALLEL=N | ワーカー数を動的に変更 | ― |
| ADD_FILE | ダンプファイルを追加 | ― |
| CONTINUE_CLIENT | 対話モードを終了してログ表示に戻る | ― |
| EXIT_CLIENT | 対話モードを終了(ジョブはバックグラウンドで継続) | ― |
| HELP | コマンド一覧を表示 | ― |
ジョブの一時停止と再開
# (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 # ジョブが停止した位置から再開される
# 通常の STOP_JOB はワーカーが現在の処理を完了するまで待つ # IMMEDIATE は現在のブロックで即座に中断 Export> STOP_JOB=IMMEDIATE # STOP_JOB と STOP_JOB=IMMEDIATE の違い: # STOP_JOB: 現在のテーブル/行の処理完了を待つ(安全) # STOP_JOB=IMMEDIATE: 即座に停止(数秒以内に止まる) # どちらも再開可能
STOP_JOB で停止したジョブは中断した位置を記憶しています。START_JOB で再開すると、停止した位置から処理を続行します。サーバー負荷が高い時間帯に一時停止し、負荷が下がったら再開する運用に便利です。
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 で強制終了したジョブは再開できません。ダンプファイルも不完全な状態で残るため、インポートには使えません。「一時停止して後で再開したい」場合は必ず STOP_JOB を使ってください。KILL_JOB は「ジョブ自体が不要になった」「エラーで止まらない」場合の最終手段です。
Ctrl+C の動作
Data Pump 実行中に Ctrl+C を押すと、ジョブは停止せず対話モードに切り替わります。ジョブはバックグラウンドで動き続けます。
Ctrl+C → 対話モード →
STOP_JOB で一時停止Ctrl+C → 対話モード →
CONTINUE_CLIENT でログ表示に戻るCtrl+C → 対話モード →
EXIT_CLIENT で切断(ジョブはバックグラウンド継続)ターミナル切断後の復帰
SSH 切断やターミナルクローズでクライアントが切断されても、Data Pump ジョブはサーバー側で動き続けます。attach で再接続すれば進捗確認や操作が可能です。
# ターミナルが切断された後... # (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
SSH 切断を防ぐため、長時間の Data Pump ジョブは
nohup、screen、tmux の中で実行することを推奨します。nohup expdp hr/password parfile=export.par &万が一切断されても attach で復帰可能ですが、予防するに越したことはありません。
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 を動的に変更する
# 接続後にパラレル度を変更 Export> PARALLEL=8 # ワーカー数が即座に 8 に増加 Export> PARALLEL=2 # ワーカー数を 2 に縮小(負荷を下げたい場合)
パラレル処理の詳細は「Data Pump のパラレル処理で高速化する方法」を参照してください。
残存ジョブの確認と強制クリーンアップ
Data Pump ジョブが異常終了した場合、マスターテーブル(ジョブ管理用の一時テーブル)が残り、次のジョブで「ジョブが既に存在する」エラーが発生することがあります。
-- 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 のジョブがゴミ
-- 方法(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;
DBA_DATAPUMP_JOBS で state = EXECUTING のジョブを DROP すると、実行中のジョブが異常終了します。state = NOT RUNNING かつ attached_sessions = 0 であることを確認してから DROP してください。実務パターン集
パターン(1): 夜間バッチの負荷制御
# 夜間バッチで 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 切断からの復帰
# 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): エラーで止まらないジョブの強制終了
# ジョブがエラーで 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 |
よくある質問
STOP_JOB を実行してください。attach で再接続すれば進捗確認や操作が可能です。SYS_EXPORT_SCHEMA_01、SYS_IMPORT_TABLE_01 のように自動生成されます。末尾の番号は同名ジョブが存在する場合に 02, 03… と増えます。attach 時に名前がわからなくなるため、常に job_name を指定することを推奨します。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 の使い方完全ガイド」、パラレル処理は「パラレル処理で高速化する方法」も併せて参照してください。

