本文對Oracle exp,imp(導入導出)命令數(shù)據(jù)遷移用法和注意事項進行了介紹, 并對其對應的參數(shù)進行了說明,然后通過一些演示樣例進行演練,加深理解.
文章最后對運用這兩個命令可能出現(xiàn)的問題(如權限不夠,不同oracle版本號)進行了探討,并提出了對應的解決方式;
一.說明
oracle 的exp/imp命令用于實現(xiàn)對數(shù)據(jù)庫的導出/導入操作;
exp命令用于把數(shù)據(jù)從遠程數(shù)據(jù)庫server導出至本地,生成dmp文件;
imp命令用于把本地的數(shù)據(jù)庫dmp文件從本地導入到遠程的Oracle數(shù)據(jù)庫中。
二.語法
能夠通過在命令行輸入 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 命令和各種參數(shù)來控制“導入”
依照不同參數(shù)。要指定參數(shù),您能夠使用keyword:
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1: P1,T1: P2),假設 T1 是分區(qū)表
USERID 必須是命令行中的第一個參數(shù)。
keyword 說明(默認) keyword 說明(默認)
--------------------------------------------------------------------------
USERID username/口令 FULL 導入整個文件 (N)
BUFFER 數(shù)據(jù)緩沖區(qū)大小 FROMUSER 全部人username列表
FILE 輸入文件 (EXPDAT.DMP) TOUSER username列表
SHOW 僅僅列出文件內(nèi)容 (N) TABLES 表名列表
IGNORE 忽略創(chuàng)建錯誤 (N) RECORDLENGTH IO 記錄的長度
GRANTS 導入權限 (Y) INCTYPE 增量導入類型
INDEXES 導入索引 (Y) COMMIT 提交數(shù)組插入 (N)
ROWS 導入數(shù)據(jù)行 (Y) PARFILE 參數(shù)文件名稱
LOG 屏幕輸出的日志文件 CONSTRAINTS 導入限制 (Y)
DESTROY 覆蓋表空間數(shù)據(jù)文件 (N)
INDEXFILE 將表/索引信息寫入指定的文件
SKIP_UNUSABLE_INDEXES 跳過不可用索引的維護 (N)
FEEDBACK 每 x 行顯示運行進度 (0)
TOID_NOVALIDATE 跳過指定類型 ID 的驗證
FILESIZE 每一個轉(zhuǎn)儲文件的最大大小
STATISTICS 始終導入估計算的統(tǒng)計信息
RESUMABLE 遇到與空格有關的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢復語句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
COMPILE 編譯過程, 程序包和函數(shù) (Y)
下列keyword僅用于可傳輸?shù)谋砜臻g
TRANSPORT_TABLESPACE 導入可傳輸?shù)谋砜臻g元數(shù)據(jù) (N)
TABLESPACES 將要傳輸?shù)綌?shù)據(jù)庫的表空間
DATAFILES 將要傳輸?shù)綌?shù)據(jù)庫的數(shù)據(jù)文件
TTS_OWNERS 擁有可傳輸表空間集中數(shù)據(jù)的用戶
==============================================
相同能夠通過輸入 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
或者,您也能夠通過輸入跟有各種參數(shù)的 EXP 命令來控制“導出”
依照不同參數(shù)。要指定參數(shù),您能夠使用keyword:
格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2),假設 T1 是分區(qū)表
USERID 必須是命令行中的第一個參數(shù)。
keyword 說明(默認) keyword 說明(默認)
--------------------------------------------------------------------------
USERID username/口令 FULL 導出整個文件 (N)
BUFFER 數(shù)據(jù)緩沖區(qū)大小 OWNER 全部者username列表
FILE 輸出文件 (EXPDAT.DMP) TABLES 表名稱列表
COMPRESS 導入到一個區(qū) (Y) RECORDLENGTH IO 記錄的長度
GRANTS 導出權限 (Y) INCTYPE 增量導出類型
INDEXES 導出索引 (Y) RECORD 跟蹤增量導出 (Y)
DIRECT 直接路徑 (N) TRIGGERS 導出觸發(fā)器 (Y)
LOG 屏幕輸出的日志文件 STATISTICS 分析對象 (ESTIMATE)
ROWS 導出數(shù)據(jù)行 (Y) PARFILE 參數(shù)文件名稱
CONSISTENT 交叉表一致性 CONSTRAINTS 導出約束條件 (Y)
FEEDBACK 每 x 行顯示運行進度 (0)
FILESIZE 每一個轉(zhuǎn)儲文件的最大大小
FLASHBACK_SCN 用于回調(diào)會話快照的 SCN
FLASHBACK_TIME 用來獲得最接近于指定時間的 SCN 的時間
QUERY 用來導出表的子集的選擇子句
RESUMABLE 遇到與空格有關的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢復語句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
TTS_FULL_CHECK 對 TTS 運行全然或部分相關性檢查
TABLESPACES 要導出的表空間列表
TRANSPORT_TABLESPACE 導出可傳輸?shù)谋砜臻g元數(shù)據(jù) (N)
TEMPLATE 調(diào)用 iAS 模式導出的模板名稱
三.使用演示樣例
3.1 數(shù)據(jù)導出:
1 將數(shù)據(jù)庫SampleDB全然導出,usernamesystem passwordmanager 導出到E:/SampleDB.dmp中
exp system/manager@TestDB file=E:/sampleDB.dmp full=y
2 將數(shù)據(jù)庫中system用戶與sys用戶的表導出
exp system/manager@TestDB file=E:/sampleDB.dmp owner=(system,sys)
3 將數(shù)據(jù)庫中的表 TableA,TableB 導出
exp system/manager@TestDB file=E:/sampleDB.dmp tables=(TableA,TableB)
4 將數(shù)據(jù)庫中的表tableA中的字段filed1 值為 "王五" 的數(shù)據(jù)導出
exp system/manager@TestDB file=E:/sampleDB.dmp tables=(tableA) query=' where filed1='王五'
假設想對dmp文件進行壓縮,能夠在上面命令后面 加上 compress=y 來實現(xiàn)。
3.2 數(shù)據(jù)的導入
1 將備份數(shù)據(jù)庫文件里的數(shù)據(jù)導入指定的數(shù)據(jù)庫SampleDB 中,假設 SampleDB 已存在該表,則不再導入;
imp system/manager@TEST file=E:/sampleDB.dmp full=y ignore=y
2 將d:/daochu.dmp中的表table1 導入
imp system/manager@TEST file=E:/sampleDB.dmp tables=(table1)
3. 導入一個完整數(shù)據(jù)庫
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. 將一個用戶所屬的數(shù)據(jù)導入還有一個用戶
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. 使用參數(shù)文件
imp system/manager parfile=bible_tables.par
bible_tables.par參數(shù)文件:
#Import the sample tables used for the Oracle8i Database Administrator's
Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import
參數(shù)文件演示樣例見附錄
9. 增量導入
imp system./manager inctype= RECTORE FULL=Y FILE=A
不少情況下要先將表徹底刪除,然后導入。
四.參數(shù)說明
4.1、8i EXP經(jīng)常使用選項
1、FULL,這個用于導出整個數(shù)據(jù)庫,在ROWS=N一起使用時,能夠?qū)С稣麄€數(shù)據(jù)庫的結構。比如:
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2、BUFFER和FEEDBACK,在導出比較多的數(shù)據(jù)時,我會考慮設置這兩個參數(shù)。比如:
exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
3、FILL和LOG,這兩個參數(shù)分別指定備份的DMP名稱和LOG名稱,包含文件名稱和文件夾,樣例見上面。
須要說明的是,EXP能夠直接備份到磁帶中,即使用FILE=/dev/rmt0(磁帶設備名),可是一般我們都不這么做,原因有二:一、這樣做的速度會慢非常多,二、如今一般都是使用磁帶庫的,不建議直接對磁帶進行操作。至于沒有使用磁帶庫的朋友能夠考慮和UNIX的TAR結合使用。
假設你真想使用EXP直接到磁帶,你能夠參考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文檔號:30428.1),該文中有詳解。
4、COMPRESS參數(shù)將在導出的同一時候合并碎塊,盡量把數(shù)據(jù)壓縮到initial的EXTENT里,默認是N,一般建議使用。DIRECT參數(shù)將告訴EXP直接讀取數(shù)據(jù),而不像傳統(tǒng)的EXP那樣,使用SELECT來讀取表中的數(shù)據(jù),這樣就降低了SQL語句處理過程。一般也建議使用。只是有些情況下DIRECT參數(shù)是無法使用的。
5、怎樣使用SYSDBA運行EXP/IMP?
這是一個非?,F(xiàn)實的問題,有時候我們須要使用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參數(shù)后面跟的是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'"""
4.2、8i IMP經(jīng)常使用選項
1、FROMUSER和TOUSER,使用它們實現(xiàn)將數(shù)據(jù)從一個SCHEMA中導入到另外一個SCHEMA中。
2、IGNORE、GRANTS和INDEXES,當中IGNORE參數(shù)將忽略表的存在,繼續(xù)導入,這個對于須要調(diào)整表的存儲參數(shù)時非常實用,我們能夠先依據(jù)實際情況用合理的存儲參數(shù)建好表,然后直接導入數(shù)據(jù)。而GRANTS和INDEXES則表示是否導入授權和索引,假設想使用新的存儲參數(shù)重建索引,或者為了加快到入速度,我們能夠考慮將INDEXES設為N,而GRANTS一般都是Y。
另外一個EXP/IMP都有的參數(shù)是PARFILE,它是用來定義EXP/IMP的參數(shù)文件,也就是說,上面的參數(shù)都能夠?qū)懺谝粋€參數(shù)文件里,但我們一般非常少使用。
4.4、Oracle9i EXP功能描寫敘述
Oracle9i EXP在原有的基礎上新增了部分新的參數(shù),按功能主要分為以下幾個部分:
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 - 設置表空間導出模式。個人認為對于一般用戶而言,這個才是新增參數(shù)中最實用的一個,能夠讓用戶在原來的FULL、OWNER、TABLES的基礎上多了一種選擇,使得EXP更加靈活。
五、不同版本號的EXP/IMP問題?
一般來說,從低版本號導入到高版本號問題不大,麻煩的是將高版本號的數(shù)據(jù)導入到低版本號中,在Oracle9i之前,不同版本號Oracle之間的EXP/IMP能夠通過以下的方法來解決:
1、在高版本號數(shù)據(jù)庫上執(zhí)行底版本號的catexp.sql;
2、使用低版本號的EXP來導出高版本號的數(shù)據(jù);
3、使用低版本號的IMP將數(shù)據(jù)庫導入究竟版本號數(shù)據(jù)庫中;
4、在高版本號數(shù)據(jù)庫上又一次執(zhí)行高版本號的catexp.sql腳本。
但在9i中,上面的方法并不能解決這個問題。假設直接使用底版本號EXP/IMP會出現(xiàn)例如以下錯誤:
EXP-00008: ORACLE error %lu encountered
ORA-00904: invalid column name
這已經(jīng)是一個發(fā)布的BUG,須要等到Oracle10.0才干解決,BUG號為2261,你能夠到METALINK上去查看有關此BUG的具體信息。
BUG歸BUG,我們的工作還是要做,在沒有Oracle的支持之前,我們就自己解決。在Oracle9i中執(zhí)行以下的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參數(shù)不能用外,其他區(qū)別不大。針對沒有QUERY的情況,我們能夠先在數(shù)據(jù)庫中使用查詢條件建立暫時中間表,然后使用EXP導出這個中間表就可以。至于Oracle7由于眼下使用的人較少,gototop不打算在此做詳解了,假設讀者朋友有需求,你能夠參考Metalink文檔:“Overview of Export and Import in Oracle7”(文檔號:61949.1)。關于EXP/IMP的具體參數(shù)信息你能夠通過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過程建索引的話不建議同一時候執(zhí)行5個以上的IMP,假設你想加高速度,能夠在IMP的時候不建索引,這樣僅僅要內(nèi)存同意,能夠多跑幾個,然后是SQL腳本創(chuàng)建須要的索引。
注意:
操作者要有足夠的權限,權限不夠它會提示。
數(shù)據(jù)庫能否夠連上, 能夠用tnsping TestDB 來獲得數(shù)據(jù)庫 TestDB 能否連上。
附錄一:
給用戶添加導入數(shù)據(jù)權限的操作
第一, 啟動sql*puls
第二,以system/manager登陸
第三,create user username IDENTIFIED BY password (假設已經(jīng)創(chuàng)建過用戶,這步能夠省略)
第四,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字
第五, 執(zhí)行-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 內(nèi)容例如以下:
FROMUSER=TGPMS
TOUSER=TGPMS2 (注:把表的擁有者由FROMUSER改為TOUSER,F(xiàn)ROMUSER和TOUSER的用戶能夠不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623.dmp
log==/backup/import_20030623.log
詳例
遷移用戶,但無需遷移數(shù)據(jù),且源庫,目標庫語言環(huán)境都為AMERICAN_AMERICA.AL32UTF8,可如下操作:
導出:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
exp user/pwd file=export.dmp log=export.log buffer=10000000 grants=n rows=n statistics=none compress=n
導入:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
imp user/pwd fromuser=user1 touser=user2 rows=n statistics=none file=export.dmp log=export.log
這幾天做開發(fā)庫schema備份,出現(xiàn)些問題,記錄一下.
一,exp時,os語言環(huán)境和數(shù)據(jù)庫不同時會自動發(fā)生轉(zhuǎn)換.
如果操作系統(tǒng)的字符集小于數(shù)據(jù)庫字符集,就可能出現(xiàn)亂碼現(xiàn)象.imp時,同理,也是有可能出現(xiàn)亂碼的.如果源庫和目標庫字符集是
相同的話,防止exp,imp過程出現(xiàn)字符轉(zhuǎn)換,我們可以在exp,imp動作前,手動設置語音環(huán)境和數(shù)據(jù)庫語言環(huán)境一樣.如數(shù)據(jù)庫語言環(huán)境
為AMERICAN_AMERICA.AL32UTF8,os是windows,使用命令set NLS_LANG=AMERICAN_AMERICA.AL32UTF8;os是linux or unix,使用命令
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8.
二,在遷移schema時,即使不遷移數(shù)據(jù),也易發(fā)生ORA-1659錯誤.
在上述錯誤發(fā)生后,select view,發(fā)現(xiàn)表的大小和源庫表大小是一樣的.而實際,我們只是遷移表結構,并沒有遷移數(shù)據(jù)(rows=n).
查詢表發(fā)現(xiàn)也是沒有遷移數(shù)據(jù)的,但它的存儲空間和源表是一樣的.也就是說它遷移了存儲空間.分析發(fā)現(xiàn),是由于exp時,沒有設置參
數(shù)compress=n所致,由于此參數(shù)默認值為y,那么它會在exp時,將源表所有數(shù)據(jù)壓縮到一個extent,也就是initial extent,而imp時,會
預分配initial extent大小的.因此此種情況下,極易發(fā)生ORA-1659錯誤.
注:另在作有數(shù)據(jù)導出時,如果表大小較大的話,使用此參數(shù)的默認值也極易發(fā)生ORA-1659錯誤.因為假設你的源表大小為100m,在
imp時,需分配initial extent大小為100m,如果此時,用戶所在表空間沒有連續(xù)100m空間,那么就會報此錯誤了.
三,如果導出統(tǒng)計信息,在只導出部分數(shù)據(jù),或不導出數(shù)據(jù)時,導出統(tǒng)計信息會報錯.另如果未導出統(tǒng)計信息,但導入時,需導入統(tǒng)計信息
,那此時,導入后,統(tǒng)計信息會被鎖住,而無法更新統(tǒng)計信息.
此時,我們可使用包dbms_stats.unlock_schema_stats來解鎖.最好的辦法是,在exp,imp時,加入?yún)?shù)statistics=none,不exp,imp
統(tǒng)計信息,在導入完成后,在重新收集統(tǒng)計信息.
四,在使用ftp跨系統(tǒng)cp dmp文件時,一定要注意使用bin模式,來防止imp時,不能open文件,而導入失敗.
五,在作imp數(shù)據(jù)操作時,特別是imp大表時,為了防止發(fā)生ORA-1555錯誤,應設置參數(shù)commit=y,buffer=10000000(根據(jù)實際情況設置),此時,當buffer空間滿時,會自動提交.默認是imp一個表提交一次.
常見問題及解決方法
數(shù)據(jù)庫對象已經(jīng)存在
一般情況, 導入數(shù)據(jù)前應該徹底刪除目標數(shù)據(jù)下的表, 序列, 函數(shù)/過程,觸發(fā)器等;數(shù)據(jù)庫對象已經(jīng)存在, 按缺省的imp參數(shù), 則會導入失敗。如果用了參數(shù)ignore=y, 會把exp文件內(nèi)的數(shù)據(jù)內(nèi)容導入,如果表有唯一關鍵字的約束條件, 不合條件將不被導入如果表沒有唯一關鍵字的約束條件, 將引起記錄重復
字符集轉(zhuǎn)換
數(shù)據(jù)庫對象有主外鍵約束
不符合主外鍵約束時, 數(shù)據(jù)會導入失敗,
解決辦法:
1、先導入主表, 再導入依存表
2、disable目標導入對象的主外鍵約束, 導入數(shù)據(jù)后, 再enable它們
導入大表時存儲分配失敗
默認的EXP時, compress = Y, 也就是把所有的數(shù)據(jù)壓縮在一個數(shù)據(jù)塊上。導入時, 如果不存在連續(xù)一個大數(shù)據(jù)塊, 則會導入失敗. 導出80M以上的大表時, 記得compress= N, 則不會引起這種錯誤.
imp和exp使用的字符集不同
如果字符集不同, 導入會失敗, 可以改變unix環(huán)境變量或者NT注冊表里NLS_LANG相關信息。導入完成后再改回來.
如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答??! 點擊進入論壇