摘自:宏貝思
EXPort 和 Import 是一對讀寫Oracle數據的工具. Export 將 Oracle 數據庫中的數據輸出到操作系統文件中, Import 把這些文件中的數據讀到Oracle 數據庫中. Export/Import可以用來完成以下工作: 數據歸檔, 數據庫升級, 備份數據庫, 把數據從一個數據庫移到另一個數據庫, 回收數據庫存儲碎片等等.
使用Export除了要保證磁盤或磁帶上有足夠的空間, 還必須執行expvew.sql和expvew.sql來創建Export使用的示圖, 并創建EXP_FULL_DATABASE ROLE. 使用Export的用戶應具有CREATE session的權限, 若要Export其他用戶的表還要有EXP_FULL_DATABASE ROLE.同樣, 使用Import必須用catex.sql來創建IMP_FULL_DATABASE ROLE. 使用Import的用戶應具有CREATE SESSION的權限. Import只能讀入用Export創建的文件. 假如該文件是全庫Export, 使用Import的用戶還要有IMP_FULL_DATABASE ROLE.
Export/Import有三個級別: 表級, 用戶級和全數據庫級.
表級答應Export/Import指定的表而不涉及其他數據庫對象. 用戶級Export/Import只針對屬于指定用戶的全部數據庫對象. 只有擁有EXP_FULL_DATABASE/IMP_FULL_DATABASE ROLE 的用戶才能使用全數據庫級的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然后回答屏幕上的提問即可.
下面介紹一些EXPORT/IMPORT的使用技巧
- 把數據庫對象從一個用戶移到另一個用戶
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
- 把數據庫對象從一個表空間移到另一個表空間
建表時可以指定表空間, 表空間一經確定就部能隨意改變. 若要表 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
- 只輸出一個的表空間
通常數據庫設計成用戶若屬于某個表空間, 那么這個用戶創建的數據庫對象也在該表空間內.
Export某個表空間可用如下方法:
- 查看表空間內所有用戶
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文件中提取創建數據庫對象的命令
在IMPORT時使用 'INDEXFILE = FileName', IMPORT把創建數據庫對象的命令輸出到指定的文件中, 編輯后運行這個文件就能建立數據庫對象.
下面介紹Export/Import 使用中幾個常見的問題和解決辦法
- Export/Import 使用不同的字符集
Export文件中包含著字符信息. 如過輸入/輸出都使用擔字節字符集, 如EBCDIC或US7ASCII, 輸入時將自動進行字符集轉換. 轉換過程中, 若輸出文件中含有的目標字符集中不能匹配的字符會自動設成缺省字符.
對于多字節字符集, 如ZHS16CGB231280, 通常不能自動轉換, 只有在字符串長度不變的情況下才能自動轉換.
- 空間不夠 -- 碎片問題
有些時候, 即使數據庫仍有足夠的空間, 使用IMPORT時卻出空間不夠的錯誤. 出現這種現象通常是由于數據庫中存在碎片, 即有很多小的不連續的空閑空間. 解決辦法是先將數據庫全庫EXPORT(FULL=Y), SHUTDOWN數據庫, 重新建庫(CREATE DATABASE)后用IMPORT FULL=Y恢復數據.
- ROLLBACK段不夠
Export/Import使用過程中, 假如數據量很大會出現'ROLLBACK段不夠'的錯誤. 這時要建一個足夠大的ROLLBACK段, 使它ONLINE而其他ROLLBACK段OFFLINE. 這樣, Export/Import使用這個大ROLLBACK段, 從而避免上述現象.