一、DMP文件基礎知識??
1. ??DMP文件定義??
DMP(Data Pump Dump File)
是Oracle數據庫專用的二進制格式文件,由expdp/impdp
或舊版exp/imp
工具生成。它包含數據庫對象的元數據(表結構、索引等)和實際數據,是數據備份、遷移和恢復的核心載體。
2. ??DMP文件結構??
- ?? 文件頭??:記錄Oracle版本、字符集、導出時間等元信息。
- ??數據段??:存儲表數據,按數據塊組織,支持并行讀寫。
- ??索引段??:加速數據檢索的索引信息,包含校驗和等完整性標記。
- ??數據字典??:定義表、視圖、存儲過程等對象的元數據。
3. ?核心功能??
- ??全量備份??:導出整個數據庫或指定用戶的所有對象。
- ??增量同步??:僅導出變更數據,減少傳輸量(需結合日志)。
- ??跨平臺遷移??:支持不同Oracle版本、操作系統間的數據傳輸。
4. 生成工具??
- ??傳統工具??:exp(導出)和imp(導入),適用于Oracle 10g及以下版本。
- ??數據泵工具??:expdp和impdp,提供并行處理、壓縮等高級特性(Oracle 10g+推薦)
二、DMP文件導出實戰??
1. ??數據泵導出(expdp)??
(1)語法
expdp system/password@ORCL directory=DATA_PUMP_DIR dumpfile=20250520_full.dmp logfile=export.log schemas=HR,SCOTT parallel=4 compression=all encryption=password:oracle123
??關鍵參數??:
- directory:預先創建的Oracle目錄對象(需關聯物理路徑)。
- schemas:指定導出用戶,多用戶用逗號分隔。
- parallel:并行線程數,提升大庫導出速度。
- compression:減少文件體積(可選all/data/metadata)。
- encryption:加密保護敏感數據(支持密碼或密鑰)。
- log: 日志路徑
(2) 示例
- 查詢 Oracle 預先創建的Oracle目錄對象
select * from dba_directories;
- 創建指定的 Oracle 目錄對象(關聯物理路徑)
create directory testdir as 'D:\OracleDMP';
- 手動創建物理目錄 D:\OracleDMP
- 將這個目錄指給用戶(TEST_FORMAL)
SQL> grant read,write on directory testdir to TEST_FORMAL;
- 執行導出命令
--導出指定表 USER_TEMP,USER_TEMP2
expdp TEST_FORMAL/MyPassword@ORCL directory=testdir dumpfile=test.dmp logfile=exp.log tables=USER_TEMP,USER_TEMP2
-- 導出整庫
expdp TEST_FORMAL/MyPassword@ORCL directory=testdir dumpfile=test.dmp logfile=exp.log
2. ??傳統導出(exp)??
語法
exp system/password@ORCL file=/backup/legacy.dmp owner=HR buffer=102400 rows=y consistent=ylog= /backup/exp.log
示例:
--導出指定表 USER_TEMP,USER_TEMP2
exp TEST_FORMAL/MyPassword@ORCL file=D:\OracleDMP\test.dmp tables=(USER_TEMP,USER_TEMP2) log=D:\OracleDMP\exp.log --導出整庫
exp TEST_FORMAL/MyPassword@ORCL file=D:\OracleDMP\test.dmp log=D:\OracleDMP\exp.log
??適用場景??:低版本數據庫或簡單備份需求。
三、DMP文件導入實戰??
1. ??數據泵導入(impdp)??
impdp system/password@NEWDB directory=DATA_PUMP_DIR dumpfile=20250520_full.dmp remap_schema=HR:NEW_HR remap_tablespace=USERS:NEW_USERS transform=segment_attributes:n exclude=statistics
??關鍵參數??:
- directory:
預先創建的Oracle目錄對象
(需關聯物理路徑)。 - remap_schema:用戶重映射(原用戶→目標用戶)。
- remap_tablespace:調整表空間分配49。
- transform:忽略存儲參數沖突(如storage子句)。
- exclude/include:過濾對象類型(如排除統計信息)。
2. ??傳統導入(imp)??
imp system/password@NEWDB file=/backup/legacy.dmp fromuser=HR touser=NEW_HR ignore=y commit=y
??注意事項??:需手動創建目標用戶和表空間。
1.核心參數說明
參數 | 作用說明 | 示例 |
---|---|---|
USERID | 指定數據庫連接憑證(格式:用戶名/密碼@服務名 ) | USERID=system/oracle@ORCL |
FILE | 指定要導入的DMP文件路徑 | FILE=/data/full.dmp |
FULL | 全庫導入(需IMP_FULL_DATABASE 權限) | FULL=Y |
FROMUSER/TOUSER | 用戶重定向(將原用戶數據導入目標用戶) | FROMUSER=HR TOUSER=NEW_HR |
TABLES | 指定導入的表(支持多表或分區表) | TABLES=(EMP,DEPT) 或 TABLES=(T1:P1,T1:P2) |
ROWS | 是否導入數據行(默認Y 導入數據,N 僅導入結構) | ROWS=N (僅導入DDL) |
IGNORE | 忽略對象創建錯誤(如重復表/索引,默認N 報錯) | IGNORE=Y (跳過沖突繼續執行) |
COMMIT | 提交頻率(默認N 批量提交,Y 逐行提交) | COMMIT=Y (適用于大事務回滾控制) |
LOG | 指定日志文件路徑 | LOG=/logs/imp.log |
INDEXFILE | 將DDL語句寫入指定文件(用于調試) | INDEXFILE=ddl.sql |
2. 高級參數擴展
???
參數 | ??適用場景 |
---|---|
DESTROY=Y | 覆蓋已有表空間文件(慎用) |
GRANTS=N | 跳過權限導入(如僅需數據) |
RECORDLENGTH=65535 | 調整I/O緩沖區大小(優化大數據量導入性能) |
PARFILE | 從參數文件讀取配置(簡化復雜命令) |
3.傳統導入(IMP)的三種模式??
1. 完全導入模式(FULL=Y)??
??定義??:導入整個DMP文件中的所有對象(用戶、表、索引等)。
??命令示例??:
imp system/oracle@ORCL FILE=full.dmp FULL=Y IGNORE=Y LOG=imp_full.log
??適用場景??:數據庫整體遷移或災難恢復。
??注意事項??:
需提前創建目標庫的表空間和用戶
目標庫字符集
必須與DMP文件一致(通過NLS_LANG
環境變量控制)
??2. 用戶模式導入(FROMUSER/TOUSER)??
??定義??:將指定用戶的數據導入到另一用戶(支持跨用戶映射)。
??命令示例??:
imp system/oracle@ORCL FILE=hr.dmp FROMUSER=HR TOUSER=NEW_HR LOG=imp_hr.log
適用場景??:用戶數據遷移或測試環境克隆。
??注意事項??:
目標用戶需提前創建
并分配權限
若表空間不同需配合REMAP_TABLESPACE(僅數據泵支持,傳統IMP需手動處理)
??3. 表模式導入(TABLES=)??
??定義??:選擇性導入特定表或分區。
??命令示例??:
imp scott/tiger@ORCL FILE=emp.dmp TABLES=(EMP,DEPT) IGNORE=Y LOG=imp_tables.log
??適用場景??:局部數據恢復或表結構同步。
??注意事項??:
支持通配符%(如TABLES=(EMP%)導入EMP開頭的表)
分區表需指定分區名(如TABLES=(SALES:Q1_2025))5
四、高級優化策略??
1. ??性能調優??
??并行處理??:parallel=8(建議不超過CPU核心數)。
??網絡壓縮??:network_link=… compression=data(遠程同步)。
??分段導出??:按表分區或日期范圍分批操作。
2. ??增量同步??
??策略選擇??:
- ??全量同步??:首次遷移或數據一致性要求高時使用。
- ??增量同步??:定期追加變更數據(需配合日志)。
??代碼示例??:
expdp system/password@ORCL directory=dpump_dir dumpfile=incr_%U.dmp schemas=HR content=data_only query="WHERE update_time>SYSDATE-1"
五、問題總結
1. 通過 exp 命令導出,使用 impdp 命令無法導入;
Oracle 中 因為版本問題或命令問題處理時,我們要 查看原始 導出日志文件,當使用的是 exp 模式導出的數據,應當用 imp 模式導入;
導出日志文件一般格式如下 ,例如 a.log:
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Tes
Export done in UTF8 character set and UTF8 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)About to export specified tables via Conventional Path ...
Current user changed to SYSTEM
. . exporting table USER_EXPORT 19138328 rows exported
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.
從日志文件我們可以分析出,
- 原始數據導出的 Oracle 版本為
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- 原始數據導出的 Oracle
character 為 AL32UTF8
- 原始數據導出的 Oracle 命令為
EXP
- 原始數據導出的表(exporting table )為
USER_EXPORT
- 原始數據導出的用戶(Current user)為
SYSTEM
2. 源數據導出環境為 AL32UTF8 ,目標環境為 ZHS16GBK ,導致命令無法執行或數據亂碼;
導入數據時,必須保證兩個平臺的 字符集一致,若不一致,會導致出現導入失敗問題,解決方法為
設置 Oracle 環境變量的方式解決,具體可以參考博文 Oracle 字符集簡介及修改操作實戰