Oracle 邏輯備份 EXP和IMP

Oracle 邏輯備份


一、概述
1、Oracle備份有3種標準方式:導出(Export、Import)、脫機備份(Offline Backup)和聯機(Archivelog)備份(Online Backup),前一種是邏輯備份,後兩種是物理備份。
2、導出方式就是邏輯備份,通過Export實用程序來實現,恢復通過Import實用程序來實現。
3、Export實用程序用來讀取數據庫(包括數據字典)和把輸出寫入一個稱爲導出轉儲文件(.dump)的二進制文件中。
4、邏輯備份恢復有三種模式:表、用戶、完全。可以導出指定表、指定用戶、整個數據庫。
5、導出期間可以選擇是否導出與表相關的數據字段信息,如權限、索引、約束等。
6、Export所寫的文件包括完全重建全部被選對象所需的命令。
7、如果執行完全導出,則導出的轉儲文件中包含所有數據庫對象,包括表空間、數據文件和用戶。
8、當在不相鄰的主要版本之間遷移數據時,應該先將數據導入到中間版本,然後再從這個版本的數據庫導入更高的版本。
9、EXP和IMP是OS級的command,在linux的shell窗口或windows的命令提示符窗口執行,在sqlplus中執行需要在前面加上host。




二、EXP和IMP的語法


1、exp


格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR) 或 TABLES=(T1:P1,T1:P2), 如果 T1 是分區表


USERID 必須是命令行中的第一個參數。


關鍵字   說明 (默認值)        
------------------------------
USERID   用戶名/口令           
FULL     導出整個文件 (N)
BUFFER   數據緩衝區大小        
OWNER    所有者用戶名列表,你希望導出哪個用戶的對象就用owner=username1,username2...
FILE     輸出文件 (EXPDAT.DMP)  
TABLES   表名列表,指定導出的table名稱,如:TABLES=table1,table2...
COMPRESS 導入到一個區 (Y)   
RECORDLENGTH   IO記錄的長度
GRANTS   導出權限 (Y)          
INCTYPE  增量導出類型,已棄用
INDEXES  導出索引 (Y)         
RECORD   跟蹤增量導出 (Y),已棄用
DIRECT   直接路徑 (N)         
TRIGGERS 導出觸發器 (Y)
LOG      屏幕輸出的日誌文件    
STATISTICS  導出分析對象的信息(ESTIMATE),還可以爲compute或者none。如果導出時出現報EXP-00091,可以考慮設置爲NONE。建議改爲none,加快導出速度,因爲分析數據可以導入後在analyze獲得。
ROWS     導出數據行 (Y)
PARFILE  參數文件名,如果你exp的參數很多,可以存成參數文件.
CONSISTENT 交叉表的一致性 (N),在導出時,將影響正在導出的表的事務設爲只讀,主要作用於嵌套表和分區表。
CONSTRAINTS  導出的約束條件 (Y)
OBJECT_CONSISTENT    只在對象導出期間設置爲只讀的事務處理 (N)
FEEDBACK             每 x 行顯示進度 (0)
FILESIZE             每個轉儲文件的最大大小
FLASHBACK_SCN        用於將會話快照設置回以前狀態的 SCN
FLASHBACK_TIME       用於獲取最接近指定時間的 SCN 的時間
QUERY                用於導出表的子集的select子句
RESUMABLE            遇到空間不足時的錯誤時掛起,默認爲N,需與 RESUMABLE_NAME和 RESUMABLE_TIMEOUT一起使用
RESUMABLE_NAME       用於標示哪個會話需要使用 RESUMABLE選項,格式爲 User USERNAME (USERID), Session SESSIONID, Instance INSTANCEID
RESUMABLE_TIMEOUT    RESUMABLE 的等待時間,默認爲7200s,如果在指定時間內未解決問題,則操作中斷
TTS_FULL_CHECK       對 TTS 執行完整或部分相關性檢查
TEMPLATE             調用 iAS 模式導出的模板名


下列關鍵字僅用於可傳輸的表空間
TABLESPACES          要導出的表空間列表,示例如下exp "'/ as sysdba'" file=t_ts.dmp tablespaces=(users,example)
TRANSPORT_TABLESPACE 導出可傳輸的表空間元數據 (N)


系統幫助請查看exp help=y


2、imp


格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N 或 TABLES=(T1:P1,T1:P2), 如果 T1 是分區表


USERID 必須是命令行中的第一個參數。


關鍵字   說明 (默認值)        
------------------------------
USERID   用戶名/口令
FULL     導入整個文件 (N)
BUFFER   數據緩衝區大小        
FROMUSER 所有者用戶名列表
FILE     輸入文件 (EXPDAT.DMP)
TOUSER   用戶名列表
SHOW     只列出文件內容 (N)     
TABLES   表名列表
IGNORE   忽略創建錯誤 (N)    
RECORDLENGTH  IO 記錄的長度
GRANTS   導入權限 (Y)          
INCTYPE  增量導入類型
INDEXES  導入索引 (Y)         
COMMIT   提交數組插入 (N),即在每插入完一個對象後提交。
ROWS     導入數據行 (Y)        
PARFILE  參數文件名
LOG      屏幕輸出的日誌文件    
CONSTRAINTS    導入限制 (Y)
DESTROY                覆蓋表空間數據文件 (N)
INDEXFILE              將表/索引信息寫入指定的文件,不進行導入操作而是將創建對象的文本保存到文件中,可以通過編輯使用該文本文件創建數據庫對象
SKIP_UNUSABLE_INDEXES  跳過不可用索引的維護 (N)
FEEDBACK               每 x 行顯示進度 (0)
TOID_NOVALIDATE        跳過指定類型 ID 的驗證
FILESIZE               每個轉儲文件的最大大小
STATISTICS             始終導入預計算的統計信息,默認是always,建議制定爲none,之後再analyze,這樣加快導入速度。
RESUMABLE              在遇到有關空間的錯誤時掛起 (N)
RESUMABLE_NAME         用來標識可恢復語句的文本字符串
RESUMABLE_TIMEOUT      RESUMABLE 的等待時間
COMPILE                編譯過程, 程序包和函數 (Y)
STREAMS_CONFIGURATION  導入流的一般元數據 (Y)
STREAMS_INSTANTIATION  導入流實例化元數據 (N)


下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE 導入可傳輸的表空間元數據 (N)
TABLESPACES 將要傳輸到數據庫的表空間
DATAFILES 將要傳輸到數據庫的數據文件
TTS_OWNERS 擁有可傳輸表空間集中數據的用戶


系統幫助請查看imp help=y


如何使exp的幫助以不同的字符集顯示:set nls_lang=simplified chinese_china.zhs16gbk,通過設置環境變量,可以讓exp的幫助以中文顯示,
如果set nls_lang=American_america.字符集,那麼幫助就是英文的了


3、常用參數說明


3.1、FULL
說明:這個用於導出整個數據庫,在ROWS=N一起使用時,可以導出整個數據庫的結構。
例如:exp userid=test/test file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y


3.2、 OWNER和TABLE
說明:這兩個選項用於定義EXP的對象。OWNER定義導出指定用戶的對象;TABLE指定EXP的table名稱。
例如:exp userid=test/test file=./db_str.dmp log=./db_str.log owner=duanl
exp userid=test/test file=./db_str.dmp log=./db_str.log table=nc_data,fi_arap


3.2、BUFFER和FEEDBACK
說明:在導出比較多的數據時,我會考慮設置這兩個參數。
例如:exp userid=test/test file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT


3.4、FILE和LOG
說明:這兩個參數分別指定備份的DMP名稱和LOG名稱,包括文件名和目錄,例子見上面。


3.5、COMPRESS
說明:參數不壓縮導出數據的內容。用來控制導出對象的storage語句如何產生。默認值爲Y,使用默認值,對象的存儲語句的init extent等於當前導出對象的extent的總和。
推薦使用COMPRESS=N。


3.6、FILESIZE
說明:該選項在8i中可用。如果導出的dmp文件過大時,最好使用FILESIZE參數,限制文件大小不要超過2G。
例子:exp userid=duanl/duanl file=f1,f2,f3,f4,f5 filesize=2G owner=scott
這樣將創建f1.dmp, f2.dmp等一系列文件,每個大小都爲2G,如果導出的總量小於10G,EXP不必創建f5.bmp.


3.7、FROMUSER和TOUSER
說明:使用它們實現將數據從一個SCHEMA中導入到另外一個SCHEMA中。要注意,導入時的用戶需要有imp_full_database角色
例如:假設我們做exp時導出的爲test的對象,現在我們想把對象導入用戶:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1
$imp system/manager file=tank log=tank fromuser=(seapark,amy) touser=(seapark1, amy1)


3.8、IGNORE、
說明:IGNORE參數將忽略表的存在,繼續導入,這個對於需要調整表的存儲參數時很有用,我們可以先根據實際情況用合理的存儲參數建好表,然後直接導入數據。
Oracle在恢復數據的過程中,當恢復某個表時,該表已經存在,就要根據ignore參數的設置來決定如何操作。
若ignore=y,Oracle不執行CREATE TABLE語句,直接將數據插入到表中,如果插入的記錄違背了約束條件,比如主鍵約束,則出錯的記錄不會插入,但合法的記錄會添加到表中。
若ignore=n,Oracle不執行CREATE TABLE語句,同時也不會將數據插入到表中,而是忽略該表的錯誤,繼續恢復下一個表。 -
注意:如果表中的字段並沒有唯一性約束,那麼在使用ignore=y的情況下很有可能插入重複數據。


3.9、INDEXES
說明:如果想使用新的存儲參數重建索引,或者爲了加快到入速度,我們可以考慮將INDEXES設爲N,N的話表上的索引不會被恢復,但是對 LOB 索引, OID索引和 主鍵索引等系統自動生成的索引將無條件恢復。
例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N


3.10、direct
說明:direct=y爲直接導出,=n爲傳統導出。
傳統導出爲direct=n datafile---->sga----->pga----->dump
直接導出爲direct=y datafile---->pga----->dump (跳過SQL語句處理引擎)
直接模式更快,導出性能主要由RECORDLENGTH決定,RECORDLENGTH設置爲操作系統I/O的block size或者是DB_BLOCK_SIZE的整數倍例如65535。
有一些參數於direct=y不兼容,無法用直接路徑導出可移動的tablespace,或者用query參數導出數據庫子集。當導入導出的數據庫運行在不同的os下時,必須保證recordlength參數的值一致.


Direct Path導出模式只能使用命令行或者參數文件的方式來導出,不能使用交互式的方式導出數據,只有Conventional Path導出模式可以使用交互式的方式。
Direct Path導出模式不能用於導出傳輸表空間,即設置參數TRANSPORT_TABLESPACES=Y,其他的FULL、USER、TABLE模式均可以使用Direct Path導出模式。


Exp工具中的QUERY參數只能用於Conventional Path導出模式,QUERY參數允許導出一個表的滿足一定條件的部分記錄。
Exp工具中的BUFFER參數只能用於傳統模式導出,BUFFER參數設置了用於fetch記錄的緩存的大小,以字節爲單位,即在array中最大數量的記錄。


3.11、RECORDLENGTH
參數RECORDLENGTH指定文件記錄的最大長度,以字節爲單位,即導出I/O的buffer,定義了Export I/O緩衝的大小,最大爲65535。
這個參數決定了在沒寫入導出文件中緩存中堆積數據的多少。如果沒有設置這個參數,取決於操作系統平臺,在大多數平臺的默認值是1024字節。


3.12、parfile
使用parfile參數可以對頻繁進行的導出操作進行反覆調用,同時也可以避免不同操作系統之間需要對特定字符進行轉義的煩惱,如下例
exp hr/hr parfile=parfile 
$cat parfile 
file=t_p.dmp
compress=y
rows=y
tables=employees
statistics=none
query="where hire_date>to_date('1999-01-01','yyyy-mm-dd')" 


3.12、commit
默認值爲 COMMIT=N,即在每插入完一個對象後提交。當COMMIT=Y時候是根據你BUFFER的大小決定每次提交的數量。對於包含了LONG、RAW、DATE等類型的表,不論BUFFER設置多大,都是每插入一行進行提交。
設置commit=y可以防止減少回滾段的壓力,但由於頻繁提交,會帶來性能 上的影響,推薦使用COMMIT=N。




三、EXP和IMP的三種模式


1、EXP
1.1、完全模式
說明:整個庫的所有對象被備份到文件。
例子1:exp system/mana@26DWDQ file=c:\full.dmp full=y
例子2:exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 full=y  file=exp_.dmp log=exp.log


1.2、用戶模式
說明:用戶的所有對象被備份到文件。
例子1:exp system/mana@26DWDQ file=c:\sonic.dmp owner=sonic,zdqmp
例子2:exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536 feedback=100000 file=exp.dmp log=exp.log


1.3、表模式
說明:用戶的表被備份到文件。
例子1:exp gzdqmp/gzdqmp_123@26DWDQ file=d:\sonic.dmp tables=aa query=\" where name like '%00%'\"
例子2:exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 file=exp.dmp log=exp.log tables=tab1,tab2,tab3


2、IMP
2.1、完全模式
說明:把文件裏所有的表導入,如果恢復的表存在就會報錯,這時需要加參數ignore=y
例1:imp mid_gis/mid_gis@IP_address/orcl file =E:\topway\1505\TABLE4.DMP full=y
例2:imp mid_sc/mid_sc@IP_address/orcl IGNORE=y statistics=none file=F:\Downloads\dis_device_0320_150603.dmp log=F:\Downloads\dis_device_0320_150603imp.log full=y
例3:imp system/manager rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y volsize=0 full=y file=exp.dmp log=imp.log 


2.2、用戶模式
說明:必須指定FROMUSER、TOUSER參數,這樣才能導入數據。如果恢復的表存在就會報錯,需要加參數ignore=y
例1:imp sonic/sonic@26DWDQ file=c:\sonic.dmp owner=sonic fromuser=sonic touser=sonic
例2:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n file=exp.dmp log=imp.log
例3:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=exp.dmp log=imp.log tables=t1,t2,t3;


2.3、表模式
說明:如果恢復的表存在就會報錯,需要加參數ignore=y
例1:imp sonic/sonic@26DWDQ file=c:\sonic.dmp owner=sonic tables=(temp_kk)
例2:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n file=exp.dmp log=imp.log full=y


3、表空間傳輸
3.1.設置表空間爲只讀(假定表空間名字爲APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
3.2.發出EXP命令
SQL>host exp userid=”””sys/password as sysdba””” 
transport_tablespace=y tablespace=(app_data, app_index)
3.3.拷貝數據文件到另一個地點,即目標數據庫
可以是cp(unix)或copy(windows)或通過ftp傳輸文件(一定要在bin方式)
3.4.在目標數據庫附加該數據文件
imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y “datafile=(c:\temp\app_data,c:\temp\app_index)”
3.5.設置目標數據庫表空間爲讀寫
alter tablespace app_data read write;
alter tablespace app_index read write;




四、exp/imp 的優化


1、使用直接路徑direct=y
說明:適用於exp、imp
oracle會避開sql語句處理引擎,直接從數據庫文件中讀取數據,然後寫入導出文件。
有一些參數於direct=y不兼容,無法用直接路徑導出可移動的tablespace,或者用query參數導出數據庫子集。
當導入導出的數據庫運行在不同的os下時,必須保證recordlength參數的值一致。


2、避免磁盤排序
說明:適用於imp。將sort_area_size設置爲一個較大的值,比如100M


2.避免日誌切換等待
說明:適用於imp。增加重做日誌組的數量,增大日誌文件大小.


3.優化日誌緩衝區
說明:適用於imp。比如將log_buffer容量擴大10倍(最大不要超過5M)


4.使用陣列插入與提交
說明:適用於imp。commit = y
注意:陣列方式不能處理包含LOB和LONG類型的表,對於這樣的table,如果使用commit = y,每插入一行,就會執行一次提交.


5.使用NOLOGGING方式減小重做日誌大小
說明:適用於imp。在導入時指定參數indexes=n,只導入數據而忽略index,在導完數據後在通過腳本創建index,指定 NOLOGGING選項




五.常見問題及解決方法
1、數據庫對象已經存在
一般情況, 導入數據前應該徹底刪除目標數據下的表, 序列, 函數/過程,觸發器等;  數據庫對象已經存在, 按缺省的imp參數, 則會導入失敗如果用了參數ignore=y, 會把exp文件內的數據內容導入如果表有唯一關鍵字的約束條件, 不合條件將不被導入;如果表沒有唯一關鍵字的約束條件, 將引起記錄重複。


2、數據庫對象有主外鍵約束
不符合主外鍵約束時, 數據會導入失敗,
解決辦法: 先導入主表, 再導入依存表
disable目標導入對象的主外鍵約束, 導入數據後, 再enable它們


3、權限不夠
如果要把A用戶的數據導入B用戶下, A用戶需要有imp_full_database權限


4、導入大表( 大於80M ) 時, 存儲分配失敗
默認的EXP時, compress = Y, 也就是把所有的數據壓縮在一個數據塊上.
導入時, 如果不存在連續一個大數據塊, 則會導入失敗. 導出80M以上的大表時, 記得compress= N, 則不會引起這種錯誤.


5、imp和exp使用的字符集不同
如果字符集不同,導入會失敗,可以改變unix環境變量或者NT註冊表裏NLS_LANG相關信息,導入完成後再改回來.
對於單字節字符集(例如US7ASCII),恢復時,數據庫自動轉換爲該會話的字符集(NLS_LANG參數);
對於多字節字符集(例如ZHS16CGB231280),恢復時,應儘量使字符集相同(避免轉換),如果要轉換,目標數據庫的字符集應是輸出數據庫字符集的超集。
在EXP/IMP過程中我們需要注意四個字符集的參數:導出端的客戶端字符集,導出端數據庫字符集,導入端的客戶端字符集,導入端數據庫字符集。
select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET'當前數據庫端的字符集;
客戶端字符集的參數爲NLS_LANG,
在windows中,查詢和修改NLS_LANG可在註冊表中進行:HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\
xx指存在多個Oracle_HOME時的系統編號。控制客戶端應用程序使用的字符集。通常設置或等於客戶端的代碼頁。或者對於unicode應用設爲UTF8。
在unix中:
$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK
修改可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8


6、imp和exp版本不能往上兼容
可以從低版本導入高版本,但從高版本導入到低版本就非常麻煩,10g後此類問題得到改善。
必須正確地使用EXP和IMP的版本: 
1、總是使用IMP的版本匹配數據庫的版本,如:要導入到817中,使用817的IMP工具。
2、總是使用EXP的版本匹配兩個數據庫中最低的版本,如:從9201往817中導入,則使用817版本的EXP工具。


7、ORA-20005: object statistics are locked (stattype = ALL) 和 ORA-38029: 對象統計信息已鎖定
原因:多由不同版本的Oracle中exp、imp中引起,或者同版本不同字符集。
說明:報這個錯誤是因爲導入的時候imp的時候無法統計信息,如果用了STATISTICS=NONE則日誌中不會顯示此類錯誤信息,
但STATISTICS=always(默認)則在log文件或命令行窗口中顯示ORA-20005。analyze table的時候則會報ORA-38029。
解決辦法是先解鎖DBMS_STATS.UNLOCK_TABLE_STATS('MID_SC','DM_OLD_FEATURE_VALUE');再analyze。




另外如果dmp文件不是太大,可以編輯的話,用類似UE工具打開,修改裏面高版本的版本號爲低的就能導入了。




參考文獻:http://blog.csdn.net/tianlesoftware/article/details/4718366
參考文獻:http://blueicer.blog.51cto.com/395686/101600/
參考文獻:http://czmmiao.iteye.com/blog/1522278
發佈了65 篇原創文章 · 獲贊 24 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章