首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 資料庫備份與恢復總結:exp/imp 工具完整指南

     編輯:Oracle 資料庫基礎

1.1 基本命令

1. 獲取幫助

$ exp help=y
$ imp help=y

2. 三種工作模式

  • 互動式模式: 執行 exp 後依提示輸入參數。
  • 命令列模式: 直接在指令中帶入參數,例如:
    $ exp user/pwd@dbname file=/Oracle/test.dmp full=y
  • 參數檔模式: 將參數寫入檔案(如 username.par),再以 exp parfile=username.par 執行。參數檔範例:
    userid=username/userpassWord
    buffer=8192000
    compress=n
    grants=y
    file=/Oracle/test.dmp
    full=y

3. 三種匯出/匯入模式

(1) 表模式

匯出:

# 匯出單張或多張表
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2

# 匯出表的部分資料(使用 WHERE 條件)
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query="where col1='...' and col2 < ..."

匯入:

$ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 fromuser=dbuser touser=dbuser2 commit=y ignore=y

(2) 使用者模式

匯出:

# 匯出指定使用者的所有物件與資料
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx, yy)

# 僅匯出結構,不匯出資料
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n

匯入:

$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 commit=y ignore=y

(3) 全庫模式

匯出:

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=y

匯入:

$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 commit=y ignore=y

1.2 進階選項

1. 分割成多個檔案

適用於大資料量導致單一 dump 檔超過檔案系統限制的情況。

# 匯出至多個固定大小檔案
$ exp user/pwd file=1.dmp,2.dmp,3.dmp filesize=1000m log=xxx.log full=y

# 匯入多個檔案
$ imp user/pwd file=1.dmp,2.dmp,3.dmp filesize=1000m tables=xxx fromuser=dbuser touser=dbuser2 commit=y ignore=y

2. 增量匯出/匯入

注意: Oracle 9i 之後 exp 不再支援 inctype 參數;必須以 SYS 或 SYSTEM 執行。

  • 完全增量導出: inctype=complete(備份整個資料庫)
  • 增量型導出: inctype=incremental(導出上次備份後變更的資料)
  • 累計型導出: inctype=cumulative(導出自上次完全導出後所有變更)

增量匯入: imp usr/pwd FULL=y inctype=system/restore/inctype

  • SYSTEM:導入系統物件
  • RESTORE:導入所有使用者物件

3. 以 SYSDBA 執行匯出/匯入

用於 Oracle 技術支援或表空間傳輸。

$ imp 'usr/pwd@instance as sysdba' tablespaces=xx transport_tablespace=y file=xxx.dmp datafiles=xxx.dbf
$ imp file=expdat.dmp userid="sys/passWord as sysdba" transport_tablespace=y datafile=("c:tempapp_data","c:tempapp_index")

4. 表空間傳輸(速度快)

將資料檔直接附加到目標資料庫,避免轉換為 dmp 檔,速度極快。

傳輸規則(10g 前)

  • 源/目標資料庫需相同硬體平台、字元集、資料區塊大小。
  • 目標資料庫不可有同名表空間;SYS 物件不可遷移。
  • 必須傳輸自包含的物件集;物化視圖、函數索引等不可傳輸。

10g 支援跨平台傳輸(需相同位元組序),配合 RMAN 轉換檔案格式。

檢測表空間是否可傳輸

SQL> exec sys.dbms_tts.transport_set_check('tablespace_name', true);
SQL> select * from sys.transport_set_violations;

若無資料回傳,表示符合條件。

簡要操作步驟

  1. 設定表空間為唯讀:alter tablespace app_data read only;
  2. 執行 EXP:host exp userid="sys/passWord as sysdba" transport_tablespace=y tablespaces=(app_data, app_index)
  3. 複製 .dbf 與 .dmp 檔至目標端(二進位模式 FTP)。
  4. 源端表空間改回讀寫:alter tablespace app_data read write;
  5. 目標端匯入:imp file=expdat.dmp userid="sys/passWord as sysdba" transport_tablespace=y datafiles=("c:\app_data.dbf","c:\app_index.dbf") tablespaces=app_data,app_index tts_owners=hr,oe
  6. 目標端表空間設為讀寫。

1.3 效能優化

1. 加快 exp 速度

  • 調大 large_pool_size。
  • 使用直接路徑:direct=y(繞過記憶體整合檢查)。
  • 設定較大 buffer(大物件導出時小 buffer 會失敗)。
  • 匯出檔勿置於 Oracle 使用的磁碟機或 NFS 檔案系統。
  • Unix 環境可用管道模式直接導入導出提升效能。

2. 加快 imp 速度

  • 先建 indexfile,資料匯入完成後再建索引。
  • 匯入檔置於不同磁碟機;增加 DB_BLOCK_BUFFERS、LOG_BUFFER。
  • 以非歸檔模式執行:ALTER DATABASE NOARCHIVELOG;
  • 建立大型表空間與回滾段,離線其他回滾段,回滾段大小設為最大表的 1/2。
  • 使用 COMMIT=N、ANALYZE=N;單用戶模式匯入。
  • Unix 管道模式同樣適用。

3. Unix/Linux PIPE 管道加速

管道匯出(含壓縮)

$ mknod /home/exppipe p
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz
$ rm -rf /home/exppipe

完整備份腳本範例(含 tar 寫入磁帶)見原文。

管道匯入

$ mknod /home/exppipe p
$ imp test/test file=/home/exppipe fromuser=test touser=Macro & gunzip < exp.dmp.gz > /home/exppipe
$ rm -fr /home/exppipe

4. 全庫匯入一般步驟

  1. 先以 rows=n 匯入結構:imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n
  2. 停用觸發器、刪除 PK/UK:透過腳本產生 drop_pk_u.sql、disable_trigger.sql 並執行。
  3. 以 ignore=y 全庫匯入資料:imp system/manager file=exp.dmp log=imp.log full=y ignore=y
  4. 重建索引、PK,啟用觸發器。

1.4 常見問題

1. 字元集問題

Oracle 字元集分為資料庫端(建庫時設定,存於 props$)與客戶端(NLS_LANG 環境變數/註冊表)。若兩端字元集不兼容,導出/導入資料會亂碼。

修正 dmp 檔字元集技巧: 用二進位編輯器開啟 dmp,取第 2、3 位元組(如 00 01),轉十進位(1),查 NLS_CHARSET_NAME(1) 得知原字元集(如 US7ASCII)。欲轉為 ZHS16GBK,查 NLS_CHARSET_ID('ZHS16GBK') 得 852,轉十六進位 03 54,覆蓋原位元組即可。

2. 版本相容性

  • IMP 版本必須符合目標資料庫版本。
  • EXP 版本採兩庫中較低版本。
  • imp 可導入低版本 exp 產生的檔案,不可導入高版本產生的檔案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved