常用的oracle數據庫備份(導入/導出)有兩種,分別是exp/imp和expd/impd,前者是Orace早期版本帶有的導入導出工具,后者是Oracle10g后出現的,下面進行分別介紹!
1.exp/imp
三種導入導出類型
Oracle支持三種導入導出類型分別是
表方式(T方式),用戶方式(U方式),全庫方式(Full方式)
A: 表方式(T方式)
備份(exp)某個用戶模式下指定的對象(表),
exp guwei/ai123456@10.21.19.63/orcl rows=y indexes=n compress=n buffer=50000000 file=exp_table.dmp log=exp_table.log tables=USER_INFO,POLICY_INFO
恢復(imp)備份數據中的指定表,
imp yuwen/ai123456@10.21.13.14/orcl fromuser=guwei touser=yuwen rows=y indexes=n commit=y buffer=50000000 ignore=n file=exp_table.dmp log=exp_table.log tables=USER_INFO,POLICY_INFO
B:用戶方式(U方式)
備份(exp)某個用戶模式下的所有對象,
exp jnth/thpassword@oracle owner=guwei rows=y indexes=n compress=n buffer=50000000 file=exp_table.dmp log=exp_table.log
恢復(imp)備份數據的全部內容,
imp yuwen/ai123456@10.21.13.14/orcl fromuser=guwei touser=yuwen rows=y indexes=n commit=y buffer=50000000 ignore=n file=exp_table.dmp log=exp_table.log
恢復(imp)備份數據中的指定表,
imp yuwen/ai123456@10.21.13.14/orcl fromuser=guwei touser=yuwen rows=y indexes=n commit=y buffer=50000000 ignore=n file=exp_table.dmp log=exp_table.log tables=USER_INFO,POLICY_INFO
C:全庫方式(Full方式)
備份(exp)完整的數據庫,
exp system/systempassword@oracle rows=y indexes=n compress=n buffer=50000000 full=y file=exp_table.dmp log=exp_table.log
導入(imp)完整數據庫,
imp system/systempassword@oracle rows=y indexes=n commit=y buffer=50000000 ignore=y full=y file=exp_table.dmp log=exp_table.log
導出導入的優缺點
優點:
- 簡單易行;
- 可靠性高;
- 不影響數據庫的正常運行。
缺點:
- 只能提供到"某一時間點上"的恢復,不能最大可能的恢復數據;
- 數據量大時,恢復較慢。
導出exp參數說明
參數名 | 說明 | 默認值 |
---|---|---|
USERID | 用戶名/口令 | |
FULL | 導出整個文件 | N |
BUFFER | 數據緩沖區的大小 | |
OWNER | 導出指定的所有者用戶名列表 | |
FILE | 輸出文件 | (EXPDAT.DMP) |
TABLES | 導出指定的表名列表 | |
COMPRESS | 是否壓縮導出的文件 | Y |
RECORDLENGTH | IO 記錄的長度 | |
GRANTS | 導出權限 | Y |
INCTYPE | 增量導出類型 | |
INDEXES | 導出索引 | Y |
RECORD | 跟蹤增量導出 | Y |
ROWS | 導出數據行 | Y |
PARFILE | 參數文件名 | |
CONSTRAINTS | 導出限制 | Y |
CONSISTENT | 交叉表一致性 | |
LOG | 屏幕輸出的日志文件 | |
STATISTICS | 分析對象(ESTIMATE) | |
DIRECT | 直接路徑 | N |
TRIGGERS | 導出觸發器 | Y |
FEEDBACK | 顯示每 x 行 (0) 的進度 | |
FILESIZE | 各轉儲文件的最大尺寸 | |
QUERY | 選定導出表子集的子句 | |
TRANSPORT_TABLESPACE | 導出可傳輸的表空間元數據 | N |
TABLESPACES | 導出指定的表空間列表 |
導入imp參數說明
參數名 | 說明 | 默認值 |
---|---|---|
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 行顯示進度 | |
TOID_NOVALIDATE | 跳過指定類型 ID 的驗證 | |
FILESIZE | 每個轉儲文件的最大大小 | |
STATISTICS | 始終導入預計算的統計信息 | |
RESUMABLE | 在遇到有關空間的錯誤時掛起 | |
RESUMABLE_NAME | 用來標識可恢復語句的文本字符串 | |
RESUMABLE_TIMEOUT | RESUMABLE 的等待時間 | |
COMPILE | 編譯過程, 程序包和函數 | Y |
STREAMS_CONFIGURATION | 導入 Streams 的一般元數據 | Y |
STREAMS_INSTANITATION | 導入 Streams 的實例化元數據 | N |
TRANSPORT_TABLESPACE | 導入可傳輸的表空間元數據 | |
TABLESPACES | 將要傳輸到數據庫的表空間 | |
DATAFILES | 將要傳輸到數據庫的數據文件 | |
TTS_OWNERS | 擁有可傳輸表空間集中數據的用戶 |
2.expd/impd
ORCALE10G提供了新的導入導出工具,數據泵。
一、主要特性
1.支持並行處理導入、導出任務
2.支持暫停和重啟動導入、導出任務
3.支持通過Database Link的方式導出或導入遠端數據庫中的對象
4.支持在導入時通過Remap_schema、Remap_datafile、Remap_tablespace幾個參數實現導入過程中自動修改對象屬主、 數據文件或數據所在表空間。
5.導入/導出時提供了非常細粒度的對象控制。通過Include、Exclude兩個參數,甚至可以詳細制定是否包含或不包含某個對象。
Directory對象
Directory對象是Oracle10g版本提供的一個新功能。他是一個 指向,指向了操作系統中的一個路徑。每個Directory都包含 Read,Write兩個權限,可以通過Grant命令授權給指定的用戶或角色。擁有讀寫權限的用戶就可以讀寫該Directory對象指定的操作系統路 徑下的文件。
除了使用network_link參數意外,expdp生成的文件都是在服務器上(Directory指定的位置)
基本語法
導出
expdp TEST/123456 schemas=geoff dumpfile=test.dmp directory=exp_imp_data logfile=impdp_20191219.log;
test/123456:導出用戶賬號密碼
test.dmp:導出dmp文件名
exp_imp_data:directory對象目錄
geoff:導出給哪個用戶
impdp_20191219.log:日志名稱
導入
impdp TEST/123456 file=test.dmp directory=exp_imp_data REMAP_SCHEMA=test:geoff logfile=impdp_20191219.log;
test/123456:待導入用戶賬號密碼
test.dmp:導入dmp文件名
exp_imp_data:directory對象目錄
test:geoff :將test用戶數據導入到Geoff用戶下
impdp_20191219.log:日志名稱
二、操作模式
1.全庫模式
導入或者導出整個數據庫,對應impdp/expdp命令中的full參數,只有擁有dba或者 exp_full_database和imp_full_database權限的用戶才能執行。
2.Schema模式
導出或導入Schema下的自有對象,對應impdp/expdp命令中的Schema參數,這是默認的操作模式。 如果擁有dba或者 exp_full_database和imp_full_database權限的用戶執行的話,就可以導出或導入多個Schema中的對象。
3.表模式
導出指定的表或者表分區(如果有分區的話)以及依賴該表的對象(如該表的索引,約束等,不過前提是這些對象在同一個 Schema中,或者執行的用戶有相應的權限)。對應impdp/expdp命令中的Table參數。
4.表空間模式
導出指定的表空間中的內容。對應impdp/expdp中的Tablespaces參數,這種模式類似於表模式和 Schema模式的補充。
5.傳輸表空間模式
對應impdp/expdp中的Transport_tablespaces參數。這種模式與前面幾種模式最顯著的區 別是生成的Dump文件中並不包含具 體的邏輯數據,而只導出相關對象的元數據(即對象的定義,可以理解成表的創建語句),邏輯數據仍然在表空間的數據文件中,導出時需要將元數據和數據文件同 時復制到目標端服務器。
這種導出方式效率很高,時間開銷主要是花在復制數據文件產生的I/O上。expdp執行傳輸表空間模式的導出,用戶必須 擁有 exp_full_database角色或者DBA角色。而通過傳輸表空間模式導入時,用戶必須擁有imp_full_database角色或者DBA角 色。
三、過濾數據
過濾數據主要依賴於Query和Sample兩個參數。其中Sample參數主要針對expdp導出功能。
1.Query
與exp命令中的Query功能類似,不過Expdp中,該參數功能得到了增強,控制的粒度更細。Expdp中的Query也是指定類 似where語句來限定記錄。語法如下:
Query = [Schema.][Table_name:] Query_clause
默認 情況如果不指定Schema.table_name,則Query_clause針對所有導出的表有效,或者你可以為每一個表指定不同的 Query_clause,如:導出a表中所有id<5的記錄,導出b表中所有name=’a’的記錄,則Query的參數應該如下:
Query=A:”Where id<5″,B:”Where name=’a’”
如果Where條件前沒有指定Schema名或者表名的話,默認就是針對當前所有要被 導出的表。如:Query=Where id <5
Warning: 建議把Query參數放入到參數文件中使用,以避免轉義符帶來的麻煩。
2.Sample
該參數用來指定導出數據的百分比,可指定的值的范圍從0.000001到99.999999,語法如下:
Sample=[[Schema_name.]Table_name:]sample_percent
指 定該參數以后,EXPDP導出將自動控制導出的記錄量,如導出A表中50%的記錄,設置的Sample參數如下:
Sample=A:50
Warning: Sample_percent指定的值只是一個參考值,EXPDP會根據數據量算出一個近似值。
四、重定義表的Schema或表空間
我們還可能會遇到這樣的需求,把A用戶的對象轉移到B用戶,或者更換數據的表空間。數據泵通過 Remap_Schema和Remap_tablespace參數實現了該功能。
- REMAP_SCHEMA : 重定義對象所屬Schema
該參數的作用類似IMP中的Fromuser+Touser,支持多個Schema的轉換,語法如下:
REMAP_SCHEMA=Source_schema:Target_schema[,Source_schema:Target_schema]
如 把A的對象轉換到C用戶,將C轉換到D用戶。Remap_schema=a:b,c:d
Warning: 不能在同一個IMPDP命令中指定remap_schema=a:b,a:c. - REMAP_TABLESPACE : 重定義對象所在的表空間。
該參數用來重映射導入對象存儲的表空間,支持同時對多個表空間進行 轉換,相互間用逗號分割。語法如下:
REMAP_TABLESPACE=Source_tablespace:Target_tablespace[,Source_tablespace:Target_tablespace]
Warning: 如果使用Remap_tablespace參數,則要保證導入的用戶對目標表空間有讀寫權限。
五、優化導入/導出效率
對於大數據量來說,我們不得不考慮效率問題。數據泵對效率也提出了更高的要求。甚至官方的描述就是Oracle Data Pump technology enables Very High-Speed movement of data and metadata from one database to another.這里的Very High-Speed依賴我們的parallel參數。
所 有的優化操作都會有三種結果:變得更好、沒有變化、變得更差。Parallel參數也是這樣,並不是指定一個大於1的參數,性能就會有提升。
- 對於導出的parallel
對於導出來說,由於dump文件只能由一個線程進行操作(包 括I/O處理),因此如果輸出的DUMP文件只有一個,即使你指定再多的並行,實際工作仍然是 一個,而且還會觸發ORA-39095錯誤。因此,建議設置該參數小於或等於生成的DUMP文件數量。那么,如何控制生成的DUMP文件數量呢?
EXPDP 命令提供了一個FILESIZE參數,用來指定單個DUMP文件的最大容量,要有效的利用parallel參數,filesize參數必不可少。
舉 例:某用戶對象占用了4G左右的空間,實際導出后的DUMP文件約為3G,我們嘗試在導出該用戶時指定並行度為4,設置單個文件不超過500M,則語法如 下:
$ expdp user/pwd directory=dump_file dumpfile=expdp_20100820_%U.dmp logfile=expdp_20100820.log filesize=500M parallel=4 - 對於導入的parallel
對於導入來說,使用parallel參數則要簡單的多,我認為導入更能體現parallel參數的優勢。 參數設置為幾,則認為同時將幾張表的內容導入到庫中。
舉例:某dmp文件中包含了200張表,我們嘗試在導入該DMP文件時指定並行度為10,則 語法如下:
$ impdp user/pwd directory=dump_file dumpfile=expdp_20100820.dmp logfile=impdp_20100820.log parallel=10
3.區別
在10g之前,傳統的導出和導入分別使用EXP工具和IMP工具,從10g開始,不僅保留了原有的EXP和IMP工具,還提供了數據泵導出導入工具EXPDP和IMPDP
1.EXP和IMP是客戶端工具程序,它們既可以在客戶端使用,也可以在服務端使用。
2、EXPDP和IMPDP是服務端的工具程序,他們只能在ORACLE服務端使用,不能在客戶端使用。
3、IMP只適用於EXP導出文件,不適用於EXPDP導出文件;IMPDP只適用於EXPDP導出文件,而不適用於EXP導出文件。
4、EXPDP和IMPDP在導出導入的時候需要依賴Directory對象,而IMP和EXP不需要依賴。
5、oracle11g中有個新特性,當表無數據時,不分配segment,以節省空間,所以exp導不出空表,解決的辦法是用expdp。
數據泵取只能在服務器端運行,客戶端只能用來連接服務器啟動導入導出操作
exp和expdp原理對比
1、exp/imp客戶端程序,受網絡,磁盤的影響; impdp/expdp服務器端程序,只受磁盤的影響
2、假設文件把文件導出在服務端,exp常規方式是使用SELECT的方式查詢數據庫中的數據,是需要通過buffer cache並通過sql的語句處理層再轉移至exp的導出文件(即要經過sga,pga才傳輸到客戶端,而exp直接路徑則是直接從磁盤上將數據轉移至exp的導出文件,所以速度更快;而expdp是exp的升級版,相當於exp + direct mode + parallel(可能對導出文件還進行了壓縮,這是從導出文件的對比結果發現的,具體不清楚)。所有從總的來說,expdp比exp提供了並行的方式(寫入多個導出文件)