oracle中imp命令詳解

xz43發表於2010-12-23
Oracle的匯入實用程式(Import utility)允許從資料庫提取資料,並且將資料寫入作業系統檔案。imp使用的基本格式:imp[username[/password[@service]]],以下例舉imp常用用法。
1. 獲取幫助
imp help=y
2. 匯入一個完整資料庫
imp system/manager file=bible_db log=dible_db full=y ignore=y
3. 匯入一個或一組指定使用者所屬的全部表、索引和其他物件
imp system/manager file=seapark log=seapark fromuser=seapark
imp system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
4. 將一個使用者所屬的資料匯入另一個使用者
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy
imp system/manager file=tank log=tank fromuser=(seapark,amy) touser=(seapark1, amy1)
5. 匯入一個表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
6. 從多個檔案匯入
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) log=paycheck, filesize=1G full=y
7. 使用引數檔案
imp system/manager parfile=bible_tables.par
bible_tables.par引數檔案:
#Import the sample tables used for the Oracle8i Database Administrator's
#Bible.
fromuser=seapark touser=seapark_copy file=seapark log=seapark_import
8. 增量匯入(9i中已經取消)
imp system./manager inctype= RECTORE FULL=Y FILE=A
Oracle imp/exp幫助說明
C:Documents and Settingsadministrator>exp help=y
Export: Release 9.2.0.1.0 - Production on 星期三 7月 28 17:04:43 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
透過輸入 EXP 命令和使用者名稱/口令,您可以
後接使用者名稱/口令的命令:
例程: EXP SCOTT/TIGER
或者,您也可以透過輸入跟有各種引數的 EXP 命令來控制“匯出”
按照不同引數。要指定引數,您可以使用關鍵字:
格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2),如果 T1 是分割槽表
USERID 必須是命令列中的第一個引數。
關鍵字說明(預設) 關鍵字 說明(預設)
--------------------------------------------------------------------------
USERID 使用者名稱/口令 FULL 匯出整個檔案 (N)
BUFFER 資料緩衝區大小 OWNER 所有者使用者名稱列表
FILE 輸出檔案 (EXPDAT.DMP) TABLES 表名稱列表
COMPRESS 匯入到一個區 (Y) RECORDLENGTH IO 記錄的長度
GRANTS 匯出許可權 (Y) INCTYPE 增量匯出型別
INDEXES 匯出索引 (Y) RECORD 跟蹤增量匯出 (Y)
DIRECT 直接路徑 (N) TRIGGERS 匯出觸發器 (Y)
LOG 螢幕輸出的日誌檔案 STATISTICS 分析物件 (ESTIMATE)
ROWS 匯出資料行 (Y) PARFILE 引數檔名
CONSISTENT 交叉表的一致性 (N) CONSTRAINTS 匯出的約束條件 (Y)
OBJECT_CONSISTENT 只在物件匯出期間設定為讀的事務處理 (N)
FEEDBACK 每 x 行的顯示進度 (0)
FILESIZE 每個轉儲檔案的最大大小
FLASHBACK_SCN 用於將會話快照設定回以前狀態的 SCN
FLASHBACK_TIME 用於獲取最接近指定時間的 SCN 的時間
QUERY 用於匯出表的子集的 select 子句
RESUMABLE 遇到與空格相關的錯誤時掛起 (N)
RESUMABLE_NAME 用於標識可恢復語句的文字字串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
TTS_FULL_CHECK 對 TTS 執行完整的或部分相關性檢查
TABLESPACES 要匯出的表空間列表
TRANSPORT_TABLESPACE 匯出可傳輸的表空間後設資料 (N)
TEMPLATE 呼叫 iAS 模式匯出的模板名
在沒有警告的情況下成功終止匯出。
==================================================
C:Documents and Settingsadministrator>imp help=y
Import: Release 9.2.0.1.0 - Production on 星期三 7月 28 17:06:54 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
可以透過輸入 IMP 命令和您的使用者名稱/口令
後接使用者名稱/口令的命令:
例程: IMP SCOTT/TIGER
或者, 可以透過輸入 IMP 命令和各種引數來控制“匯入”
按照不同引數。要指定引數,您可以使用關鍵字:
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1: P1,T1: P2),如果 T1 是分割槽表
USERID 必須是命令列中的第一個引數。
關鍵字說明(預設) 關鍵字 說明(預設)
--------------------------------------------------------------------------
USERID 使用者名稱/口令 FULL 匯入整個檔案 (N)
BUFFER 資料緩衝區大小 FROMUSER 所有人使用者名稱列表
FILE 輸入檔案 (EXPDAT.DMP) TOUSER 使用者名稱列表
SHOW 只列出檔案內容 (N) TABLES 表名列表
IGNORE 忽略建立錯誤 (N) RECORDLENGTH IO 記錄的長度
GRANTS 匯入許可權 (Y) INCTYPE 增量匯入型別
INDEXES 匯入索引 (Y) COMMIT 提交陣列插入 (N)
ROWS 匯入資料行 (Y) PARFILE 引數檔名
LOG 螢幕輸出的日誌檔案 CONSTRAINTS 匯入限制 (Y)
DESTROY 覆蓋表空間資料檔案 (N)
INDEXFILE 將表/索引資訊寫入指定的檔案
SKIP_UNUSABLE_INDEXES 跳過不可用索引的維護 (N)
FEEDBACK 每 x 行顯示進度 (0)
TOID_NOVALIDATE 跳過指定型別 ID 的驗證
FILESIZE 每個轉儲檔案的最大大小
STATISTICS 始終匯入預計算的統計資訊
RESUMABLE 在遇到有關空間的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢復語句的文字字串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
COMPILE 編譯過程, 程式包和函式 (Y)
STREAMS_CONFIGURATION 匯入 Streams 的一般後設資料 (Y)
STREAMS_INSTANITATION 匯入 Streams 的例項化後設資料 (N)
下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE 匯入可傳輸的表空間後設資料 (N)
TABLESPACES 將要傳輸到資料庫的表空間
DATAFILES 將要傳輸到資料庫的資料檔案
TTS_OWNERS 擁有可傳輸表空間集中資料的使用者
成功終止匯入,但出現警告。
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和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結合使用。
如果你真想使用EXP直接到磁帶,你可以參考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文件號:30428.1),該文中有詳細解釋。
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 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號為2261,你可以到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來獲得。
另外關於傳輸表空間的更多資訊可以參考下面的Metelink文件,本文不再詳述。
[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.
[NOTE:100698.1] Perform. tablespace point-in-time recovery using Transportable Tablespace.
六.對於有跨schema的index,imp時可能會報“Segmentation fault”錯誤。
例如schema A中建有基於schema B表的索引,在匯入A時會報上述錯誤,此時透過indexes=n來遮蔽匯入索引以防止錯誤,事後可以用以下語句查出這樣的索引,最好將索引放在和基表在同一個schema。
SQL>select index_name,owner,table_name,table_owner
from dba_indexes
where owner!=table_owner;
七.匯入到不同於原表空間的表空間
原來的資料在USERS表空間裡面,我想把它IMP進APP表空間,我已經修改了目的使用者的預設表空間,為什麼結果還是IMP到USERS表空間中了呢?
Solution:Oracle並沒有提供什麼引數來指定要匯入哪個表空間,資料預設將匯入到原本匯出時資料所在的表空間中,但是我們可以透過以下的方法來實現匯入到不同的表空間。
1.在IMP時候使用INDEXFILE引數
當給此引數指定了某一檔名,IMP的時候所有的index將不會直接匯入到表空間中,而是在指定的檔案中生成建立index的指令碼。
然後用文字編輯器開啟此檔案,直接編輯指令碼中的storage引數,修改為想要匯入的表空間名稱。
然後重新執行IMP,使用INDEXS=n引數將除Index之外的Objects匯入。
最後進入SQL*PLUS,直接執行剛才編輯的指令碼,生成索引。
該方法適用於將index以及constraints匯入指定的表空間。
2.改變目的使用者的預設表空間
這就是上面說的經常有人提問的方法。但是上述的問題之所以沒有成功,是因為缺少了下面的幾步。
首先,收回目的使用者的"UNLIMITED TABLESPACE"許可權:
revoke unlimited tablespace from username;
其次,取消目的使用者在原資料匯出表空間中的配額,這樣才能迫使IMP把資料匯入到使用者的預設表空間中去。
然後,將希望匯入的表空間設為目的使用者的預設表空間,並新增配額。
最後,執行IMP。
3.使用TOAD
TOAD是強大的Oracle資料庫管理軟體,是Quest出品的第三方軟體,我們可以使用其中的Rebuild Multi Objects工具來實現將多個Object轉移到指定的表空間。
於是我們可以不管三七二十一,先IMP,然後再用TOAD作事後的修改。
關於TOAD的使用,此處不作詳細解釋。
八.匯入工具imp可能出現的問題
(1) 資料庫物件已經存在
一般情況, 匯入資料前應該徹底刪除目標資料下的表, 序列, 函式/過程,觸發器等;
資料庫物件已經存在, 按預設的imp引數, 則會匯入失敗
如果用了引數ignore=y, 會把exp檔案內的資料內容匯入
如果表有唯一關鍵字的約束條件, 不合條件將不被匯入
如果表沒有唯一關鍵字的約束條件, 將引起記錄重複
(2) 資料庫物件有主外來鍵約束
不符合主外來鍵約束時, 資料會匯入失敗
解決辦法: 先匯入主表, 再匯入依存表
disable目標匯入物件的主外來鍵約束, 匯入資料後, 再enable它們
(3) 許可權不夠
如果要把A使用者的資料匯入B使用者下, A使用者需要有imp_full_database許可權
(4) 匯入大表( 大於80M ) 時, 儲存分配失敗
預設的EXP時, compress = Y, 也就是把所有的資料壓縮在一個資料塊上.
匯入時, 如果不存在連續一個大資料塊, 則會匯入失敗.
匯出80M以上的大表時, 記得compress= N, 則不會引起這種錯誤.
(5) imp和exp使用的字符集不同
如果字符集不同, 匯入會失敗, 可以改變unix環境變數或者NT登錄檔裡 NLS_LANG相關資訊.匯入完成後再改回來.
(6) imp和exp版本不能往上相容
imp可以成功匯入低版本exp生成的檔案, 不能匯入高版本exp生成的檔案
根據情況我們可以用低版本的oracle客戶端的exp匯出資料庫,然後進行匯入操作。
(7)ROLLBACK段不夠
Export/Import使用過程中, 如果資料量很大會出現'ROLLBACK段不夠'的錯誤. 這時要建一個足夠大的ROLLBACK段, 使它ONLINE而其他ROLLBACK段OFFLINE. 這樣, Export/Import使用這個大ROLLBACK段, 從而避免上述現象.
(8)EXPORT/IMPORT對SQUENCE的影響
在兩種情況下,EXPORT/IMPORT會對SEQUENCE。
a. 如果在EXPORT時,使用者正在取SEQUENCE的值,可能造成SEQUENCE的不一致。
b. 另外如果SEQUENCE使用CACHE,在EXPORT時,那些在CACHE中的值就會被忽略的,只是從資料字典裡面取當前值EXPORT。如果在進行FULL方式的EXPORT/IMPORT時,恰好在用sequence更新表中某列資料, 而且不是上面兩種
情況,則匯出的是更新前的資料。如果採用常規路徑方式,每一行資料都是用INSERT語句,一致性檢查和INSERT TRIGGER 如果採用DIRECT方式,某些約束和trigger可能不觸發,如果在trigger中使用sequence.nextval,將會對sequence有影響。
九.ORACLE獲取DDL的幾種常用的方法
大體的分為三種方法:
1.可以透過toad、plsql develop等第三方工具進行匯出DLL操作,用這種辦法的好處在於操作簡單方便,但需要安裝,下面簡單介紹一下用這兩個工具獲得DLL語句的操作。
2.直接透過EXP/IMP工具
Oracle提供的最原始最實用的匯入匯出工具,我們大體上可以分為三種辦法實現匯出DDL。
a. 透過imp指定indexfile引數,但這種辦法不爽在於有每行前會有REM
語法大體如下:
exp userid=... tables=emp rows=n file=emp.dmp
imp userid=... file=emp.dmp indexfile=emp.sql
b. 透過imp指定show=y,同時指定log引數,格式上也不是很爽,在格式上很美觀的還是透過工具匯出的比較美觀
語法大體如下:
exp userid=... tables=emp rows=n file= emp.dmp
imp userid=... file= emp.dmp show=y log=emp.sql
c. 利用unix下有strings命令,語法大體如下,這種方法比較野蠻:
exp userid=... tables=tab1 rows=n file=tab1.dmp
strings emp.dmp >emp.sql
emp.sql中就有DLL語句了
3.透過9i的DBMS_METADATA包得到DLL語句
基本上用到的語法如下:
a. 獲取單個的建表和建索引的語法
set heading off;
set echo off;
Set pages 999;
set long 90000;
spool DEPT.sql
select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual;
select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual;
spool off;
b.獲取一個SCHEMA下的所有建表和建索引的語法,以scott為例:
set pagesize 0
set long 90000
set feedback off
set echo off
spool scott_schema.sql
connect scott/tiger;
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM USER_TABLES u;
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name)
FROM USER_INDEXES u;
spool off;
c. 獲取某個SCHEMA的建全部儲存過程的語法
connect brucelau /brucelau;
spool procedures.sql
select
DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name)
from
user_objects u
where
object_type = 'PROCEDURE';
spool off;
另:dbms_metadata.get_ddl('TABLE','TAB1','USER1')
三個引數中,第一個指定匯出DDL定義的物件型別(此例中為表型別),第二個是物件名(此例中即表名),第三個是物件所在的使用者名稱。
十.最佳化exp和imp的效能
exp /imp 可配置一些引數,以改進Export和Import的效能。至於效能具體能提升多
高,則取決於要匯出或匯入的資料,以及資料量的大小。
匯出效能:用以下通用引數改進Export的效能:
DIRECT:對一個Export,將DIRECT引數設為DIRECT=Y,將資料直接轉移到Export客戶端。這樣的轉移繞過SQL命令處理層(估值緩衝區),從而避免了無謂的資料轉換。
RECORDLENGTH:增大RECORDLENGTH引數值,來改進效能。為該引數推薦的值是DB_BLOCK_SIZE的一個整數倍,或者是檔案系統I/O塊大小的一個整數倍。更改這個引數的值會影響寫入磁碟前積累的資料量。該引數的最大值為64千位元組(64 KB)。
匯入效能:用以下通用引數改進Import的效能:
BUFFER:BUFFER引數指定了緩衝區的大小,資料行將透過這個緩衝區進行轉移,由此便決定了由Import匯入的每個陣列插入中的行數。如配合COMMIT=Y引數指定BUFFER引數,則Import會在每一個陣列插入之後進行提交,而不是在載入完整的表之後再預設地提交。一個較大的BUFFER引數值有助於改善效能。但假如BUFFER值過高,會造成OS分頁和換行,反而影響效能。
INDEXES。INDEXES引數指定是否匯入使用者生成的索引。如指定INDEXES=N,則將提高Import的效能,因為在一個無索引的表中匯入資料要快得多。注意,如果首先用INDEXFILE=返回Import,來在請求的Import模式下提取索引建立命令,再將其寫入指定的檔案,那麼以後仍可重建索引。
使用INDEXFILE選項時,不會匯入資料物件。可對輸出檔案()進行編輯,並將其作為一個SQL指令碼使用,以便在Import之後建立索引。
另外還可以透過調整一下引數提高exp和imp的效能
• 修改sqlnet.ora在裡面增加trace_level_client=off
• 執行dbmspool.sql然後SQL>begin
SQL> dbms_shared_pool.sizes(300);
SQL> end;
SQL> /
• sql>ALTER SYSTEM FLUSH SHARED_POOL
• sql>alter system set LOG_CHECKPOINT_INTERVAL = redologfilesizebytes/512bytes=1000
也可以修改log_checkpoint_timeout=24000
• sql>alter system set fast_start_mttr_target =24000
• sql>alter system set pga_aggregate_target=100M
沒有下commit=y所以只有透過
A.select undtsn,undoblks from v$undostat;的變化來看資料又沒有進去了
B. 在imp時透過設定 FEEDBACK=N筆資料來顯示Imp的進度
重整的時候如果要drop 掉table重建的話,一定要注意該table上有沒有FK等
在EXP /IMP的時候為了加速需要將index=n引數加進exp/imp執行指令碼,這樣的話在做完imp後需要recreate index 其實資料量大的話recreate也很花時間,故可以透過在create index 的指令碼里面加入parallel 5;來提速
另I/O可以在Windows 的效能的地方看到
十一.IMPORT時的物件倒入順序
在倒入資料時,ORACLE有一個特定的順序,可能隨資料庫版本不同而有所變化,
但是現在是這樣的。
1. Tablespaces 14. Snapshot Logs
2. Profiles 15. Job Queues
3. Users 16. Refresh Groups
4. Roles 17. Cluster Definitions
5. System Privilege Grants 18. Tables (also grants,comments,
6. Role Grants indexes, constraints, auditing)
7. Default Roles 19. Referential Integrity
8. Tablespace Quotas 20. POSTTABLES actions
9. Resource Costs 21. Synonyms
10. Rollback Segments 22. Views
11. Database Links 23. Stored Procedures
12. Sequences 24. Triggers, Defaults and Auditing
13. Snapshots
按這個順序主要是解決物件之間依賴關係可能產生的問題。TRIGGER最後匯入,所以在INSERT資料到資料庫時不會激發TRIGGER。在匯入後可能會有一些狀態是INVALID的PROCEDURE,主要是IMPORT時會影響一些資料庫物件,而IMPORT並不重新編譯PROCEDURE,從而造成這種情況,可以重新編譯之,就能解決這個問題。
十二. Imp/exp的模糊匯入匯出
前段時間在網上看到一篇關於imp/exp模糊匯入匯出的文章,甚感興趣,今天中午做了一個測試,感覺Oracle實在是博大,有很多東西不用的話,對我們來說永遠是一個陌生的地帶。揭去面紗,也就那麼回事!
說明:使用萬用字元匯出的最大優點,就是當你的庫中有很多表,但你又不想全導,只導其中一部分的時候,你可以儘可能的少寫部分程式碼,提供工作效率!
我一般喜歡以示例的方式展現或表達一些東西,這樣大家可能瞭解/掌握的更快以下!畢竟很多東西我們大部分同志知其然就可以了!嘿嘿。^|^
備註:該項特性在9i以後新增
測試過程如下:
SQL> conn study/study
已連線。
SQL>
SQL> create table toms_test_1 (no int);
表已建立。
SQL> create table toms_test_2 (no int);
表已建立。
SQL> create table toms_test_3 (no int);
表已建立。
SQL> insert into toms_test_1 values(1);
已建立 1 行。
SQL> insert into toms_test_2 values(2);
已建立 1 行。
SQL> insert into toms_test_3 values(3);
已建立 1 行。
SQL> commit;
提交完成。
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
C:Documents and Settings>e:
E:>exp study/study tables=(study.toms_test%) file=toms_test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:42:32 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將匯出指定的表透過常規路徑 ...
. . 正在匯出表 TOMS_TEST_1 1 行被匯出
. . 正在匯出表 TOMS_TEST_2 1 行被匯出
. . 正在匯出表 TOMS_TEST_3 1 行被匯出
在沒有警告的情況下成功終止匯出。
SQL>
SQL> drop table toms_test_1;
表已丟棄。
SQL> drop table toms_test_2;
表已丟棄。
SQL> drop table toms_test_3;
表已丟棄。
SQL>
SQL> select table_name from tabs where table_name like 'TOMS_TEST%';
未選定行
SQL>
E:>imp study/study file=toms_test.dmp fromuser=study touser=study
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:44:01 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
經由常規路徑匯出由EXPORT:V09.02.00建立的檔案
已經完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的匯入
. . 正在匯入表 "TOMS_TEST_1" 1行被匯入
. . 正在匯入表 "TOMS_TEST_2" 1行被匯入
. . 正在匯入表 "TOMS_TEST_3" 1行被匯入
成功終止匯入,但出現警告。
E:>
SQL> select table_name from tabs where table_name like 'TOMS_TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL> select * from toms_test_1;
NO
----------
1
SQL> select * from toms_test_2;
NO
----------
2
SQL> select * from toms_test_3;
NO
----------
3
SQL>
SQL> select table_name from tabs where table_name like '%TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL>
E:>exp study/study tables=(study.%test%) file=test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:51:56 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將匯出指定的表透過常規路徑 ...
. . 正在匯出表 TOMS_TEST_1 1 行被匯出
. . 正在匯出表 TOMS_TEST_2 1 行被匯出
. . 正在匯出表 TOMS_TEST_3 1 行被匯出
在沒有警告的情況下成功終止匯出。
E:>
SQL> drop table toms_test_1;
表已丟棄。
SQL> drop table toms_test_2;
表已丟棄。
SQL> drop table toms_test_3;
表已丟棄。
SQL>
E:>imp study/study file=test.dmp fromuser=study touser=study
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 12:53:11 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
經由常規路徑匯出由EXPORT:V09.02.00建立的檔案
已經完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的匯入
. . 正在匯入表 "TOMS_TEST_1" 1行被匯入
. . 正在匯入表 "TOMS_TEST_2" 1行被匯入
. . 正在匯入表 "TOMS_TEST_3" 1行被匯入
成功終止匯入,但出現警告。
E:>
SQL> select table_name from tabs where table_name like '%TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL>
E:>exp study/study tables=(%test%) file=test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:08:56 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將匯出指定的表透過常規路徑 ...
. . 正在匯出表 TOMS_TEST_1 1 行被匯出
. . 正在匯出表 TOMS_TEST_2 1 行被匯出
. . 正在匯出表 TOMS_TEST_3 1 行被匯出
在沒有警告的情況下成功終止匯出。
E:>
SQL> conn toms/toms
已連線。
SQL> create table stu_1 (no int);
表已建立。
SQL> create table stu_2 (no int);
表已建立。
SQL> insert into stu_1 values(1);
已建立 1 行。
SQL> insert into stu_2 values(2);
已建立 1 行。
SQL> commit;
提交完成。
E:>exp study/study tables=(%test%,toms.stu%) file=test.dmp rows=y
Export: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:11:05 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將匯出指定的表透過常規路徑 ...
. . 正在匯出表 TOMS_TEST_1 1 行被匯出
. . 正在匯出表 TOMS_TEST_2 1 行被匯出
. . 正在匯出表 TOMS_TEST_3 1 行被匯出
當前的使用者已更改為 TOMS
. . 正在匯出表 STU_1 1 行被匯出
. . 正在匯出表 STU_2 1 行被匯出
在沒有警告的情況下成功終止匯出。
SQL> conn study/study
已連線。
SQL> drop table toms_test_1;
表已丟棄。
SQL> drop table toms_test_2;
表已丟棄。
SQL> drop table toms_test_3;
表已丟棄。
SQL> select table_name from tabs where table_name like '%TEST%';
未選定行
SQL> conn toms/toms
已連線。
SQL> drop table stu_1;
表已丟棄。
SQL> drop table stu_2;
表已丟棄。
SQL> select table_name from tabs where table_name like '%STU%';
未選定行
SQL>
E:>imp study/study file=test.dmp fromuser=study touser=study tables=(%test%)
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:15:22 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
經由常規路徑匯出由EXPORT:V09.02.00建立的檔案
已經完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的匯入
. . 正在匯入表 "TOMS_TEST_1" 1行被匯入
. . 正在匯入表 "TOMS_TEST_2" 1行被匯入
. . 正在匯入表 "TOMS_TEST_3" 1行被匯入
成功終止匯入,但出現警告。
SQL> conn study/study
已連線。
SQL> select table_name from tabs where table_name like '%TEST%';
TABLE_NAME
------------------------------
TOMS_TEST_1
TOMS_TEST_2
TOMS_TEST_3
SQL> select * from toms_test_1;
NO
----------
1
SQL> select * from toms_test_2;
NO
----------
2
SQL> select * from toms_test_3;
NO
----------
3
SQL>
E:>imp study/study fromuser=toms touser=toms file=test.dmp tables=(stu%)
Import: Release 9.2.0.1.0 - Production on 星期三 6月 7 13:23:49 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
經由常規路徑匯出由EXPORT:V09.02.00建立的檔案
已經完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的匯入
. 正在將TOMS的物件匯入到 TOMS
. . 正在匯入表 "STU_1" 1行被匯入
. . 正在匯入表 "STU_2" 1行被匯入
成功終止匯入,但出現警告。
E:>
SQL> conn toms/toms
已連線。
SQL> select table_name from tabs where table_name like '%STU%';
TABLE_NAME
------------------------------
STU_1
STU_2
SQL> select * from stu_1;
NO
----------
1
SQL> select * from stu_2;
NO
----------
2
SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-682475/,如需轉載,請註明出處,否則將追究法律責任。

相關文章