[轉(zhuǎn)]ORACLE EXP/IMP的使用詳解
Oracle數(shù)據(jù)庫使用IMP/EXP工具進(jìn)行數(shù)據(jù)導(dǎo)入與導(dǎo)出介紹:
1.使用命令行:
數(shù)據(jù)導(dǎo)出:
1.將數(shù)據(jù)庫TEST完全導(dǎo)出,用戶名system密碼manager導(dǎo)出到D:\Test_bak.dmp中
exp system/manager@ora10 file=d:\Test_bak.dmp full=y
ora10表示數(shù)據(jù)庫名
2.將數(shù)據(jù)庫中system用戶與sys用戶的表導(dǎo)出
exp system/manager@TEST file=d:\Test_bak.dmp owner=(system,sys)
3.將數(shù)據(jù)庫中的表inner_notify、notify_staff_relat導(dǎo)出
exp aichannel/aichannel@TESTDB2 file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat)
4.將數(shù)據(jù)庫中的表table1中的字段filed1以"00"打頭的數(shù)據(jù)導(dǎo)出
exp system/manager@TEST file=d:\Test_bak.dmp tables=(table1) query=\" where filed1 like '00%'\"
上面是常用的導(dǎo)出,對于壓縮,既用winzip把dmp文件可以很好的壓縮。
也可以在上面命令后面加上compress=y來實(shí)現(xiàn)。
數(shù)據(jù)的導(dǎo)入:
1.將D:\daochu.dmp 中的數(shù)據(jù)導(dǎo)入 TEST數(shù)據(jù)庫中。
imp system/manager@TEST file=d:\Test_bak.dmp
imp aichannel/aichannel@HUST full=y file=file= d:\data\newsmgnt.dmp ignore=y
上面可能有點(diǎn)問題,因?yàn)橛械谋硪呀?jīng)存在,然后它就報(bào)錯(cuò),對該表就不進(jìn)行導(dǎo)入。
在后面加上 ignore=y 就可以了。
2.將d:\daochu.dmp中的表table1導(dǎo)入
imp system/manager@TEST file=d:\Test_bak.dmp tables=(table1)
注意:
1、在進(jìn)行導(dǎo)入恢復(fù)時(shí),如果是全部導(dǎo)入的話,就需要將原有的用戶刪除,這樣此用戶所擁有的數(shù)據(jù)就可以直接被刪除了,否則在進(jìn)導(dǎo)入時(shí)會下面的錯(cuò)誤提示( ORACLE error 2291 encountered )那是因?yàn)榕c原有一些表,或主鍵出現(xiàn)沖突所致,所以再重新建立此用戶,再導(dǎo)入數(shù)據(jù)就可以了。
注意:
操作者要有足夠的權(quán)限,權(quán)限不夠它會提示。
數(shù)據(jù)庫時(shí)可以連上的。可以用tnsping TEST 來獲得數(shù)據(jù)庫TEST能否連上。
附錄一:
給用戶增加導(dǎo)入數(shù)據(jù)權(quán)限的操作
第一,啟動sql*puls
第二,以system/manager登陸
第三,create user 用戶名 IDENTIFIED BY 密碼(如果已經(jīng)創(chuàng)建過用戶,這步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
第五, 運(yùn)行-cmd-進(jìn)入dmp文件所在的目錄,
執(zhí)行示例:
F:\Work\Oracle_Data\backup>imp userid=test/test full=y file=inner_notify.dmp
屏幕顯示
Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.
連接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
經(jīng)由常規(guī)路徑導(dǎo)出由EXPORT:V08.01.07創(chuàng)建的文件
已經(jīng)完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導(dǎo)入
導(dǎo)出服務(wù)器使用UTF8 NCHAR 字符集 (可能的ncharset轉(zhuǎn)換)
. 正在將AICHANNEL的對象導(dǎo)入到 AICHANNEL
. . 正在導(dǎo)入表
準(zhǔn)備啟用約束條件...
成功終止導(dǎo)入,但出現(xiàn)警告。
附錄二:
Oracle 不允許直接改變表的擁有者, 利用Export/Import可以達(dá)到這一目的.
先建立import9.par,
然后,使用時(shí)命令如下:imp parfile=/filepath/import9.par
例 import9.par 內(nèi)容如下:
導(dǎo)入/導(dǎo)出是ORACLE幸存的最古老的兩個(gè)命令行工具,其實(shí)我從來不認(rèn)為Exp/Imp是一種好的備份方式,正確的說法是Exp/Imp只能是一個(gè)好的轉(zhuǎn)儲工具,特別是在小型數(shù)據(jù)庫的轉(zhuǎn)儲,表空間的遷移,表的抽取,檢測邏輯和物理沖突等中有不小的功勞。當(dāng)然,我們也可以把它作為小型數(shù)據(jù)庫的物理備份后的一個(gè)邏輯輔助備份,也是不錯(cuò)的建議。對于越來越大的數(shù)據(jù)庫,特別是TB級數(shù)據(jù)庫和越來越多數(shù)據(jù)倉庫的出現(xiàn),EXP/IMP越來越力不從心了,這個(gè)時(shí)候,數(shù)據(jù)庫的備份都轉(zhuǎn)向了RMAN和第三方工具。下面說明一下EXP/IMP的使用。
如何使exp的幫助以不同的字符集顯示:set nls_lang=simplified chinese_china.zhs16gbk,通過設(shè)置環(huán)境變量,可以讓exp的幫助以中文顯示,如果set nls_lang=American_america.字符集,那么幫助就是英文的了
EXP的所有參數(shù)(括號中為參數(shù)的默認(rèn)值):
USERID
FULL
BUFFER
OWNER
FILE
TABLES
COMPRESS
RECORDLENGTH
GRANTS
INCTYPE
INDEXES
RECORD
ROWS
PARFILE
CONSTRAINTS
CONSISTENT
LOG
STATISTICS
DIRECT
TRIGGERS
FEEDBACK
FILESIZE
QUERY
下列關(guān)鍵字僅用于可傳輸?shù)谋砜臻g
TRANSPORT_TABLESPACE 導(dǎo)出可傳輸?shù)谋砜臻g元數(shù)據(jù) (N)
TABLESPACES 將傳輸?shù)谋砜臻g列表
程序代碼
IMP的所有參數(shù)(括號中為參數(shù)的默認(rèn)值):
USERID
FULL
BUFFER
FROMUSER
FILE
TOUSER
SHOW
TABLES
IGNORE
RECORDLENGTH
GRANTS
INCTYPE
INDEXES 導(dǎo)入索引 (Y)
COMMIT
ROWS
PARFILE
LOG
CONSTRAINTS
DESTROY
INDEXFILE 將表/索引信息寫入指定的文件
SKIP_UNUSABLE_INDEXES
ANALYZE
FEEDBACK 顯示每 x 行 (0) 的進(jìn)度
TOID_NOVALIDATE
FILESIZE 各轉(zhuǎn)儲文件的最大尺寸
RECALCULATE_STATISTICS 重新計(jì)算統(tǒng)計(jì)值 (N)
下列關(guān)鍵字僅用于可傳輸?shù)谋砜臻g
TRANSPORT_TABLESPACE 導(dǎo)入可傳輸?shù)谋砜臻g元數(shù)據(jù) (N)
TABLESPACES 將要傳輸?shù)綌?shù)據(jù)庫的表空間
DATAFILES 將要傳輸?shù)綌?shù)據(jù)庫的數(shù)據(jù)文件
TTS_OWNERS 擁有可傳輸表空間集中數(shù)據(jù)的用戶
關(guān)于增量參數(shù)的說明:exp/imp的增量并不是真正意義上的增量,所以最好不要使用。
使用方法:
Exp parameter_name=value or Exp parameter_name=(value1,value2……)
只要輸入?yún)?shù)help=y就可以看到所有幫助.
EXP常用選項(xiàng)
1.FULL,這個(gè)用于導(dǎo)出整個(gè)數(shù)據(jù)庫,在ROWS=N一起使用時(shí),可以導(dǎo)出整個(gè)數(shù)據(jù)庫的結(jié)構(gòu)。例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2. OWNER和TABLE,這兩個(gè)選項(xiàng)用于定義EXP的對象。OWNER定義導(dǎo)出指定用戶的對象;TABLE指定EXP的table名稱,例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log owner=duanl
exp userid=test/test file=./db_str.dmp log=./db_str.log table=nc_data,fi_arap
3.BUFFER和FEEDBACK,在導(dǎo)出比較多的數(shù)據(jù)時(shí),我會考慮設(shè)置這兩個(gè)參數(shù)。例如:
exp userid=test/test file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
4.FILE和LOG,這兩個(gè)參數(shù)分別指定備份的DMP名稱和LOG名稱,包括文件名和目錄,例子見上面。
5.COMPRESS參數(shù)不壓縮導(dǎo)出數(shù)據(jù)的內(nèi)容。用來控制導(dǎo)出對象的storage語句如何產(chǎn)生。默認(rèn)值為Y,使用默認(rèn)值,對象的存儲語句的init extent等于當(dāng)前導(dǎo)出對象的extent的總和。推薦使用COMPRESS=N。
6. FILESIZE該選項(xiàng)在8i中可用。如果導(dǎo)出的dmp文件過大時(shí),最好使用FILESIZE參數(shù),限制文件大小不要超過2G。如:
exp userid=duanl/duanl file=f1,f2,f3,f4,f5 filesize=2G owner=scott
這樣將創(chuàng)建f1.dmp, f2.dmp等一系列文件,每個(gè)大小都為2G,如果導(dǎo)出的總量小于10G
EXP不必創(chuàng)建f5.bmp.
IMP常用選項(xiàng)
1、FROMUSER和TOUSER,使用它們實(shí)現(xiàn)將數(shù)據(jù)從一個(gè)SCHEMA中導(dǎo)入到另外一個(gè)SCHEMA中。例如:假設(shè)我們做exp時(shí)導(dǎo)出的為test的對象,現(xiàn)在我們想把對象導(dǎo)入用戶:
imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1
2、IGNORE、GRANTS和INDEXES,其中IGNORE參數(shù)將忽略表的存在,繼續(xù)導(dǎo)入,這個(gè)對于需要調(diào)整表的存儲參數(shù)時(shí)很有用,我們可以先根據(jù)實(shí)際情況用合理的存儲參數(shù)建好表,然后直接導(dǎo)入數(shù)據(jù)。而GRANTS和INDEXES則表示是否導(dǎo)入授權(quán)和索引,如果想使用新的存儲參數(shù)重建索引,或者為了加快到入速度,我們可以考慮將INDEXES設(shè)為N,而GRANTS一般都是Y。例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N
表空間傳輸
關(guān)于傳輸表空間有一些規(guī)則,即:
·源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫必須運(yùn)行在相同的硬件平臺上。
·源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫必須使用相同的字符集。
·源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫一定要有相同大小的數(shù)據(jù)塊
·目標(biāo)數(shù)據(jù)庫不能有與遷移表空間同名的表空間
·SYS的對象不能遷移
·必須傳輸自包含的對象集
·有一些對象,如物化視圖,基于函數(shù)的索引等不能被傳輸
可以用以下的方法來檢測一個(gè)表空間或一套表空間是否符合傳輸標(biāo)準(zhǔn):
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果沒有行選擇,表示該表空間只包含表數(shù)據(jù),并且是自包含的。對于有些非自包含的表空間,如數(shù)據(jù)表空間和索引表空間,可以一起傳輸。
以下為簡要使用步驟,如果想?yún)⒖荚敿?xì)使用方法,也可以參考ORACLE聯(lián)機(jī)幫助。
1.設(shè)置表空間為只讀(假定表空間名字為APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
2.發(fā)出EXP命令
SQL>host exp userid=”””sys/password as sysdba”””
transport_tablespace=y tablespace=(app_data, app_index)
以上需要注意的是
·為了在SQL中執(zhí)行EXP,USERID必須用三個(gè)引號,在UNIX中也必須注意避免“/”的使用
·在816和以后,必須使用sysdba才能操作
·這個(gè)命令在SQL中必須放置在一行(這里是因?yàn)轱@示問題放在了兩行)
3.拷貝數(shù)據(jù)文件到另一個(gè)地點(diǎn),即目標(biāo)數(shù)據(jù)庫
4.把本地的表空間設(shè)置為讀寫
5.在目標(biāo)數(shù)據(jù)庫附加該數(shù)據(jù)文件
imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y “datafile=(c:\temp\app_data,c:\temp\app_index)”
6.設(shè)置目標(biāo)數(shù)據(jù)庫表空間為讀寫
alter tablespace app_data read write;
alter tablespace app_index read write;
優(yōu)化EXP/IMP的方法:
exp:使用直接路徑 direct=y
oracle會避開sql語句處理引擎,直接從數(shù)據(jù)庫文件中讀取數(shù)據(jù),然后寫入導(dǎo)出文件.
可以在導(dǎo)出日志中觀察到: exp-00067: table xxx will be exported in conventional path
imp:通過以下幾個(gè)途徑優(yōu)化
1.避免磁盤排序
將sort_area_size設(shè)置為一個(gè)較大的值,比如100M
2.避免日志切換等待
增加重做日志組的數(shù)量,增大日志文件大小.
3.優(yōu)化日志緩沖區(qū)
比如將log_buffer容量擴(kuò)大10倍(最大不要超過5M)
4.使用陣列插入與提交
commit = y
注意:陣列方式不能處理包含LOB和LONG類型的表,對于這樣的table,如果使用commit = y,每插入一行,就會執(zhí)行一次提交.
5.使用NOLOGGING方式減小重做日志大小
在導(dǎo)入時(shí)指定參數(shù)indexes=n,只導(dǎo)入數(shù)據(jù)而忽略index,在導(dǎo)完數(shù)據(jù)后在通過腳本創(chuàng)建index,指定 NOLOGGING選項(xiàng)
導(dǎo)出/導(dǎo)入與字符集
我們首先需要查看這四個(gè)字符集參數(shù)。
查看數(shù)據(jù)庫的字符集的信息:
SQL> select * from nls_database_parameters;
PARAMETER
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE
NLS_TERRITORY
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_CHARACTERSET
NLS_CALENDAR
NLS_DATE_FORMAT
NLS_DATE_LANGUAGE
NLS_SORT
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIME_TZ_FORMAT
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP
NLS_NCHAR_CHARACTERSET
NLS_RDBMS_VERSION
NLS_CHARACTERSET:ZHS16GBK是當(dāng)前數(shù)據(jù)庫的字符集。
我們再來查看客戶端的字符集信息:
客戶端字符集的參數(shù)NLS_LANG=_< territory >.
language:指定oracle消息使用的語言,日期中日和月的顯示。
Territory:指定貨幣和數(shù)字的格式,地區(qū)和計(jì)算星期及日期的習(xí)慣。
Characterset:控制客戶端應(yīng)用程序使用的字符集。通常設(shè)置或等于客戶端的代碼頁。或者對于unicode應(yīng)用設(shè)為UTF8。
在windows中,查詢和修改NLS_LANG可在注冊表中進(jìn)行:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\
xx指存在多個(gè)Oracle_HOME時(shí)的系統(tǒng)編號。
在unix中:
$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK
修改可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8
通常在導(dǎo)出時(shí)最好把客戶端字符集設(shè)置得和數(shù)據(jù)庫端相同。當(dāng)進(jìn)行數(shù)據(jù)導(dǎo)入時(shí),主要有以下兩種情況:
(1)
這時(shí),只需設(shè)置導(dǎo)出和導(dǎo)入端的客戶端NLS_LANG等于數(shù)據(jù)庫字符集即可。
(2)
不同版本的EXP/IMP問題
1、在高版本數(shù)據(jù)庫上運(yùn)行底版本的catexp.sql;
2、使用低版本的EXP來導(dǎo)出高版本的數(shù)據(jù);
3、使用低版本的IMP將數(shù)據(jù)庫導(dǎo)入到低版本數(shù)據(jù)庫中;
4、在高版本數(shù)據(jù)庫上重新運(yùn)行高版本的catexp.sql腳本。
但在9i中,上面的方法并不能解決問題。如果直接使用低版本EXP/IMP會出現(xiàn)如下錯(cuò)誤:
EXP-00008: orACLE error %lu encountered
orA-00904: invalid column name
這已經(jīng)是一個(gè)公布的BUG,需要等到Oracle10.0才能解決,BUG號為2261722,你可以到METALINK上去查看有關(guān)此BUG的詳細(xì)信息。
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;
/
可以跨版本的使用EXP/IMP,但必須正確地使用EXP和IMP的版本:
1、總是使用IMP的版本匹配數(shù)據(jù)庫的版本,如:要導(dǎo)入到817中,使用817的IMP工具。
2、總是使用EXP的版本匹配兩個(gè)數(shù)據(jù)庫中最低的版本,如:從9201往817中導(dǎo)入,則使用817版本的EXP工具。