【Oracle】impdpインポートが終わらない原因と対処法|進捗確認・ロック解除・高速化テクニック

【Oracle】impdpインポートが終わらない原因と対処法|進捗確認・ロック解除・高速化テクニック Oracle

Oracle Data Pump のimpdpコマンドでダンプファイルをインポートしているとき、「いつまで経っても終わらない」「進捗が止まったように見える」という経験は、DBAや開発者なら一度はあるはずです。数GBのダンプファイルが何時間も処理され続けたり、プロンプトが返ってこないまま放置せざるを得なかったり——その原因はロック競合・インデックス再構築・表領域不足・パラレル設定の不備など多岐にわたります。

この記事では、impdpが遅い・終わらない場合の原因の特定方法から、進捗確認SQLロック解消高速化テクニックジョブの強制終了まで、実務で必要な対処法を体系的に解説します。

この記事で分かること

  • impdpが遅い・終わらない7つの主な原因と早見表
  • DBA_DATAPUMP_JOBSV$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;

NOSPACEERRCNT0より大きい値を示している場合、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_JOBSNOT 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 dwps -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のインポートは、適切な設定と事前準備で大幅に高速化できます。本番環境では事前にテスト環境で所要時間を計測し、メンテナンスウィンドウ内に収まるかを確認することをおすすめします。問題が発生した場合は、この記事のトラブルシューティングフローに沿って、原因の特定と対処を進めてください。

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny