EXP導出
一.導出前準備:
1.設置NLS_LANG環境變量
(1)查看數據庫用的啥子字符集
col PARAMETER for a20
col VALUE for a30
select * from nls_database_parameters
where PARAMETER in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET')
/
-------------------- ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CHARACTERSET AL32UTF8
(2)指定當前shell的NLS_LANG參數(即設置exp工具的字符集)
[oracle@test64 ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
2.查看要導出的幾張表大小,估算dmp文件大小(實際值一般會比這少,因爲導出的是使用了的塊,另外exp支持壓縮,而expdp是自動壓縮的)
col SEGMENT_NAME for a15
col PARTITION_NAME for a20
col size for a10
select SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 ||' m' "size" from user_segments
where PARTITION_NAME like 'xxxxx_201111_%'
/
--------------- -------------------- ----------
xxxxx xxxxx_201111_1 288 m
xxxxx xxxxx_201111_2 296 m
xxxxx xxxxx_201111_3 304 m
3.查看要導出的磁盤是否有空間
[oracle@test64 backup]$ df -h .
Filesystem 容量 已用 可用 已用% 掛載點
/dev/mapper/VolGroup01-backup
4.0G 2.8G 1014M 74% /backup
二.開始導出
[oracle@test64 backup]$ exp xxxxx/xxxxx direct=y log=/backup/test_exp.log grants=n indexes=n constraints=n triggers=n file=test_exp.dmp tables=(schema.table:xxxxx_201111_1,schema.table:xxxxx_201111_2,schema.table:xxxxx_201111_3)
紅色參數請按自身情況設置。默認都是y
因爲導出的是分區表,並沒有將整表導出,可能會報EXP-00091: Exporting questionable statistics.
EXP-00091報錯原因及解決辦法請看http://blog.sina.com.cn/s/blog_8e5b826701011v2a.html
最後導出834M的dmp文件,耗時大概是1分多鐘
=================================================================================================
IMP導入
三.導入前準備
1.根據要導入的數據庫,設置NLS_LANG環境變量
2.查看要導入的表空間是否夠用
四.開始導入
[oracle@test64 backup]$ nohup imp system/oracle log=/backup/test_imp.log ignore=y file=test_exp.dmp
fromuser=webdb touser=webdb tables=(schema.table:xxxxx_201111_1,schema.table:xxxxx_201111_2,schema.table:xxxxx_201111_3
buffer=40960000 &
如果指定了fromuser和touser參數,再指定schema就會報錯,將schema去掉就行了
buffer參數是導入時使用的緩存,數據從硬盤中的dmp文件讀入緩存,再從緩存寫入數據庫dbf文件。這個buffer並不是越大越好
導入時間25分鐘
參考書籍《塗抹ORACLE--三思筆記之一步一步學oracle》第12章import/export導入和導出數據
================================================================================================
表模式、用戶模式、表空間模式、數據庫模式
如果不是用dbca建庫,而是手工建庫的。必須首先執行cataxp.sql或catalog.sql(後者中包含調用cataxp.sql的語句)
cataxp.sql腳本:創建IMPORT/EXPORT所需數據字典及相關視圖、EXP_FULL_DATABASE、IMP_FULL_DATABASE角色的創建並授權給dba用戶
如果需要導出或導入其他人的schema,則分別需要以上2個權限。
grant EXP_FULL_DATABASE to scott;
在執行跨版本的數據遷移任務時,儘可能用低版本的EXP執行導出(源端和目標端數據庫版本中,哪個低就用哪個執行導出),儘可能用目標端數據庫的IMP版本執行導入。
exp help=y
imp和emp讀取參數時,以最後讀取到的爲準
IMP和EMP無法遷移外部表的數據
所謂的全庫導出,只是邏輯上的全庫,只導出與用戶數據相關的對象。
exp \'sys/oracle as sysdba\' tables=oe.PURCHASEORDER file=PURCHASEORDER.dmp log=PURCHASEORDER.log
[oracle@test64 exp]$ exp system/oracle owner=scott file=scott.dmp log=scott.log grants=n indexes=n constraints=n triggers=n
Note: grants on tables/views/sequences/roles will not be exported
Note: indexes on tables will not be exported
Note: constraints on tables will not be exported
windows系統
FAT16 2G
FAT32 4G
NTFS 2T
linux系統
ext2
Block大小 KB 2KB 4KB
最大單一檔案限制 16GB 256GB 2TB
最大檔案系統總容量 2TB 8TB 16TB
[root@test64 ~]# tune2fs -l /dev/sda1 | grep -i "block size"
Block size: 1024
常規導出,BUFFER=512000 參數,5M,影響導出速度
direct=y直接路徑導入法,recordlength指定exp的i/o buffer,最大不超過65535,設置爲數據庫DB_BLOCK_SIZE的整數倍比較好。16K、32K、64K,建議設置爲65545
直接路徑導出的條件:
1. 需命令行或者使用參數文件
2. 當有LOB類型列時自動會轉化爲常規路徑法,建議即使是直接路徑導出,也設置recordlength和buffer兩個參數
3. 不支持表空間模式
4. 不能指定query參數
IMP導入的參數與EXP並沒有直接關係,如以表模式導出的dump文件,可以用IMP以用戶模式或full模式導入。
IMP的幾個條件
1. 生成dump文件的數據庫版本(包括小版本),如果比目標數據庫服務器的版本高,導入可能失敗。
2. 生成dump文件時如果用的是具有dba或者exp_full_database角色的用戶,導入時也必須有相應的權限。
3. 導出的數據中是否含LOB類型列、分區表、分區索引等,如果有,可能在導入前也需要做一些準備工作
導入表和導出表的順序
create table ---> 創建表數據(insert、dump) ---> 創建位圖index ---> create constraints、views、produces、trigger並啓動 ---> 導入bitmap、function-based、domain等類型索引
當目標表空間環境與源表空間環境不同的時候
1. 導入表時,默認會首先導入“導出時表所在的”表空間,如果沒找到,會保存到“導入的”用戶默認的表空間
2. 如果導入的表中含有LOB、分區表、分區索引等類型的對象,需要先創建這些對象,再執行導入。
僅導入表結構,不要數據(可用於導數據庫的機構)
事先需要準備好用戶,表空間
imp後面加個參數 rows=n 即可 (exp也支持這個參數)
IMP可能會出現的幾個問題
1.對象已存在
ignore=n(默認),IMP輸出對象創建錯誤的信息,導致出錯的對象會被跳過,IMP繼續處理後續的對象。如果當前處理的對象類型是表的話,那麼數據並不會被導入。
ignore=y,如果對象已存在,IMP會忽略這個問題,繼續向對象插入數據,無論表中是否有數據、或有重複數據。IMP有可能會因報其他錯誤而中止。即使沒有中止,也有可能造成一些邏輯錯誤。
2.記錄不一致
目標端沒有滿足源端的數據格式要求
3.序列未變
如果ignore=y,且目標端有同名的序列,那麼目標端的序列值不會有改變,如果想目標端的序列值跟源端一樣,就刪除目標端同名的序列
4.重複數據
如果ignore=y,且表中不含唯一索引、唯一約束的話
注:導入前確保不會記錄重複、導入後查看是否有重複記錄、確認爲錯誤數據後手工刪除
5.記錄未被完全導入
如果ignore=y,且目標表有唯一索引、唯一約束、或其他約束的話,一旦發現要導入的數據不符合當前約束條件,導入就會報錯(方便分析原因),然後跳過該條數據,繼續處理下一條。
注:NOT NULL、唯一約束、主鍵(或not null+唯一索引)、外鍵、check約束
導入834M文件,buffer=40960000