| 參數 | 預設值 | 說明 | 風險 |
| TABLE_EXISTS_ACTION | SKIP | 目標表存在時動作:SKIP/APPEND/TRUNCATE/REPLACE | TRUNCATE 會清空目標表資料;REPLACE 會 DROP 再建 |
| TABLES | 全部 | 指定要匯入的表清單 | 未指定則匯入檔案中所有表 |
| CONTENT | ALL | DATA_ONLY / METADATA_ONLY / ALL | 配合 TABLES 精確控制範圍 |
正確還原單表語法:
impdp user/pass@db DIRECTORY=dp_dir DUMPFILE=exp_20240115.dmp \
TABLES=target_table TABLE_EXISTS_ACTION=APPEND CONTENT=DATA_ONLY
緊急恢復實戰步驟 (6 小時)
- 大小表分離策略:大表先
DROP INDEX → IMPDP DATA_ONLY → 重建索引;小表直接匯入。
- 大表 A (複合分區表) 匯入卡住 1.5hr 無反應:
- 重啟資料庫無效。
- 靈感:將分區表
RENAME → CTAS 建立普通表 → 匯入普通表 (秒級完成) → INSERT INTO ... SELECT 導回分區表 → RENAME 恢復原名。
- 中表 B 等待鎖定 (DW01 背景程序):
ALTER SYSTEM KILL SESSION 標記 kill 但不釋放。
- 鎖定 Session 屬於
XDB schema,鎖定 XDB 用戶無效。
- 發現 Module =
Data Pump,非核心背景程序。
- 關鍵招:Windows 平台
orakill sid thread_id 強制殺掉 OS 執行緒 (Linux 對應 kill -9 spid) → 匯入立即恢復。
- 索引重建:所有表匯入完成後,同步重建索引。
- 統計資訊收集:
DBMS_STATS.GATHER_TABLE_STATS 全庫執行。
- 驗證:逐表核對筆數、索引狀態、約束狀態。
- 建立定時備份職務:防止重蹈覆轍。
Impdp 實戰最佳實踐總結
- 永遠指定 TABLES:明確列出要匯入的表,絕不依賴預設全匯入。
- TABLE_EXISTS_ACTION 謹慎選擇:還原資料用
APPEND;重建結構用 REPLACE (需確認無關聯);嚴禁生產環境用 TRUNCATE。
- 大表分區表特殊處理:考慮轉普通表匯入再導回,避開分區鎖定/效能問題。
- 背景程序鎖定排查:
V$SESSION 看 MODULE、BLOCKING_SESSION,非核心程序可 OS 層級殺掉。
- 備份檔案定期演練恢復:未測試過的備份 = 沒有備份。
- 變更管理流程:任何生產操作需審批、雙人確認、可回滾腳本準備就緒。
關鍵查詢腳本 (事故排查常用)
-- 找阻塞鏈
SELECT s.sid, s.serial#, s.username, s.module, s.blocking_session, o.object_name
FROM v$session s LEFT JOIN dba_objects o ON s.row_wait_obj# = o.object_id
WHERE s.blocking_session IS NOT NULL;
-- 找 Data Pump 作業
SELECT job_name, state, degree, attached_sessions
FROM dba_datapump_jobs;
-- OS 進程對應 (Linux)
SELECT s.sid, s.serial#, p.spid, s.module
FROM v$session s JOIN v$process p ON s.paddr = p.addr
WHERE s.module LIKE '%Data Pump%';
這次事故雖然慘痛,但徹底檢視了 Impdp 參數陷阱、分區表匯入技巧、OS 層級進程管理,成為團隊寶貴的實戰資產。
- 上一篇文章: Oracle 備份恢復批次檔三大實用建議
- 下一篇文章: Oracle 資料庫系統架構總體圖解析
Copyright ©
程式碼之家 All Rights Reserved