exp 生成的 .dmp 無法落盤。| 技術 | 角色 | 關鍵命令 |
|---|---|---|
| Named Pipe (FIFO) | 內存緩衝通道,繞過文件系統限制 | mknod /tmp/exp_pipe p |
| compress / gzip | 流式壓縮,減少 I/O 體積 80%~90% | compress < pipe > file.Z |
| dd | 塊級拷貝/計量 | dd if=pipe of=/dev/null 統計大小 |
| expst/impst | Single-task 版 exp/imp,繞過 TNS,提速 30% | make -f $ORACLE_HOME/rdbms/lib/oracle.mk expst |
# 1. 建立管道
mknod /tmp/exp_pipe p
# 2. 啟動壓縮進程(後台讀管道寫文件)
compress < /tmp/exp_pipe > /backup/exp.dmp.Z &
# 3. exp 寫管道(前台)
exp userid=system/oracle file=/tmp/exp_pipe FULL=Y DIRECT=Y
# 4. 導入端對稱操作
mknod /tmp/imp_pipe p
zcat /backup/exp.dmp.Z > /tmp/imp_pipe & # 解壓寫管道
imp userid=system/oracle file=/tmp/imp_pipe FULL=Y
# 5. 清理
rm /tmp/exp_pipe /tmp/imp_pipe
實測:100GB 導出壓縮後約 10GB,速度提升 2 倍(CPU 換 I/O)。
# 磁帶設備通常支援 >2GB
exp userid=system/oracle file=/dev/rmt/0m VOLSIZE=4G
imp userid=system/oracle file=/dev/rmt/0m VOLSIZE=4G
VOLSIZE 指定單卷容量,自動換卷提示。
exp userid=system/oracle file=/dev/rdsk/c0t3d0s0 VOLSIZE=4G
繞過文件系統層,直接寫入分區,適合極大庫遷移。
# 編譯單任務版本
cd $ORACLE_HOME/rdbms/lib
make -f oracle.mk expst
make -f oracle.mk impst
# 使用(必須確保無其他會話連線數據庫!)
expst userid=system/oracle file=/tmp/exp_pipe FULL=Y
⚠️ 風險警告:expst/impst 繞過鎖管理,**嚴禁**在有業務連線的庫上使用,否則會導致數據字典不一致甚至庫損壞。僅限離線維護窗口。
PARALLEL=4(Data Pump),傳統 exp 需手動分表空間/用戶多進程並行。exp ... | ssh target "cat > /backup/exp.dmp" 落地目標端,省去中間存儲。| 坑點 | 現象 | 規避 |
|---|---|---|
| 管道讀寫速度不匹配 | exp 掛起或 compress 過早 EOF | 確保壓縮進程先啟動(& 後台),exp 最後啟動 |
| 磁帶換卷失敗 | 導出中斷 | 預先準備足夠磁帶,設置 VOLSIZE 略小於物理容量 |
| expst 數據不一致 | 約束違反、索引損壞 | 嚴格離線使用,導出前 SHUTDOWN IMMEDIATE; STARTUP RESTRICT |
| 字符集不匹配 | 導入亂碼 | 導出導入端設置相同 NLS_LANG,或用 Data Pump REMAP_SCHEMA |
10g+ 強烈建議改用 Data Pump:
PARALLEL=8)、壓縮(COMPRESSION=ALL)、網路模式(NETWORK_LINK)、可重啟作業。CONTENT=METADATA_ONLY 等精細控制。Named Pipe 方案雖經典,但在 64 位 OS + Data Pump 普及的今天,僅作為舊版本遷移、極端受限環境的備選方案保留。