Oracle導出/導入工具簡介
Oracle Exp/Imp tool是壹款簡單、方便、靈活的備份恢復和數據遷移工具,可以實現數據庫級、用戶級和表級的數據備份和恢復。Exp/Imp是壹種廣泛使用的邏輯備份方法,適用於數據量在G以下的數據庫系統,強調高可用性,可以容忍少量數據丟失。
Export將數據從數據庫導出到轉儲文件。
從轉儲文件導入將數據導入數據庫。
1.使用出口/進口工具的場景:
1)兩個數據庫之間的數據傳輸
同壹版本的oracle服務器之間
不同版本的oracle服務器之間的
相同操作系統之間的
不同操作系統之間的
2)用於數據庫備份和恢復。
3)從壹個圖式轉移到另壹個圖式。
4)從壹個表空間轉移到另壹個表空間
2.轉儲文件介紹
導出的是二進制格式的文件,不能手動編輯,否則數據會損壞。該文件在ORACLE支持的任何平臺上都采用相同的格式,可以在所有平臺上通用。
轉儲文件在導入時采用了向上兼容,也就是說ORALCE8的轉儲文件可以導入到ORACLE9中,但是版本差異很大的版本之間可能會出現問題。
3.Oracle9i EXP函數說明
Oracle9i EXP在原有基礎上增加了壹些新的參數,根據功能主要分為以下幾個部分:
1)OBJECT _ CONSISTENT——用於將EXP對象設置為只讀,以保持對象的壹致性。默認值為n。
2) FLASHBACK_SCN和FLASHBACK _ TIME-增加支持閃回功能。
3) RESUMABLE、RESUMABLE_NAME、RESUMABLE _ time out——增加支持RESUMABLE的空間分配。
4)TTS _ FULL _ CHECK-用於在轉移表空間時使用依賴關系檢查。
5)模板-用於支持iAS。
6)表空間-設置表空間導出模式。個人認為這是對普通用戶最實用的新參數,讓用戶在原來的FULL、OWNER、TABLES的基礎上多了壹個選擇,讓EXP更加靈活。
4.導出/導入過程(轉儲文件中包含的數據對象)
由export導出的轉儲文件包含兩種基本類型的數據:
數據字典語言
數據
轉儲文件包含所有重新創建數據字典的DDL語句,數據字典基本上是可讀的格式;但是,需要註意的是,千萬不要用文本編輯器編輯。oracle表示不支持這種情況。
以下是轉儲文件中包含的ORACLE對象,分為表/用戶/完整模式,有些對象只在完整模式下可用(如公共同義詞、用戶、角色、回滾段等。).
表模式用戶模式完整數據庫模式
- - -
表格定義表格定義表格定義
表格數據表格數據表格數據
所有者表授權所有者授權授權
所有者的表索引所有者的索引
表約束表約束表約束
表觸發器表觸發器所有觸發器
集群集群
數據庫鏈接數據庫鏈接
作業隊列作業隊列
刷新組刷新組
序列序列
快照快照
快照日誌快照日誌
存儲過程
私有同義詞所有同義詞
視圖視圖
輪廓
復制目錄
資源成本
角色
回滾段
系統審計選項
系統權限
表空間定義
表空間配額
用戶定義
5.導入時的對象澆註順序
1.表空間
2.輪廓
3.用戶
4.角色
5.系統特權授予
6.角色授予
7.默認角色
8.表空間配額
9.資源成本
10.回滾段
11.數據庫鏈接
12.順序
13.快照
14.快照日誌
15.作業隊列
16.刷新組
17.集群定義
18.表格(也包括授權、註釋、索引、約束、審計)
19.指稱完整性
20.表後操作
21.同義詞
22.視圖
23.存儲過程
24.觸發器,默認值和審核
按照這個順序,主要是解決對象之間的依賴關系可能產生的問題。觸發器是最後導入的,因此在向數據庫中插入數據時不會觸發。導入後可能會有壹些過程的狀態為NVALID,主要是導入時會影響到壹些數據庫對象,而導入並沒有重新編譯過程,從而造成這種情況。可以重新編譯壹下解決這個問題。
6.兼容性問題
導入工具可以處理從EXPORT 5.1.22之後的版本導出的轉儲文件,所以妳用ORACLE7的導入處理ORACLE6的轉儲文件,以此類推,但是如果版本相差很大,ORACLE可能無法處理。具體問題請參考相應文檔,如參數設置(兼容參數)。
導出所需的視圖
導出所需的視圖由CATEXP創建。SQL,這些內部視圖用於組織轉儲文件中的數據格式。大多數視圖用於收集和創建DDL語句,而其他視圖主要由ORACLE開發人員使用。這些視圖在不同ORACLE版本之間可能有所不同,而且每個版本都可能添加了新功能。因此,在新版本中執行舊的轉儲文件時會出現錯誤。壹般是CATEXP。可以執行SQL來解決這些問題。
解決向後兼容性問題的壹般步驟如下:
1)導出數據庫的版本比目標數據庫舊:
執行舊的CATEXP。要導入的目標數據庫中的SQL。
使用舊導出導出轉儲文件。
使用舊導入導入到數據庫中。
執行新的CATEXP。數據庫中的SQL來恢復此版本的導出視圖。
2)導出數據庫的版本比目標數據庫新。
執行新的CATEXP。要導入的目標數據庫中的SQL。
使用新導出導出轉儲文件。
使用新導入導入到數據庫中。
執行舊的CATEXP。數據庫中的SQL來恢復此版本的導出視圖。
7.碎屑清理
導出/導入的壹個非常重要的應用方面是碎片整理。因為如果第壹次初始化IMPPORT,會重新創建表,導入數據,所以整個表是連續存儲的。
另外,默認情況下,EXPORT會在生成轉儲文件時“壓縮”TABLE table,但這種壓縮在很多情況下會被誤解。事實上,COMPRESS更改了存儲參數INITIAL的值。例如:創建表格...存儲(初始10k下壹個10k...)現在數據已經擴展到100的程度。如果用COMPRESS=Y導出數據,生成的語句將是storage(initial 100 knext 10k);我們可以看到下壹個值沒有改變,INITIAL是所有範圍的總和。於是就有了下面的情況。表A有四個100米範圍。從A執行DELETE,然後使用compress = Y導出數據。生成的CREATE TABLE語句將具有400M的初始範圍。即使表中沒有數據!!即使這個轉儲文件很小,在導入時也會產生壹個巨大的表。此外,它可能會超過數據文件的大小。例如,有四個50M數據文件,其中表A具有15 10M區段。如果數據以COMPRESS=Y的方式導出,會有INITIAL=150M。再次導入時,無法分配150M擴展區,因為單個擴展區無法跨越多個文件。
8.在用戶和表空間之間傳輸數據
壹般來說,導出的數據應該恢復到原來的位置。如果SCOTT用戶的表以表或用戶的形式導出數據,在導入時,如果SCOTT用戶不存在,將會報錯!全模式下導出的數據有創建用戶的信息,所以會自己創建用戶來存儲數據。當然,您可以使用FROMUSER和TOUSER參數來確定要導入的用戶,但是要確保TOUSER已經存在。
將參數表空間添加到imp可以更改導入數據的表空間;
有兩種情況:壹種是在數據導入前建表,在其他表空間上建表,然後導入數據;在另壹種情況下,撤銷導入用戶的無限制表空間的權限將會導入用戶的默認表空間;
9.進出口對序列的影響
在這兩種情況下,導出/導入都會比較序列。
1)如果用戶在導出時取的是序列的值,可能會造成序列的不壹致。
2)此外,如果序列使用緩存,則在導出時緩存中的那些值將被忽略,並且僅從數據字典中取出當前值導出。
如果在全模式下導出/導入時,表中的壹列數據正在按順序更新,且不是上述兩種情況,則導出更新前的數據。
如果采用常規的路徑方法,每壹行數據都要進行插入、壹致性檢查和插入觸發。
如果采用直接模式,壹些約束和觸發器可能不會被觸發。如果在trigger中使用sequence.nextval,會對sequence產生影響。
10.EXP通用選項
1) FULL,用來導出整個數據庫。當ROWS=N壹起使用時,可以導出整個數據庫的結構。例如:
exp sys file = test . DMP log = test . log full = y rows = n compress = y direct = y
2)緩沖和反饋。當導出更多數據時,考慮設置這兩個參數。例如:
exp new file = test . DMP log = test . log feedback = 10000 buffer = 1000000 tables = test 1,test2
3) FILL和LOG,分別指定備份的DMP名和日誌名,包括文件名和目錄;需要註意的是,EXP可以直接備份到磁帶上,也就是使用FILE=/dev/rmt0(磁帶設備名),但壹般我們不這麽做,原因有二:壹是會慢很多;第二,現在壹般在磁帶庫中使用,不建議直接操作磁帶。至於不用磁帶庫的朋友,可以考慮和UNIX TAR結合使用。如果真的想用EXP直接轉到磁帶,可以參考Metalink文章《在UNIX系統上導出到磁帶》(文檔號:30428.1),裏面有詳細的解釋。
4)compress參數將在導出時合並片段,並嘗試將數據壓縮到初始範圍。默認值是n,這是通常推薦的值。DIRECT參數會告訴EXP直接讀取數據,而不是像傳統EXP那樣使用SELECT讀取表中的數據,從而減少SQL語句的處理。也是普遍推薦的。但是,在某些情況下,直接參數不可用。
5)如何使用SYSDBA執行EXP/IMP?
這是壹個很現實的問題。有時候我們需要用SYSDBA來執行EXP/IMP,比如表空間的EXP/IMP,9i以下SYS用戶的EXP/IMP。我們可以通過以下方式連接EXP/IMP:
exp " ' sys/sys as SYSDBA ' " file = 1 . DMP tables = trst rows = n
6)查詢參數後跟where條件。值得註意的是,整個where子句需要用“”括起來,where子句的寫法和SELECT中的壹樣;
如果是UNIX平臺,所有的“和”都需要用\u26469來掩蓋它們的特殊含義:
exp test/test file = 1 . DMP log = 1 . log tables = test table query = "其中c1=20,c2=test "
註意: >,& lt單引號等特殊字符需要翻譯。
exp test/test file = 1 . DMP log = 1 . log tables = test table query = " where c 1 \ >;20和c2=to_date\(\'20090506\ ',\'yyyymmdd\'\)"
如果是windows平臺,請使用以下格式:
exp c/c @ ncn file = c . DMP log = c . log tables = tquery = " "其中id = 1,name =' gototop ' " "(也可以使用unix下的格式,具體情況測試即可)。
導出exp時,添加where條件:
exp scott/tiger TABLES=(emp,bonus)QUERY = " WHERE job = ' sales ' and sal & lt;1600"
限制:
1.不能為完全、用戶或表空間模式導出指定參數QUERY。
參數查詢不能用於完全導出、用戶導出和表空間導出。
2.參數查詢必須適用於所有指定的表。
參數查詢指定的內容必須對所有指定的表都有效。
3.不能在直接路徑導出中指定參數查詢(DIRECT=y)
參數查詢不能與直接路徑導出同時使用。
4.不能為具有內部嵌套表的表指定參數查詢。
參數查詢無法導出嵌入表。
5.您無法從導出文件的內容中確定數據是否是查詢導出的結果。
用查詢參數導出的數據和其他方法導出的數據是壹樣的,不能根據導出的文件來區分。
11.IMP通用選項
1) FROMUSER和TOUSER,用於將數據從壹個模式導入到另壹個模式;
2) IGNORE、GRANTS和INDEXES,其中IGNORE參數將忽略表的存在並繼續導入。這在需要調整表的存儲參數時非常有用。我們可以先根據實際情況建立合理存儲參數的表,然後直接導入數據。授權和索引指示是否導入授權和索引。如果我們想用新的存儲參數重建索引,或者為了加快訪問速度,可以考慮將索引設置為n,而GRANTS壹般為y..
3)EXP/IMP還有壹個參數是PARFILE,用來定義EXP/IMP的參數文件。也就是說,上面的參數都可以寫在壹個參數文件裏,但是我們很少用。
12.在並行EXP/IMP期間,如果對IMP進程進行索引,不建議同時運行五個以上的IMP。如果想加快速度,可以不加索引運行五個以上的imp,所以只要內存允許,然後SQL腳本就可以創建需要的索引。
13.整理出來的例子供大家參考。
有三種級別的導出/導入:表級別、用戶級別和完整數據庫級別。
1)表格模型(表格處理模式)
備份壹個用戶的表(備份壹個用戶下的表)
exp test/test rows = y indexes = n compress = n buffer = 65536 feedback = 100000 volsize = 0 file = exp _ table _ yyyymmdd . DMP log = exp _ table _ yyymmdd . log tables = test _ table 1,test_table2
恢復所有表(導入所有備份的表)
imp test 2/test 2 from user = test to user = test 2 rows = y indexes = n commit = y buffer = 65536 feedback = 100000 ignore = y volsize = 0 file = exp _ table _ yyyymmdd . DMP log = imp _ table _ yyymmdd . log
恢復所有表中的壹些表。
imp test 2/test 2 from user = test to user = test 2 rows = y indexes = n commit = y buffer = 65536 feedback = 100000 ignore = y volsize = 0 file = exp _ table _ yyyymmdd . DMP log = imp _ table _ yyymmdd . log tables = test _ table 1
2)用戶模型(用戶模式)
備份所有某人的對象(備份壹個用戶的所有數據對象)
exp test/test rows = y indexes = n compress = n buffer = 65536 feedback = 100000 volsize = 0 owner = test file = exp _ user _ yyyymmdd . DMP log = exp _ user _ yyyymmdd . log
找回某人所有的物品
imp test 2/test 2 from user = test to user = test 2 rows = y indexes = n commit = y buffer = 65536 feedback = 100000 ignore = y volsize = 0 file = exp _ user _ yyyymmdd . DMP log = imp _ user _ yyymmdd . log
恢復某人所有對象的某個表
imp test 2/test 2 from user = test to user = test 2 rows = y indexes = n commit = y buffer = 65536 feedback = 100000 ignore = y volsize = 0 file = exp _ user _ yyyymmdd . DMP log = imp _ use r _ yyymmdd . log tables = test _ table 1,test_table2,test_table3
3)完整模型
為所有數據庫備份完整數據庫
exp system/manager rows = y indexes = n compress = n buffer = 65536 feedback = 100000 volsize = 0 full = y inctype = complete file = exp _ full db _ yyyymmdd . DMP log = exp _ full db _ yyyymmdd . log
備份整個數據庫以進行增量備份
exp system/manager rows = y indexes = n compress = n buffer = 65536 feedback = 100000 volsize = 0 full = y inctype = incremental file = exp _ full db _ ZL _ yyymmdd . DMP log = exp _ full db _ ZL _ yyymmdd . log
註:inctype為8i,9i不再使用。
恢復完整備份的所有日期
imp system/manager rows = y indexes = n commit = y buffer = 65536 feedback = 100000 ignore = y volsize = 0 full = y file = exp _ full db _ yyyymmdd . DMP log = imp _ full db _ yyymmdd . log
恢復增量備份的所有數據
imp系統/管理器行=y索引=n提交=y緩沖區=65536反饋=100000忽略=y卷
size = 0 full = y inctype = restore file = exp _ full db _ ZL _ yyyymmdd . DMP log = imp _ full db _ ZL _ yyyymmdd . log