標籤:des style io os ar 使用 for sp 檔案
本文對Oracle資料的匯入匯出 imp ,exp 兩個命令進行了介紹, 並對其對應的參數進行了說明,然後通過一些示範範例進行演練,加深理解.
文章最後對運用這兩個命令可能出現的問題(如許可權不夠,不同oracle版本號碼)進行了探討,並提出了對應的解決方式;
本文部分內容摘錄自網路,感謝網友的經驗總結;
一.說明
oracle 的exp/imp命令用於實現對資料庫的匯出/匯入操作;
exp命令用於把資料從遠端資料庫server匯出至本地,產生dmp檔案;
imp命令用於把本地的資料庫dmp檔案從本地匯入到遠端Oracle資料庫中。
二.文法
能夠通過在命令列輸入 imp help=y 擷取imp的文法資訊:
=============================================================================
C:/Documents and Settings/auduser>imp help=y
Import: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:21:57 2008
(c) Copyright 2001 Oracle Corporation. All rights reserved.
能夠通過輸入 IMP 命令和您的username/口令
後接username/口令的命令:
常式: IMP SCOTT/TIGER
或者, 能夠通過輸入 IMP 命令和各種參數來控制“匯入”
依照不同參數。要指定參數,您能夠使用keyword:
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
常式: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1: P1,T1: P2),假設 T1 是分區表
USERID 必須是命令列中的第一個參數。
keyword 說明(預設) keyword 說明(預設)
--------------------------------------------------------------------------
USERID username/口令 FULL 匯入整個檔案 (N)
BUFFER 資料緩衝區大小 FROMUSER 全部人username列表
FILE 輸入檔案 (EXPDAT.DMP) TOUSER username列表
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)
下列keyword僅用於可傳輸的資料表空間
TRANSPORT_TABLESPACE 匯入可傳輸的資料表空間中繼資料 (N)
TABLESPACES 將要傳輸到資料庫的資料表空間
DATAFILES 將要傳輸到資料庫的資料檔案
TTS_OWNERS 擁有可傳輸資料表空間集中資料的使用者
==============================================
相同能夠通過輸入 exp help=y 擷取exp的文法資訊
Microsoft Windows XP [版本號碼 5.1.2600]
(C) 著作權全部 1985-2001 Microsoft Corp.
C:/Documents and Settings/auduser>exp help=y
Export: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:26:34 2008
(c) Copyright 2001 Oracle Corporation. All rights reserved.
通過輸入 EXP 命令和username/口令,您能夠
後接username/口令的命令:
常式: EXP SCOTT/TIGER
或者,您也能夠通過輸入跟有各種參數的 EXP 命令來控制“匯出”
依照不同參數。要指定參數,您能夠使用keyword:
格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
常式: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2),假設 T1 是分區表
USERID 必須是命令列中的第一個參數。
keyword 說明(預設) keyword 說明(預設)
--------------------------------------------------------------------------
USERID username/口令 FULL 匯出整個檔案 (N)
BUFFER 資料緩衝區大小 OWNER 全部者username列表
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 交叉表一致性 CONSTRAINTS 匯出約束條件 (Y)
FEEDBACK 每 x 行顯示運行進度 (0)
FILESIZE 每一個轉儲檔案的最大大小
FLASHBACK_SCN 用於回調會話快照的 SCN
FLASHBACK_TIME 用來獲得最接近於指定時間的 SCN 的時間
QUERY 用來匯出表的子集的選擇子句
RESUMABLE 遇到與空格有關的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢複語句的文本字串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
TTS_FULL_CHECK 對 TTS 運行全然或部分相關性檢查
TABLESPACES 要匯出的資料表空間列表
TRANSPORT_TABLESPACE 匯出可傳輸的資料表空間中繼資料 (N)
TEMPLATE 調用 iAS 模式匯出的模板名稱
三.使用示範範例
3.1 資料匯出:
1 將資料庫SampleDB全然匯出,usernamesystem passwordmanager 匯出到E:/SampleDB.dmp中
exp system/[email protected] file=E:/sampleDB.dmp full=y
2 將資料庫中system使用者與sys使用者的表匯出
exp system/[email protected] file=E:/sampleDB.dmp owner=(system,sys)
3 將資料庫中的表 TableA,TableB 匯出
exp system/[email protected] file=E:/sampleDB.dmp tables=(TableA,TableB)
4 將資料庫中的表tableA中的欄位filed1 值為 "王五" 的資料匯出
exp system/[email protected] file=E:/sampleDB.dmp tables=(tableA) query=‘ where filed1=‘王五‘
假設想對dmp檔案進行壓縮,能夠在上面命令後面 加上 compress=y 來實現。
3.2 資料的匯入
1 將備份資料庫檔案裡的資料匯入指定的資料庫SampleDB 中,假設 SampleDB 已存在該表,則不再匯入;
imp system/[email protected] file=E:/sampleDB.dmp full=y ignore=y
2 將d:/daochu.dmp中的表table1 匯入
imp system/[email protected] file=E:/sampleDB.dmp tables=(table1)
3. 匯入一個完整資料庫
imp system/manager file=bible_db log=dible_db full=y ignore=y
4. 匯入一個或一組指定使用者所屬的所有表、索引和其它對象
imp system/manager file=seapark log=seapark fromuser=seapark imp
system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
5. 將一個使用者所屬的資料匯入還有一個使用者
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)
6. 匯入一個表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
7. 從多個檔案匯入
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
log=paycheck, filesize=1G full=y
8. 使用參數檔案
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
參數檔案示範範例見附錄
9. 增量匯入
imp system./manager inctype= RECTORE FULL=Y FILE=A
不少情況下要先將表徹底刪除,然後匯入。
四.參數說明
4.1、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 c/[email protected] file=c.dmp log=c.log tables=t query="""where id=1 and name=‘gototop‘"""
4.2、8i IMP經常使用選項
1、FROMUSER和TOUSER,使用它們實現將資料從一個SCHEMA中匯入到另外一個SCHEMA中。
2、IGNORE、GRANTS和INDEXES,當中IGNORE參數將忽略表的存在,繼續匯入,這個對於須要調整表的儲存參數時非常實用,我們能夠先依據實際情況用合理的儲存參數建好表,然後直接匯入資料。而GRANTS和INDEXES則表示是否匯入授權和索引,假設想使用新的儲存參數重建索引,或者為了加快到入速度,我們能夠考慮將INDEXES設為N,而GRANTS一般都是Y。
另外一個EXP/IMP都有的參數是PARFILE,它是用來定義EXP/IMP的參數檔案,也就是說,上面的參數都能夠寫在一個參數檔案裡,但我們一般非常少使用。
4.4、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.
在進行並行EXP/IMP的時候,假設IMP過程建索引的話不建議同一時候執行5個以上的IMP,假設你想加高速度,能夠在IMP的時候不建索引,這樣僅僅要記憶體同意,能夠多跑幾個,然後是SQL指令碼建立須要的索引。
注意:
操作者要有足夠的許可權,許可權不夠它會提示。
資料庫能否夠連上, 能夠用tnsping TestDB 來獲得資料庫 TestDB 能否連上。
附錄一:
給使用者添加匯入資料許可權的操作
第一, 啟動sql*puls
第二,以system/manager登陸
第三,create user username IDENTIFIED BY password (假設已經建立過使用者,這步能夠省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO username字
第五, 執行-cmd-進入dmp檔案所在的檔案夾,
imp userid=system/manager full=y file=*.dmp
或者 imp userid=system/manager full=y file=filename.dmp
附錄二:
Oracle 不同意直接改變表的擁有者, 利用Export/Import能夠達到這一目的.
先建立import9.par,
然後,使用時命令例如以下:imp parfile=/filepath/import9.par
例 import9.par 內容例如以下:
FROMUSER=TGPMS
TOUSER=TGPMS2 (註:把表的擁有者由FROMUSER改為TOUSER,FROMUSER和TOUSER的使用者能夠不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623.dmp
log==/backup/import_20030623.log
ORACLE EXP命令