Oracle8i 9i EXP IMP使用經驗

2021-04-02 07:23:21 字數 4049 閱讀 4350

一、8i exp常用選項

1、full,這個用於匯出整個資料庫,在rows=n一起使用時,可以匯出整個資料庫的結構。例如:

exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y

2、buffer和feedback,在匯出比較多的資料時,我會考慮設定這兩個引數。例如:

exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=wo4,ok_yt

3、fill和log,這兩個引數分別指定備份的dmp名稱和log名稱,包括檔名和目錄,例子見上面。

需要說明的是,exp可以直接備份到磁帶中,即使用file=/dev/rmt0(磁帶裝置名),但是一般我們都不這麼做,原因有二:一、這樣做的速度會慢很多,二、現在一般都是使用磁帶庫的,不建議直接對磁帶進行操作。至於沒有使用磁帶庫的朋友可以考慮和unix的tar結合使用。

4、compress引數將在匯出的同時合併碎塊,盡量把資料壓縮到initial的extent裡,預設是n,一般建議使用。direct引數將告訴exp直接讀取資料,而不像傳統的exp那樣,使用select來讀取表中的資料,這樣就減少了sql語句處理過程。一般也建議使用。不過有些情況下direct引數是無法使用的。

5、如何使用sysdba執行exp/imp?

這是乙個很現實的問題,有時候我們需要使用sysdba來執行exp/imp,如進行傳輸表空間的exp/imp,以及在9i下用sys使用者來執行exp/imp時,都需要使用sysdba才可。我們可以使用下面方式連入exp/imp:

exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n

6、query引數後面跟的是where條件,值得注意的是,整個where子句需要使用""括起來,where子句的寫法和select中相同,如果是unix平台所有"和'都需要使用/u26469遮蔽它們的特殊含義:

exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"

如果是windows平台,則使用下面的格式:

exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""

二、8i imp常用選項

1、fromuser和touser,使用它們實現將資料從乙個schema中匯入到另外乙個schema中。

2、ignore、grants和indexes,其中ignore引數將忽略表的存在,繼續匯入,這個對於需要調整表的儲存引數時很有用,我們可以先根據實際情況用合理的儲存引數建好表,然後直接匯入資料。而grants和indexes則表示是否匯入授權和索引,如果想使用新的儲存引數重建索引,或者為了加快到入速度,我們可以考慮將indexes設為n,而grants一般都是y。

另外乙個exp/imp都有的引數是parfile,它是用來定義exp/imp的引數檔案,也就是說,上面的引數都可以寫在乙個引數檔案中,但我們一般很少使用。

三、oracle9i exp功能描述

oracle9i exp在原有的基礎上新增了部分新的引數,按功能主要分為以下幾個部分:

1、object_consistent - 用於設定exp物件為唯讀以保持物件的一致性。預設是n。

2、flashback_scn和flashback_time - 用於支援flashback功能而新增。

3、resumable、resumable_name和resumable_timeout - 用於支援resumable空間分配而新增。

4、tts_full_check - 用於在傳輸表空間時使用依賴性檢查。

5、template - 用於支援ias。

6、tablespaces - 設定表空間匯出模式。個人覺得對於一般使用者而言,這個才是新增引數中最實用的乙個,可以讓使用者在原來的full、owner、tables的基礎上多了一種選擇,使得exp更加靈活。

四、不同版本的exp/imp問題?

一般來說,從低版本匯入到高版本問題不大,麻煩的是將高版本的資料匯入到低版本中,在oracle9i之前,不同版本oracle之間的exp/imp可以通過下面的方法來解決:

1、在高版本資料庫上執行底版本的catexp.sql;

2、使用低版本的exp來匯出高版本的資料;

3、使用低版本的imp將資料庫匯入到底版本資料庫中;

4、在高版本資料庫上重新執行高版本的catexp.sql指令碼。

但在9i中,上面的方法並不能解決問題。如果直接使用底版本exp/imp會出現如下錯誤:

exp-00008: oracle error %lu encountered

ora-00904: invalid column name

這已經是乙個公布的bug,需要等到oracle10.0才能解決,bug號為2261722,你可以到metalink上去檢視有關此bug的詳細資訊。

bug歸bug,我們的工作還是要做,在沒有oracle的支援之前,我們就自己解決。在oracle9i中執行下面的sql重建exu81rls檢視即可。

create or replace view exu81rls

(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)

as select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,

decode(bitand(r.stmt_type,1), 0,'', 'select,')

|| decode(bitand(r.stmt_type,2), 0,'', 'insert,')

|| decode(bitand(r.stmt_type,4), 0,'', 'update,')

|| decode(bitand(r.stmt_type,8), 0,'', 'delete,'),

r.check_opt, r.enable_flag,

decode(bitand(r.stmt_type, 16), 0, 0, 1)

from user$ u, obj$ o, rls$ r

where u.user# = o.owner#

and r.obj# = o.obj#

and (uid = 0 or

uid = o.owner# or

exists ( select * from session_roles where role='select_catalog_role')

) /

grant select on sys.exu81rls to public;

/ 五、其他問題

本文只討論了oracle8i和9i中的exp/imp的一些情況,對於之前的版本,在8.0.x中,除了query引數不能用外,其它差別不大。針對沒有query的情況,我們可以先在資料庫中使用查詢條件建立臨時中間表,然後使用exp匯出這個中間表即可。至於oracle7因為目前使用的人較少,gototop不打算在此做詳細解釋了,如果讀者朋友有需求,你可以參考metalink文件:「overview of export and import in oracle7」(文件號:61949.1)。關於exp/imp的詳細引數資訊你可以通過exp/imp help=y來獲得。

[note:77523.1] transportable tablespaces -- an example to setup and use.

[note:100698.1] perform tablespace point-in-time recovery using transportable tablespace.

在進行並行exp/imp的時候,如果imp過程建索引的話不建議同時執行5個以上的imp,如果你想加快速度,可以在imp的時候不建索引,這樣只要記憶體允許,可以多跑幾個,然後是sql指令碼建立需要的索引。

ORACLE 8i,9i 表連線方法

一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right full outer join left outer join 左外關聯 select e.last name,e.depa...

Oracle8i 9i EXP IMP使用經驗

一 8i exp常用選項 1 full,這個用於匯出整個資料庫,在rows n一起使用時,可以匯出整個資料庫的結構。例如 exp sys file db str.dmp log db str.log full y rows n compress y direct y 2 buffer和feedbac...

Oracle8i 9i EXP IMP使用經驗

一 8i exp常用選項 1 full,這個用於匯出整個資料庫,在rows n一起使用時,可以匯出整個資料庫的結構。例如 exp sys file db str.dmp log db str.log full y rows n compress y direct y 2 buffer和feedbac...