溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

exp和imp詳解

發(fā)布時間:2020-08-06 20:43:15 來源:ITPUB博客 閱讀:239 作者:tangguowuvv 欄目:關系型數(shù)據(jù)庫
  之前寫了關于expdp和impdp的文章,感興趣的可以移步http://blog.itpub.net/30485601/viewspace-2151455/,由于expdp和impdp是oracle10g之后才有的,如果數(shù)據(jù)庫版本在10g之前,那么就不能使用expdp和impdp了。但是我們卻可以使用exp和imp來實現(xiàn)邏輯導入導出功能,其實expdp和impdp本身就是在exp和imp的基礎上發(fā)展起來的,與之不同的是,exp和imp是一個客戶端工具,可以在客戶端進行操作,而且只需要resource權限就可以了,所以對于日常的數(shù)據(jù)遷移還是很方便的。
  如果先看了expdp和impdp的話,本篇文章看起來就會覺得簡陋很多,因為兩個本身從實用性來說的話,當然長江后浪推前浪了,其實這要看和誰對比了,現(xiàn)在的大牛比兩年前的大牛厲害,但人家2年前依舊是一個大牛。那到底是用expdp呢,還是exp呢,其實和使用場景有關,如果你是一個系統(tǒng)管理員,擁有DBA權限,那么在數(shù)據(jù)遷移的時候,當然我覺得可以給自己分配一個擁有訪問系統(tǒng)目錄和expdp權限的用戶,可以盡情體驗expdp帶來的快感;如果你只是一個普通用戶,是由別人分配給你的權限,比如:你的數(shù)據(jù)庫服務器是托管的,托管方一個庫上負載了多個庫,你的庫只是人家管理的其中一個,那么對方一般情況下是不會給你一個高權限的用戶的,你所擁有的只是connect和resource權限,在這種情況下,你可以使用exp,關鍵是你也沒有權限用expdp,對于日常的遷移備份,exp和imp絕對是綽綽有余了??戳撕靡粫何淖?,估計看客們心情都放松了吧,那老司機我就要發(fā)車了。
準備工作:如果需要在客戶端進行exp和imp的話,需要在客戶端下載完整版的客戶端,然后配置環(huán)境變量tnsnames.ora就可以了。
一、exp
1、導出schemas
exp qj/**@local file=C:\Users\QuJian\Desktop\qj.dmp log=C:\Users\QuJian\Desktop\qj.log owner=qj statistics=none
解釋:exp和imp都是操作系統(tǒng)命令,在操作系統(tǒng)級別操作。exp表示這是一個exp導出操作;qj/**,其中qj是用戶名,**是用戶密碼,對于qj這個用戶,如果只有resource權限,那么只能導出qj自己,如果具有exp_full_database,那么將會擁有導出整個庫的權限,當然也可以導出其他schemas了;@local,local是tnsmames(網(wǎng)絡服務名),需要在客戶端配置環(huán)境變量TNS_NAME,可以通過路徑找到這個tnsnames,tnsnames記錄了數(shù)據(jù)庫服務器的地址和服務名,通過local就可以找到數(shù)據(jù)庫服務器的地址;file表示數(shù)據(jù)導出的位置,導出文件以.dmp后綴,log表示導出日志,導出日志以.log后綴;owner指明要導出的schema,如果具有exp_full_database權限的話,那么還可以導出其他schema,多個schema用逗號(,)隔開,比如:owner=(qj,scott);由于客戶端字符集和服務器字符集不一致,因此會出現(xiàn)EXP-00091 正在導出有問題的統(tǒng)計信息這個錯誤,加上statistics=none可以解決這個錯誤。下面貼出正常導出的過程和沒有加statistics=none導出過程:
如圖:
正常導出的過程
exp和imp詳解
exp和imp詳解
對于exp-00104錯誤,目前只能通過expdp來解決
沒有加statistics=none導出如圖:
exp和imp詳解
可以看到,出現(xiàn)了大量的exp-00091錯誤。
2、導出某些表,我將以導出表為例,列出一些常用的參數(shù)
<1>tables
exp qj/**@local file=C:\Users\QuJian\Desktop\t.dmp log=C:\Users\QuJian\Desktop\t.log tables=(t1,t2) 
statistics=none
解釋:tables參數(shù)指明導出哪些表,多個表之間用逗號(,)分隔
結果如圖:
exp和imp詳解
<2>query
exp qj/**@local file=C:\Users\QuJian\Desktop\t.dmp log=C:\Users\QuJian\Desktop\t.log tables=(t1,t2)  query=\"where object_id<1\" statistics=none
解釋:query參數(shù)可以導出指定條件的記錄,但是這里有一點需要注意,expdp的query參數(shù)如果只指定了一個表的條件,其他表沒有指定條件,意味著其他表全導。但是對于exp,這個query滿足的字段必須是所有表都有的,如果在這里直接寫t1.object_id<1就會報錯,所以,where指出的條件,必須是要導出的表都有的,要不然只能分類導出表了。
結果如圖:
exp和imp詳解
<3>parfile
exp qj/**@local parfile=C:\Users\QuJian\Desktop\par.txt
解釋:parfile可以直接調用命令文件,可以看到<2>中,加query時還需要轉義字符,這個簡直是太麻煩了,而且命令過長,超出了界面所能容納的上限還會報錯,主要是還不美觀。如果加了parfile參數(shù),那么我們只需要在命令行寫出exp qj/**@local parfile直接調用寫好的命令就可以了。
pafile文本如下:
file=C:\Users\QuJian\Desktop\par.dmp
log=C:\Users\QuJian\Desktop\par.log
tables=(t1,t2)  
query="where object_id<1"

statistics=none
結果如圖:
exp和imp詳解
<4>grants,indexes,constraints,trigger

exp qj/**@local file=C:\Users\QuJian\Desktop\t.dmp log=C:\Users\QuJian\Desktop\t.log tables=(t1,t2) statistics=none grants=n
解釋:grants指定是否導出對象的授權信息,授權信息指的是通過grant命令授予的對象訪問,操作權限,默認為Y,也就是默認導出;indexes指定是否導出表的索引,默認為Y;constraints指定是否導出表的約束,默認為Y;triggers是否導出與表相關的觸發(fā)器,默認為Y。
<5>filesize
exp qj/**@local filesize=10m file=C:\Users\QuJian\Desktop\qj1.dmp,C:\Users\QuJian\Desktop\qj2.dmp 
 owner=qj statistics=none
解釋:filesize可以分割導出的.dmp文件,這里我將每一個.dmp文件設置為10m,超出10m就自動導入到下一個文件,為了使導出文件夠大,在這里我導出了qj這個schema
結果如圖:
exp和imp詳解
<6>buffer
exp qj/**@local  file=C:\Users\QuJian\Desktop\t.dmp log=C:\Users\QuJian\Desktop\t.log tables=(t1,t2) statistics=none buffer=6400000
解釋:buffer可以用來設置數(shù)據(jù)行緩沖區(qū)大小,適當設置可以提高導出的速度。buffer的大小是這么計算的,比如t1這個表有5個字段,2個number(2),3個varchar2(20),一個number(2)占2個字節(jié),一個varchar2(20)占20個字節(jié),那么一行占2*2+20*3=64字節(jié),我一共導出了10W行,那么buffer=64*100000=6400000,6400000/1024/1024=6M
<7>direct和recordlength
exp qj/**@local  file=C:\Users\QuJian\Desktop\t.dmp log=C:\Users\QuJian\Desktop\t.log tables=(t1,t2) statistics=none direct=y recordlength=6400000
解釋:direct采用了直接路徑的方式,一般和recordlength參數(shù)配合使用,常規(guī)路徑導出使用SQL SELECT語句從表中抽取數(shù)據(jù),直接路徑導出則是將數(shù)據(jù)直接從磁盤讀到PGA再原樣寫入導出文件,從而避免了SQL命令處理層的數(shù)據(jù)轉換過程,大大提高了導出效率,在數(shù)據(jù)量大的情況下,直接路徑導出的效率優(yōu)勢更為明顯,recordlength指定了I/O緩沖區(qū)的大小,和buffer類似。
3、導出表空間
exp qj/***@local file=C:\Users\QuJian\Desktop\ceshi.dmp log=C:\Users\QuJian\Desktop\ceshi.log tablespaces=users statistics=none
解釋: 
tablespaces指定要導出的表空間,多個表空間中間用逗號(,)隔開,導出表空間需要有exp_full_database權限。
結果如圖:
exp和imp詳解
4、導出全庫

exp sys/**@local file=C:\Users\QuJian\Desktop\full.dmp log=C:\Users\QuJian\Desktop\full.log full=y statistics=none
解釋:full=y指明導出全庫,導出全庫的用戶必須擁有exp_full_database的權限,在這我使用sys用戶導出,用sys特權用戶導出的,必須由sys特權用戶導入。
結果如圖:
exp和imp詳解
exp和imp詳解
exp和imp詳解
exp和imp詳解
exp和imp詳解
5、rows=n,表示只導出表結構
exp qj/**@local file=C:\Users\QuJian\Desktop\t1.dmp log=C:\Users\QuJian\Desktop\t1.log  statistics=none rows=n
更多參數(shù),請參照exp help=y

二、imp
1、全部導入
不論導出的是schema,table,還是tablespace或者整個庫,如果全部導入的話,都可以同等處理,當然,導入tablespace和全庫需要有imp_full_database權限。
imp qj/***@local file=C:\Users\QuJian\Desktop\ceshi.dmp log=C:\Users\QuJian\Desktop\ceshi.log fromuser=ceshi touser=qj
解釋:imp表明這是一個導入操作,file要導入的源文件路徑,log導入日志生成的路徑,fromuser從哪個用戶導出的數(shù)據(jù),touser導入到哪個用戶,如果不知道原始文件是從哪個用戶導出來的,可以直接fromuser=(這里不寫來源用戶),導入操作會報錯,這個報錯就會提示源數(shù)據(jù)是從哪個用戶導出來的,然后再次執(zhí)行導入操作就可以了。
結果如圖:
exp和imp詳解
2、ignore參數(shù)
如果即將導入的庫中已經(jīng)有了此表,或者此表的表結構發(fā)生了變化(比如由char變成了varchar2),那么導入就會報如圖錯誤:
exp和imp詳解

這個時候,只要加上ignore=y就可以了,
語句如下:imp qj/***@local  file=C:\Users\QuJian\Desktop\demo.dmp log=C:\Users\QuJian\Desktop\demo.log fromuser=qj touser=ceshi ignore=y
結果如圖:
exp和imp詳解
3、tables參數(shù),full參數(shù),parfile參數(shù)
imp qj/***@local  file=C:\Users\QuJian\Desktop\demo.dmp log=C:\Users\QuJian\Desktop\demo.log fromuser=qj touser=ceshi tables=(demo)
imp qj/***@local  file=C:\Users\QuJian\Desktop\demo.dmp log=C:\Users\QuJian\Desktop\demo.log fromuser=qj touser=ceshi full=y
imp qj/***@local  parfile=C:\Users\QuJian\Desktop\par.txt
更多imp參數(shù),可以通過imp help=y查詢;

4、分區(qū)表的導入,index參數(shù)
如果導出數(shù)據(jù)中有分區(qū)表,那么在目標庫沒有相同DDL建表語句的時候就會報錯,解決報錯有兩種方法:
(1)在導入數(shù)據(jù)庫中,與被導入表的分區(qū)相關的表空間已對等建立好(表空間名也是與exp數(shù)據(jù)庫中一致的),那么這種情況,與普通表的imp操作是一樣的;
(2)但多數(shù)情況下,我們不知道exp數(shù)據(jù)庫中該表的物理結構,此時,可以執(zhí)行以下步驟:
<1>從源目標表中獲取分區(qū)表的DDL
語句如下:
imp qj/***@local  file=C:\Users\QuJian\Desktop\demo.dmp log=C:\Users\QuJian\Desktop\demo.log fromuser=qj touser=ceshi tables=(t1) index=C:\Users\QuJian\Desktop\t1.sql ignore=y
這樣一來,就將源表的DDL導出到C:\Users\QuJian\Desktop\t1.sql,接下來執(zhí)行第二步
<2>編輯這個分區(qū)表的DDL,如果希望和源庫的DDL一致,那么就在目標庫建立相同名稱的表空間,之后執(zhí)行這個DDL語句在目標庫先建立分區(qū)表,然后執(zhí)行導入操作(加ignore=y);如果希望用
目標庫的表空間名,那么將從源庫導出的分區(qū)表DDL中的表空間名編輯成目標庫的表空間,執(zhí)行DDL在目標庫先建立分區(qū)表,然后執(zhí)行導入操作(加ignore=y)。
三、
exp和imp參數(shù)眾多,不過我們也完全不用記那么多,只要知道怎么用就可以了,具體的可以exp/imp help=y,你就會知道怎么用的,備份作為處理數(shù)據(jù)問題最重要的手段,exp給我們提供了巨大的幫助,還是值得好好掌握的。學習oracle的路上是不孤獨的,因為你有著眾多的同行者,歡迎大家加入下面的數(shù)據(jù)庫討論群,讓我們一起互助前行。
                                                                                 exp和imp詳解


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI