Oracle導入、導出程序使用詳解(07-7-25)
http://www.sina.com.cn 2007年07月25日 13:44 審計署網站
Oracle數據庫對于我們審計人員來講,應該是既熟悉又陌生,熟悉的是在計算機輔助審計中,常常要從被審計單位的Oracle數據庫中導出數據,然后再導入到自己電腦的Oracle數據庫中,通過如ACCSE、EXCEL、SQL等調用ODBC數據源,進行數據再加工處理。然而Oracle的導入(Imp)、導出(Exp)實用程序的使用方法對于不從事數據庫管理的人員來說不易掌握。這里就向各位詳細介紹Oracle8i和Oracle9i的兩個實用程序的使用方法,以幫助審計人員熟練掌握。一、Oracle8i EXP常用選項1、FULL,這個用于導出整個數據庫,在ROWS=N一起使用時,可以導出整個數據庫的結構。例如:exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y2、BUFFER和FEEDBACK,在導出比較多的數據時,要考慮設置這兩個參數。例如:exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT3、FILL和LOG,這兩個參數分別指定備份的DMP名稱和LOG名稱,包括文件名和目錄,例子見上面。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=n6、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'"""二、Oracle8i 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 encounteredORA-00904: invalid column name這是一個已經公布的BUG,在Oracle10.0中已解決,BUG號為2261。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$ rwhere u.user# = o.owner#and r.obj# = o.obj#and (uid = 0 oruid = o.owner# orexists ( 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因為目前使用得較少,不作詳細解釋。關于EXP/IMP的詳細參數信息你可以通過EXP/IMP HELP=Y來獲得。在進行并行EXP/IMP的時候,如果IMP過程建索引的話不建議同時運行5個以上的IMP,如果你想加快速度,可以在IMP的時候不建索引,這樣只要內存允許,可以多跑幾個,然后是SQL腳本創建需要的索引。(作者: 江蘇省海安縣審計局闕圣貴)
(本文內容僅為作者個人觀點,不代表任何審計機關和本網站的觀點,未經許可,不得轉載)