摘自:宏貝思
Export 和 Import 是一對讀寫(xiě)Oracle數據的工具. Export 將 Oracle 數據庫中的數據輸出到操作系統文件中, Import 把這些文件中的數據讀到Oracle 數據庫中. Export/Import可以用來(lái)完成以下工作: 數據歸檔, 數據庫升級, 備份數據庫, 把數據從一個(gè)數據庫移到另一個(gè)數據庫, 回收數據庫存儲碎片等等.
使用Export除了要保證磁盤(pán)或磁帶上有足夠的空間, 還必須執行expvew.sql和expvew.sql來(lái)創(chuàng )建Export使用的示圖, 并創(chuàng )建EXP_FULL_DATABASE ROLE. 使用Export的用戶(hù)應具有CREATE SESSION的權限, 若要Export其他用戶(hù)的表還要有EXP_FULL_DATABASE ROLE.同樣, 使用Import必須用catex.sql來(lái)創(chuàng )建IMP_FULL_DATABASE ROLE. 使用Import的用戶(hù)應具有CREATE SESSION的權限. Import只能讀入用Export創(chuàng )建的文件. 如果該文件是全庫Export, 使用Import的用戶(hù)還要有IMP_FULL_DATABASE ROLE.
Export/Import有三個(gè)級別: 表級, 用戶(hù)級和全數據庫級.
表級允許Export/Import指定的表而不涉及其他數據庫對象. 用戶(hù)級Export/Import只針對屬于指定用戶(hù)的全部數據庫對象. 只有擁有EXP_FULL_DATABASE/IMP_FULL_DATABASE ROLE 的用戶(hù)才能使用全數據庫級的Export/Import.
有三種方式執行Export/Import: 參數文件方式, 命令行方式和交互式.
使用參數文件是一種比較好的方式, 格式為:
Exp <username/password>; PARFILE = <filename>;
Imp <username/password>; PARFILE = <filename>;
命令行方式是指在命令行中指定參數:
Exp <username/password>; TABLES = (emp,dept) GRANTS = y
Imp <username/password>; FROMUSER = scott TOUSER = test TABLES = (emp,dept)
交互式只要敲入Exp或Imp然后回答屏幕上的提問(wèn)即可.
下面介紹一些EXPORT/IMPORT的使用技巧
- 把數據庫對象從一個(gè)用戶(hù)移到另一個(gè)用戶(hù)
Oracle 不允許直接改變表的擁有者, 利用Export/Import可以達到這一目的.
假設要把表 T 的擁有者User1改為User2, 具體步驟是:
- exp system/manager tables = User1.T
- imp system/manager fromuser = User1 touser = User2 tables = T
- drop table User1.T
- 把數據庫對象從一個(gè)表空間移到另一個(gè)表空間
建表時(shí)可以指定表空間, 表空間一經(jīng)確定就部能隨意改變. 若要表 T 從表空間 tbs1移到表空間 tbs2, 就要采用以下方法:
- exp <user/passwd>; tables = T
- imp <user/passwd>; tables = T indexfile = temp.sql
- drop table T
- 編輯 temp.sql 只保留所需的建表命令并指定表空間為tbs2
- 以表的所有者執行temp.sql
- imp <user/passwd>; tables = T ignore = Y
- 只輸出一個(gè)的表空間
通常數據庫設計成用戶(hù)若屬于某個(gè)表空間, 那么這個(gè)用戶(hù)創(chuàng )建的數據庫對象也在該表空間內.
Export某個(gè)表空間可用如下方法:
- 查看表空間內所有用戶(hù)
spool owners
select owner
from dba_segments
where tablespace_name = ‘<TablespaceName>;‘;
spool off
- 查看表空間內所有數據庫對象
spool objects
select owner, object_name, object_type
from dba_objects
where owner = ‘owner1‘
or owner = ‘owner2‘
...
or owner = ‘ownern‘;
spool off
- 作表級Export
- 從Exp文件中提取創(chuàng )建數據庫對象的命令
在IMPORT時(shí)使用 ‘INDEXFILE = FileName‘, IMPORT把創(chuàng )建數據庫對象的命令輸出到指定的文件中, 編輯后運行這個(gè)文件就能建立數據庫對象.
下面介紹Export/Import 使用中幾個(gè)常見(jiàn)的問(wèn)題和解決辦法
- Export/Import 使用不同的字符集
Export文件中包含著(zhù)字符信息. 如過(guò)輸入/輸出都使用擔字節字符集, 如EBCDIC或US7ASCII, 輸入時(shí)將自動(dòng)進(jìn)行字符集轉換. 轉換過(guò)程中, 若輸出文件中含有的目標字符集中不能匹配的字符會(huì )自動(dòng)設成缺省字符.
對于多字節字符集, 如ZHS16CGB231280, 通常不能自動(dòng)轉換, 只有在字符串長(cháng)度不變的情況下才能自動(dòng)轉換.
- 空間不夠 -- 碎片問(wèn)題
有些時(shí)候, 即使數據庫仍有足夠的空間, 使用IMPORT時(shí)卻出空間不夠的錯誤. 出現這種現象通常是由于數據庫中存在碎片, 即有很多小的不連續的空閑空間. 解決辦法是先將數據庫全庫EXPORT(FULL=Y), SHUTDOWN數據庫, 重新建庫(CREATE DATABASE)后用IMPORT FULL=Y恢復數據.
- ROLLBACK段不夠
Export/Import使用過(guò)程中, 如果數據量很大會(huì )出現‘ROLLBACK段不夠‘的錯誤. 這時(shí)要建一個(gè)足夠大的ROLLBACK段, 使它ONLINE而其他ROLLBACK段OFFLINE. 這樣, Export/Import使用這個(gè)大ROLLBACK段, 從而避免上述現象.