Oracle Data Pump のimpdpコマンドでダンプファイルをインポートしているとき、「いつまで経っても終わらない」「進捗が止まったように見える」という経験は、DBAや開発者なら一度はあるはずです。数GBのダンプファイルが何時間も処理され続けたり、プロンプトが返ってこないまま放置せざるを得なかったり——その原因はロック競合・インデックス再構築・表領域不足・パラレル設定の不備など多岐にわたります。
この記事では、impdpが遅い・終わらない場合の原因の特定方法から、進捗確認SQL、ロック解消、高速化テクニック、ジョブの強制終了まで、実務で必要な対処法を体系的に解説します。
この記事で分かること
impdpが遅い・終わらない7つの主な原因と早見表
DBA_DATAPUMP_JOBSやV$SESSION_LONGOPSで進捗状況を確認する方法
- ロック競合の検出と解消(V$LOCK / V$LOCKED_OBJECT)
- インデックス・制約の除外でインポートを高速化するテクニック
- UNDO/TEMP表領域の不足を確認・拡張する方法
- PARALLELパラメータによる並列処理の最適化
- NOLOGGINGやCONTENT=DATA_ONLYなどの高速化オプション
- ハングしたジョブの強制終了と残存ジョブの削除方法
impdpが遅い・終わらない主な原因一覧
まず全体像を把握するために、impdpのパフォーマンス問題でよく見られる原因と対処法を早見表にまとめます。自分の状況に該当する項目から各セクションに進んでください。
| 原因 |
症状 |
対処法 |
| ロック競合 |
特定テーブルで処理が停止する |
ロック保持セッションをKILL |
| インデックス再構築 |
データ投入後に長時間停止 |
EXCLUDE=INDEX で後から作成 |
| UNDO表領域不足 |
ORA-30036エラーまたは極端な低速 |
UNDO表領域のAUTOEXTEND有効化 |
| TEMP表領域不足 |
ソート処理で停滞 |
TEMP表領域の拡張 |
| REDO LOG生成過多 |
大量INSERT時のログ書込み待ち |
TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y |
| パラレル未設定 |
シングルスレッドで時間がかかる |
PARALLELパラメータを設定 |
| ディスクI/Oボトルネック |
CPU使用率は低いが進まない |
ダンプとデータファイルを別ディスクに配置 |
ポイント:まず「進捗状況の確認」で現在の状態を把握し、そこから原因を切り分けるのが効率的です。次のセクションから順に確認していきましょう。
進捗状況の確認方法
impdpが終わらないとき、最初にやるべきことは現在の進捗状況の確認です。「本当に止まっているのか」「どこまで進んでいるのか」を正確に把握することで、適切な対処法を選択できます。
DBA_DATAPUMP_JOBSで実行中ジョブを確認
DBA_DATAPUMP_JOBSビューを使うと、現在実行中のData Pumpジョブの一覧と状態を確認できます。
SQL
SELECT
owner_name,
job_name,
operation,
job_mode,
state,
degree,
attached_sessions
FROM dba_datapump_jobs
WHERE state NOT IN ('NOT RUNNING')
ORDER BY owner_name, job_name;
実行結果
OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE DEGREE ATTACHED
---------- ------------------- --------- -------- --------- ------ --------
SYSTEM SYS_IMPORT_FULL_01 IMPORT FULL EXECUTING 1 1
| STATE |
意味 |
対応 |
EXECUTING |
正常に実行中 |
V$SESSION_LONGOPSで進捗を確認 |
DEFINING |
ジョブ定義中(開始直後) |
しばらく待機 |
COMPLETING |
完了処理中 |
しばらく待機 |
IDLING |
アイドル状態(処理待ち) |
ロック競合やリソース不足を疑う |
NOT RUNNING |
停止済み(残存ジョブ) |
不要ならマスターテーブルを削除 |
V$SESSION_LONGOPSで進捗率を確認
V$SESSION_LONGOPSは、長時間実行中のオペレーションの進捗率を確認できる非常に有用なビューです。Data Pumpの進捗確認には最もよく使われるSQLです。
SQL
SELECT
sid,
serial#,
opname,
target,
sofar,
totalwork,
ROUND(sofar / totalwork * 100, 2) AS pct_done,
elapsed_seconds,
time_remaining
FROM v$session_longops
WHERE opname LIKE 'IMPORT%'
AND sofar <> totalwork
ORDER BY start_time DESC;
実行結果
SID SERIAL# OPNAME TARGET SOFAR TOTALWORK PCT_DONE ELAPSED REMAINING
--- ------- ------------------- ----------- ------ --------- -------- ------- ---------
45 301 IMPORT: SCHEMA HR 18500 45000 41.11 1240 1775
読み方のポイント
- SOFAR / TOTALWORK:処理済み件数 / 全体件数
- PCT_DONE:進捗率(%)。この値が定期的に増えていれば正常に動作中
- TIME_REMAINING:推定残り時間(秒)。あくまで推定値なので参考程度
- このビューに行が表示されない場合は、長時間オペレーションとして登録されていないか、メタデータ処理フェーズの可能性がある
impdp attachでジョブに再接続してstatus確認
impdpのセッションが切断されてしまった場合や、別のターミナルからジョブの状態を確認したい場合は、attachパラメータでジョブに再接続できます。
Shell
# ジョブ名を指定して再接続
impdp system/password attach=SYS_IMPORT_FULL_01
接続後、Data Pumpの対話式プロンプトが表示されます。statusコマンドで現在の処理状況を確認できます。
対話式コマンド
-- 現在の状態を確認(5秒間隔で更新)
Import> status
-- 一定間隔で自動更新(60秒間隔)
Import> status=60
実行結果
Job: SYS_IMPORT_FULL_01
Operation: IMPORT
Mode: FULL
State: EXECUTING
Bytes Processed: 2,458,836,992
Percent Done: 43
Current Parallelism: 1
Job Error Count: 0
Dump File: /u01/backup/full_export.dmp
Worker 1 Status:
Instance ID: 1
Instance name: orcl
Process Name: DW00
State: EXECUTING
Object Schema: HR
Object Name: EMPLOYEES_HISTORY
Object Type: TABLE_DATA
Completed Objects: 156
Total Objects: 412
Completed Rows: 8,234,100
ポイント:attachしてもジョブの実行には影響しません。ジョブはサーバー側で独立して実行されているため、クライアントのセッション切断で停止することはありません(ただし、ジョブ開始直後の初期化フェーズで切断すると失敗する場合があります)。
V$SESSIONでセッション状態を確認
Data Pumpのワーカープロセスがどのような状態にあるかを、V$SESSIONで確認できます。待機イベントを見ることで、ボトルネックの特定に役立ちます。
SQL
SELECT
s.sid,
s.serial#,
s.program,
s.status,
s.event,
s.wait_class,
s.seconds_in_wait,
s.sql_id
FROM v$session s
WHERE s.program LIKE '%DM%'
OR s.program LIKE '%DW%'
ORDER BY s.sid;
| 待機イベント(EVENT) |
考えられる原因 |
enq: TM - contention |
テーブルレベルのDMLロック競合 |
enq: TX - row lock contention |
行レベルのロック競合 |
log file sync |
REDO LOG書込みのボトルネック |
db file sequential read |
ディスクI/O(シングルブロック読取り) |
db file scattered read |
ディスクI/O(マルチブロック読取り) |
direct path write |
ダイレクトパス書込み中(正常動作) |
ロック競合が原因の場合
impdpがテーブルにデータをロードする際、対象テーブルに対してロックを取得します。他のセッションが同じテーブルに対してDMLやDDLを実行している場合、ロック競合が発生してインポートが待ち状態になります。これは本番環境で稼働中のDBにインポートする場合に特に発生しやすい問題です。
V$LOCKとV$LOCKED_OBJECTでロックを確認
以下のSQLで、Data Pumpのセッションがどのロックを待っているか、そのロックを誰が保持しているかを確認できます。
SQL
-- ロック競合の確認(ブロッキングセッションの特定)
SELECT
l1.sid AS waiting_sid,
l2.sid AS blocking_sid,
s2.username AS blocking_user,
s2.program AS blocking_program,
s2.sql_id AS blocking_sql_id,
l1.type AS lock_type
FROM v$lock l1
JOIN v$lock l2
ON l1.id1 = l2.id1
AND l1.id2 = l2.id2
AND l1.request > 0
AND l2.lmode > 0
JOIN v$session s2
ON l2.sid = s2.sid;
ロックされているオブジェクトの特定
V$LOCKED_OBJECTを使うと、どのオブジェクト(テーブル)がロックされているかを具体的に確認できます。
SQL
SELECT
lo.session_id,
lo.oracle_username,
o.owner,
o.object_name,
o.object_type,
lo.locked_mode,
s.program,
s.machine
FROM v$locked_object lo
JOIN dba_objects o
ON lo.object_id = o.object_id
JOIN v$session s
ON lo.session_id = s.sid
ORDER BY o.object_name;
| LOCKED_MODE |
ロックの種類 |
説明 |
2 |
Row Share(RS) |
最も弱いロック。SELECT … FOR UPDATE |
3 |
Row Exclusive(RX) |
INSERT / UPDATE / DELETE時 |
4 |
Share(S) |
CREATE INDEX時など |
5 |
Share Row Exclusive(SRX) |
LOCK TABLE … IN SHARE ROW EXCLUSIVE |
6 |
Exclusive(X) |
最も強いロック。DDL操作時 |
対処法:ロック保持セッションのKILL
ブロッキングセッションを特定できたら、そのセッションをKILLしてロックを解放します。
注意
セッションをKILLすると、そのセッションで実行中のトランザクションはロールバックされます。本番環境で実行する場合は、対象セッションの内容を十分に確認してから実行してください。
SQL
-- ブロッキングセッションをKILL(SID, SERIAL#を指定)
ALTER SYSTEM KILL SESSION '128,45023' IMMEDIATE;
-- KILLが効かない場合は DISCONNECT を使用
ALTER SYSTEM DISCONNECT SESSION '128,45023' IMMEDIATE;
セッションをKILLした後、Data Pumpのインポート処理は自動的にロック待ちから解放されて処理を再開します。
インデックス・制約の再構築が原因の場合
impdpはデフォルトで、テーブルデータのインポート後にインデックスと制約を再作成します。大量データを持つテーブルのインデックス再構築には非常に時間がかかることがあり、これがインポート全体の所要時間の大部分を占めるケースも珍しくありません。
TRANSFORM=DISABLE_ARCHIVE_LOGGING:Yでログ生成を抑制
Oracle 12c以降では、TRANSFORMパラメータでアーカイブログ生成を無効化できます。インデックス再構築時のREDOログ生成を抑制することで、大幅な高速化が期待できます。
Shell
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export.dmp
logfile=import.log
transform=DISABLE_ARCHIVE_LOGGING:Y
DISABLE_ARCHIVE_LOGGING の効果
- テーブルとインデックスの作成時にNOLOGGING属性が自動的に付与される
- REDO LOG生成が大幅に削減され、I/O負荷が軽減される
- インポート完了後、テーブルのLOGGING属性は元に戻る
- ただし、NOLOGGING中にメディア障害が発生するとリカバリ不可になるため注意
EXCLUDE=INDEXでインデックスなしインポート
インデックスの再構築が主なボトルネックの場合、インデックスを除外してインポートし、後から手動で作成する方法が有効です。
Shell
# インデックスと制約を除外してインポート
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export.dmp
logfile=import.log
exclude=INDEX
exclude=CONSTRAINT
インポート完了後、以下の手順でインデックスを作成します。
SQL
-- NOLOGGINGとPARALLELでインデックスを高速作成
CREATE INDEX idx_emp_dept_id ON employees(department_id)
NOLOGGING
PARALLEL 4;
-- 作成後にPARALLEL属性を元に戻す
ALTER INDEX idx_emp_dept_id NOPARALLEL;
-- LOGGING属性も元に戻す
ALTER INDEX idx_emp_dept_id LOGGING;
SQLFILE でインデックスDDLだけ抽出する
ダンプファイルからインデックスのDDLだけを抽出したい場合は、SQLFILEパラメータが便利です。
Shell
# インデックスのDDLだけをSQLファイルに出力
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export.dmp
sqlfile=index_ddl.sql
include=INDEX
出力されたindex_ddl.sqlを編集して、NOLOGGING PARALLELオプションを追加してから実行すると、効率的にインデックスを再作成できます。
UNDO/TEMP表領域の不足が原因の場合
大量データのインポートでは、UNDO表領域とTEMP表領域が大量に消費されます。これらが不足すると、インポートが極端に遅くなったり、エラーで停止したりします。
UNDO表領域の確認と拡張
UNDO表領域が不足すると、ORA-30036: unable to extend segment by 8 in undo tablespaceエラーが発生するか、UNDOセグメントの確保待ちで処理速度が大幅に低下します。
SQL
-- UNDO表領域の使用状況を確認
SELECT
tablespace_name,
ROUND(used_space * block_size / 1024 / 1024, 2) AS used_mb,
ROUND(tablespace_size * block_size / 1024 / 1024, 2) AS total_mb,
ROUND(used_percent, 2) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE tablespace_name LIKE '%UNDO%';
SQL
-- V$UNDOSTATで直近のUNDO使用量を確認
SELECT
TO_CHAR(begin_time, 'HH24:MI:SS') AS begin_time,
TO_CHAR(end_time, 'HH24:MI:SS') AS end_time,
undoblks,
txncount,
maxquerylen,
nospaceerrcnt
FROM v$undostat
WHERE ROWNUM <= 10
ORDER BY begin_time DESC;
NOSPACEERRCNTが0より大きい値を示している場合、UNDO表領域の不足が発生しています。
SQL
-- UNDO表領域にデータファイルを追加
ALTER TABLESPACE UNDOTBS1 ADD DATAFILE
'/u01/oradata/orcl/undotbs02.dbf'
SIZE 2G
AUTOEXTEND ON
NEXT 512M
MAXSIZE 8G;
-- 既存データファイルのAUTOEXTENDを有効化
ALTER DATABASE DATAFILE
'/u01/oradata/orcl/undotbs01.dbf'
AUTOEXTEND ON
NEXT 512M
MAXSIZE 8G;
TEMP表領域の確認と拡張
インデックス作成時のソート処理やハッシュ結合で、TEMP表領域が大量に使用されます。
SQL
-- TEMP表領域の使用状況を確認
SELECT
tablespace_name,
ROUND(tablespace_size / 1024 / 1024, 2) AS total_mb,
ROUND(allocated_space / 1024 / 1024, 2) AS alloc_mb,
ROUND(free_space / 1024 / 1024, 2) AS free_mb
FROM dba_temp_free_space;
SQL
-- TEMP表領域にテンポラリファイルを追加
ALTER TABLESPACE TEMP ADD TEMPFILE
'/u01/oradata/orcl/temp02.dbf'
SIZE 2G
AUTOEXTEND ON
NEXT 512M
MAXSIZE 8G;
ポイント:インポート前にUNDO表領域とTEMP表領域のAUTOEXTENDが有効になっているか確認しておくと、途中でスペース不足に陥るリスクを軽減できます。特に大規模なダンプファイル(10GB以上)をインポートする場合は事前にチェックしておきましょう。
パラレル処理での高速化
Data Pumpはデフォルトではシングルスレッドで動作します。PARALLELパラメータを指定することで、複数のワーカープロセスを使用した並列インポートが可能になり、大幅な時間短縮が期待できます。
PARALLELパラメータの設定
Shell
# 4並列でインポート
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export_%U.dmp
logfile=import.log
parallel=4
注意:PARALLELを使うにはダンプファイルも複数必要
PARALLELの効果を最大限に引き出すには、エクスポート時も同じ並列度でダンプファイルを分割しておく必要があります。単一のダンプファイルに対してPARALLELを指定しても、ワーカーは1つしか使えません。%Uをファイル名に含めると、連番でファイルが分割されます。
Shell
# エクスポート時も並列で分割ダンプファイルを作成
expdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export_%U.dmp
logfile=export.log
parallel=4
full=Y
CPUコア数との関係と最適値
PARALLELの最適値は、サーバーのリソースとデータの特性によって異なります。以下のガイドラインを参考にしてください。
| サーバースペック |
推奨PARALLEL値 |
備考 |
| 4コア / HDD |
2 |
HDDはI/Oがボトルネックになりやすい |
| 8コア / SSD |
4 |
SSDならI/O余裕あり |
| 16コア / SSD RAID |
8 |
本番稼働中は他の処理への影響も考慮 |
| 32コア以上 / NVMe |
8〜16 |
それ以上はオーバーヘッドで逆効果の場合も |
ディスクI/Oがボトルネックの場合
PARALLELを増やしてもインポート速度が変わらない場合、ディスクI/Oがボトルネックになっている可能性があります。以下のSQLでI/O待機の状況を確認できます。
SQL
-- データファイルごとのI/O統計を確認
SELECT
name,
phyrds AS physical_reads,
phywrts AS physical_writes,
avgiotim AS avg_io_time_ms,
maxiortm AS max_read_time_ms,
maxiowtm AS max_write_time_ms
FROM v$filestat f
JOIN v$datafile d
ON f.file# = d.file#
ORDER BY avgiotim DESC;
I/Oボトルネック時の対策
- ダンプファイルとデータファイルを別の物理ディスクに配置する
- 可能であればSSD / NVMeのストレージを使用する
- ASM(Automatic Storage Management)を使用している場合は、ディスクグループの冗長性を確認する
- PARALLELを増やすとI/O競合が悪化する場合があるため、段階的に値を調整する
その他の高速化テクニック
ここまでに紹介した方法に加えて、インポートの高速化に役立つ追加のテクニックをまとめて紹介します。
CONTENT=DATA_ONLY(データのみインポート)
テーブル定義はすでに存在していて、データだけをインポートしたい場合はCONTENT=DATA_ONLYが有効です。DDL処理(テーブル作成・インデックス作成・制約作成)をスキップするため、大幅に高速化されます。
Shell
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export.dmp
logfile=import.log
content=DATA_ONLY
| CONTENTの値 |
インポート対象 |
用途 |
ALL(デフォルト) |
データ + メタデータ(DDL) |
完全なリストア |
DATA_ONLY |
データのみ |
テーブル定義が既にある環境へのデータ投入 |
METADATA_ONLY |
メタデータ(DDL)のみ |
テーブル定義だけ移行 |
TABLE_EXISTS_ACTION=TRUNCATE/REPLACE
既存テーブルへデータを再投入する場合、TABLE_EXISTS_ACTIONパラメータの選択がパフォーマンスに影響します。
Shell
# 既存データを削除してからインポート
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export.dmp
logfile=import.log
table_exists_action=TRUNCATE
| 値 |
動作 |
インデックス再構築 |
速度 |
SKIP |
テーブルが存在する場合スキップ |
なし |
最速(何もしない) |
APPEND |
既存データに追記 |
なし |
速い |
TRUNCATE |
既存データをTRUNCATEして投入 |
なし |
速い |
REPLACE |
テーブルをDROPして再作成 |
あり |
遅い(DDL再実行) |
ポイント:テーブル定義を変更する必要がなければ、TRUNCATEが最もバランスの良い選択です。REPLACEはテーブルのDROP&CREATEに加えてインデックスの再作成も行うため、最も時間がかかります。
NOLOGGINGとFORCE LOGGINGの制御
REDO LOG生成を抑制することで、インポートを高速化できます。ただし、データベースレベルでFORCE LOGGINGが有効になっている場合は、個別テーブルのNOLOGGING設定が無視されます。
SQL
-- FORCE LOGGINGの状態を確認
SELECT force_logging FROM v$database;
-- インポート前にFORCE LOGGINGを一時的に無効化
ALTER DATABASE NO FORCE LOGGING;
-- インポート完了後に元に戻す
ALTER DATABASE FORCE LOGGING;
注意
NO FORCE LOGGINGの状態でNOLOGGINGオペレーションを実行すると、メディア障害時にデータのリカバリができなくなります。インポート完了後は速やかにFORCE LOGGINGに戻し、RMANで全体バックアップを取得してください。Data Guard環境では特に注意が必要です。
ネットワークリンク経由インポートの注意点
NETWORK_LINKパラメータを使ってダンプファイルなしで直接インポートする場合、ネットワーク帯域がボトルネックになることがあります。
Shell
# ネットワーク経由の直接インポート
impdp system/password
network_link=REMOTE_DB_LINK
schemas=HR
logfile=network_import.log
- ネットワーク帯域が狭い場合は、まず
expdpでダンプファイルを作成し、そのファイルを転送してからimpdpする方が速い場合が多い
- NETWORK_LINKでは
PARALLELがリモートサーバー側にも影響するため、相手サーバーの負荷にも注意が必要
- SDUサイズ(Session Data Unit)を大きくすることで転送効率を改善できる場合がある(
sqlnet.oraで設定)
ジョブが停止・ハングした場合の強制終了
進捗が完全に停止してリカバリの見込みがない場合、ジョブを強制終了する必要があります。ここでは段階的な終了手順を解説します。
impdp attachからのKILL_JOB
最も安全な終了方法は、ジョブにattachしてからKILL_JOBコマンドを実行することです。
Shell
# ジョブにattach
impdp system/password attach=SYS_IMPORT_FULL_01
対話式コマンド
-- まず停止を試みる(途中経過を保持)
Import> stop_job
Are you sure you wish to stop this job ([yes]/no): yes
-- 停止できない場合、強制終了(ジョブとマスターテーブルを削除)
Import> kill_job
Are you sure you wish to stop this job ([yes]/no): yes
| コマンド |
動作 |
再開可否 |
stop_job |
ジョブを一時停止(マスターテーブル保持) |
可能(再attachしてstart_job) |
kill_job |
ジョブを強制終了+マスターテーブル削除 |
不可(最初からやり直し) |
DBA_DATAPUMP_JOBSからの残存ジョブ削除
kill_jobが効かない場合や、DBA_DATAPUMP_JOBSにNOT RUNNING状態のジョブが残っている場合は、手動でクリーンアップします。
SQL
-- 残存ジョブを確認
SELECT
owner_name,
job_name,
state
FROM dba_datapump_jobs
WHERE state = 'NOT RUNNING';
PL/SQL
-- Data Pump APIでジョブを停止・削除
DECLARE
h NUMBER;
BEGIN
h := DBMS_DATAPUMP.ATTACH(
job_name => 'SYS_IMPORT_FULL_01',
job_owner => 'SYSTEM'
);
DBMS_DATAPUMP.STOP_JOB(h, 1, 0);
END;
/
マスターテーブルの手動削除
上記の方法でもジョブが削除できない場合、最後の手段としてマスターテーブルを手動で削除します。マスターテーブルは、Data Pumpジョブのメタデータを保持するテーブルで、ジョブ名と同じ名前でオーナースキーマに作成されます。
SQL
-- マスターテーブルの存在を確認
SELECT owner, table_name
FROM dba_tables
WHERE table_name LIKE 'SYS_IMPORT%'
OR table_name LIKE 'SYS_EXPORT%';
-- マスターテーブルを手動削除
DROP TABLE SYSTEM.SYS_IMPORT_FULL_01 PURGE;
注意
マスターテーブルを手動削除する前に、対応するData Pumpプロセスが完全に停止していることを確認してください。実行中のプロセスがある状態で削除すると、データの不整合が生じる可能性があります。OS上でps -ef | grep dwやps -ef | grep dmでワーカー/マスタープロセスの有無を確認しましょう。
Shell
# Data Pumpのワーカー/マスタープロセスを確認
ps -ef | grep -E "dw|dm" | grep -v grep
# プロセスが残っている場合はKILL
kill -9 <PID>
まとめ:impdpトラブルシューティングフロー
最後に、impdpが終わらない場合のトラブルシューティング手順をフローチャート形式でまとめます。上から順に確認・対処していくことで、問題を効率的に解決できます。
| Step |
確認内容 |
確認方法 |
該当時の対処 |
| 1 |
ジョブは実行中か? |
DBA_DATAPUMP_JOBS |
NOT RUNNINGなら残存ジョブを削除 |
| 2 |
進捗は動いているか? |
V$SESSION_LONGOPS |
PCT_DONEが変化しているか定期確認 |
| 3 |
ロック待ちしていないか? |
V$SESSIONのevent確認 |
ブロッキングセッションをKILL |
| 4 |
インデックス再構築で停滞? |
V$SESSIONのSQL_IDからSQL確認 |
次回はEXCLUDE=INDEXで実行 |
| 5 |
UNDO/TEMP不足は? |
V$UNDOSTAT / DBA_TEMP_FREE_SPACE |
表領域を拡張 |
| 6 |
I/Oボトルネックは? |
V$FILESTAT |
ダンプとデータファイルを別ディスクに分離 |
| 7 |
完全にハングしている? |
attachで応答なし |
KILL_JOB→マスターテーブル削除→再実行 |
高速インポートのベストプラクティス
大規模なダンプファイルをインポートする場合は、以下の設定を組み合わせることで最大限の高速化が可能です。
Shell
# 高速インポートの推奨設定例
impdp system/password
directory=DATA_PUMP_DIR
dumpfile=full_export_%U.dmp
logfile=import.log
parallel=4
transform=DISABLE_ARCHIVE_LOGGING:Y
exclude=INDEX
exclude=CONSTRAINT
table_exists_action=TRUNCATE
cluster=N
インポート完了後は以下の手順で仕上げます。
SQL
-- 1. インデックスを NOLOGGING + PARALLEL で再作成
-- (SQLFILEで抽出したDDLに NOLOGGING PARALLEL 4 を追加して実行)
-- 2. 制約を有効化
-- (必要に応じてダンプから制約DDLを抽出して実行)
-- 3. テーブルとインデックスのLOGGING属性を元に戻す
ALTER TABLE hr.employees LOGGING;
ALTER INDEX hr.idx_emp_dept_id LOGGING;
-- 4. FORCE LOGGINGが無効化されていた場合は元に戻す
ALTER DATABASE FORCE LOGGING;
-- 5. 統計情報を収集
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(
ownname => 'HR',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
degree => 4
);
END;
/
-- 6. RMANで全体バックアップを取得
-- (NOLOGGINGで投入したデータを保護するため)
Data Pumpのインポートは、適切な設定と事前準備で大幅に高速化できます。本番環境では事前にテスト環境で所要時間を計測し、メンテナンスウィンドウ内に収まるかを確認することをおすすめします。問題が発生した場合は、この記事のトラブルシューティングフローに沿って、原因の特定と対処を進めてください。