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 の命名規則と指定方法
・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 で接続しても実行中のジョブは中断されません。対話モードに入るだけで、ジョブはバックグラウンドで動き続けます。進捗確認だけなら何の影響もありません。
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 で再開すると、停止した位置から処理を続行します。サーバー負荷が高い時間帯に一時停止し、負荷が下がったら再開する運用に便利です。
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 は「ジョブ自体が不要になった」「エラーで止まらない」場合の最終手段です。
KILL_JOB で強制終了したジョブは再開できません。ダンプファイルも不完全な状態で残るため、インポートには使えません。「一時停止して後で再開したい」場合は必ず STOP_JOB を使ってください。KILL_JOB は「ジョブ自体が不要になった」「エラーで止まらない」場合の最終手段です。
Ctrl+C の動作
Ctrl+C はジョブを停止しない
Data Pump 実行中に Ctrl+C を押すと、ジョブは停止せず対話モードに切り替わります。ジョブはバックグラウンドで動き続けます。
Ctrl+C → 対話モード →
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 ジョブは
万が一切断されても attach で復帰可能ですが、予防するに越したことはありません。
SSH 切断を防ぐため、長時間の Data Pump ジョブは
nohup、screen、tmux の中で実行することを推奨します。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 を指定しなかった場合のデフォルト名は?
A
SYS_EXPORT_SCHEMA_01、SYS_IMPORT_TABLE_01 のように自動生成されます。末尾の番号は同名ジョブが存在する場合に 02, 03… と増えます。attach 時に名前がわからなくなるため、常に job_name を指定することを推奨します。QDBA_DATAPUMP_JOBS に NOT RUNNING のジョブが大量に残っています
A正常完了したジョブのマスターテーブルが残存している状態です。以下で一括クリーンアップできます。
出力された DROP 文を確認してから実行してください。
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 の使い方完全ガイド」、パラレル処理は「パラレル処理で高速化する方法」も併せて参照してください。

