数据库导出All about Oracle IMP/EXP
之前一直在查找數據庫導出之類的問題,今天正好有機會和大家分享一下.
????導入/導出是ORACLE幸存的最陳舊的兩個命令行工具,其實我從來不認為Exp/Imp是一種好的備份方法,確正的說法是Exp/Imp只能是一個好的儲轉工具,特別是在小型據數庫的儲轉,表空間的移遷,表的取抽,測檢邏輯和物理沖突等中有不小的勞功。當然,我們也可以把它作為小型據數庫的物理備份后的一個邏輯幫助備份,也是不錯的提議。對于越來越大的據數庫,特別是TB級據數庫和越來越多據數倉庫的現出,EXP/IMP越來越力不能及了,這個時候,據數庫的備份都轉向了RMAN和第三方工具。面上說明一下EXP/IMP的應用。
如何使exp的幫助以不同的字符集示顯:set nls_lang=simplified chinese_china.zhs16gbk,通過設置環境變量,可以讓exp的幫助以中文示顯,如果set nls_lang=American_america.字符集,那么幫助就是英文的了
?程序代碼
EXP的全部參數(括號中為參數的默認值):
USERID ? ? ? 戶用名/令口 ? ? 如: USERID=duanl/duanl ? ? ?
FULL ? ? ? ? 導出個整據數庫 (N)
BUFFER ? ? ? 據數緩沖區的小大 ? ? ? ??
OWNER ? ? ? ?全部者戶用名表列,你希望導出哪個戶用的對象,就用owner=username
FILE ? ? ? ? 出輸件文 (EXPDAT.DMP) ? ?
TABLES ? ? ? 表名表列 ,指定導出的table名稱,如:TABLES=table1,table2
COMPRESS ? ? 導入一個extent (Y) ??
RECORDLENGTH IO 記載的長度
GRANTS ? ? ? 導出限權 (Y) ? ? ? ? ? ?
INCTYPE ? ? ?增量導出類型
INDEXES ? ? ?導出索引 (Y) ? ? ? ? ??
RECORD ? ? ? 跟蹤增量導出 (Y)
ROWS ? ? ? ? 導出據數行 (Y) ? ? ? ?
PARFILE ? ? ?參數件文名,如果你exp的參數很多,可以存成參數件文.
CONSTRAINTS ?導出約束 (Y) ? ?
CONSISTENT ? 交叉表致一性
LOG ? ? ? ? ?屏幕出輸的日記件文 ? ?
STATISTICS ? 析分對象 (ESTIMATE)
DIRECT ? ? ? 直接路徑 (N) ? ? ? ? ? ? ?
TRIGGERS ? ? 導出觸發器 (Y)
FEEDBACK ? ? 示顯每 x 行 (0) 的進度
FILESIZE ? ? 各儲轉件文的最大尺寸
QUERY ? ? ? ?選定導出表子集的子句
列下關鍵字僅于用可傳輸的表空間
TRANSPORT_TABLESPACE 導出可傳輸的表空間元據數 (N)
TABLESPACES 將傳輸的表空間表列
?程序代碼
IMP的全部參數(括號中為參數的默認值):
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)
ANALYZE ?行執儲轉件文中的 ANALYZE 語句 (Y)
FEEDBACK 示顯每 x 行 (0) 的進度
TOID_NOVALIDATE ?跳過指定類型 id 的校驗
FILESIZE 各儲轉件文的最大尺寸
RECALCULATE_STATISTICS 新重盤算統計值 (N)
列下關鍵字僅于用可傳輸的表空間
TRANSPORT_TABLESPACE 導入可傳輸的表空間元據數 (N)
TABLESPACES 將要傳輸到據數庫的表空間
DATAFILES 將要傳輸到據數庫的據數件文
TTS_OWNERS 具有可傳輸表空間中集據數的戶用
關于增量參數的說明:exp/imp的增量并非真正意義上的增量,所以最好不要應用。
?
應用方法:
Exp parameter_name=value or Exp parameter_name=(value1,value2……)
只要入輸參數help=y以可就看到全部幫助.
EXP用常選項
1. FULL,這個于用導出個整據數庫,在ROWS=N起一應用時,可以導出個整據數庫的結構。例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2. OWNER和TABLE,這兩個選項于用定義EXP的對象。OWNER定義導出指定戶用的對象;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,在導出比較多的據數時,我會斟酌設置這兩個參數。例如:
exp userid=test/test file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
4 .FILE和LOG,這兩個參數別分指定備份的DMP名稱和LOG名稱,括包件文名和目錄,例子見面上。
????5. COMPRESS,是不是壓縮導出據數的內容。用來制控導出對象的storage語句如何發生。默認值為Y,應用默認值,對象的存儲語句的init extent于等前當導出對象的extent的總和。推薦應用COMPRESS=N。(causes Export to flag table data for consolidation into one initial extent upon Import,The Export utility, not the Import utility, generates the data definitions, including the storage parameter definitions.?)
????6. FILESIZE該選項在8i中可用。如果導出的dmp件文過大時,最好應用FILESIZE參數,制限件文小大不要超越2G。如:
exp userid=duanl/duanl file=f1,f2,f3,f4,f5 filesize=2G owner=scott
這樣將建創f1.dmp, f2.dmp等一系列件文,個每小大都為2G,如果導出的總量小于10G
????EXP不必建創f5.bmp.
????7. CONSISTENT,If you use CONSISTENT=n, each table is usually exported in a single transaction. However, if a table contains nested tables, the outer table and each inner table are exported as separate transactions. If a table is partitioned, each partition is exported as a separate transaction.
每日一道理有一首詩最為動人,那就是青春;有一段人生最美麗,那就是青春;有一道風景最為亮麗,那就是青春。青春,不要說已疲憊,也許你的幻想曾被現實無情毀滅,也許你的追求毫無結果,但你應該相信,沒有寒風的洗禮,哪來萬紫千紅的春天,沒有心的耕耘,哪有累累碩果?
????
IMP用常選項
1、FROMUSER和TOUSER,應用它們實現將據數從一個SCHEMA中導入到另外一個SCHEMA中。例如:設假我們做exp時導出的為test的對象,當初我們想把對象導入戶用:
imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1
2、IGNORE、GRANTS和INDEXES,其中IGNORE參數將疏忽表的存在,繼承導入,這個對于要需調整表的存儲參數時很有效,我們可以先根據實際情況用理合的存儲參數建好表,然后直接導入據數。而GRANTS和INDEXES則示表是不是導入授權和索引,如果想應用新的存儲參數重建索引,或者為了加快到入速度,我們可以斟酌將INDEXES設為N,而GRANTS一般都是Y。例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N
表空間傳輸
? ? 表空間傳輸是8i新加增的一種倏地在據數庫間動移據數的一種法辦,是把一個據數庫上的式格據數件文附加到另外一個據數庫中,而不是把據數導出成Dmp件文,這在有些時候是非常管用的,因為傳輸表空間動移據數就象制復件文一樣快。
關于傳輸表空間有一些則規,即:
·源據數庫和目標據數庫必須運行在雷同的硬件平臺上。
·源據數庫與目標據數庫必須應用雷同的字符集。
·源據數庫與目標據數庫必定要有雷同小大的據數塊
·目標據數庫不能有與移遷表空間同名的表空間
·SYS的對象不能移遷
·必須傳輸自括包的對象集
·有一些對象,如物化圖視,基于函數的索引等不能被傳輸
可以用以下的方法來測檢一個表空間或一套表空間是不是合符傳輸準標:
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果沒有行擇選,示表該表空間只括包表據數,并且是自括包的。對于有些非自括包的表空間,如據數表空間和索引表空間,可以起一傳輸。
以下為要簡應用驟步,如果想參考細詳應用方法,也可以參考ORACLE聯機幫助。
1.設置表空間為只讀(假設表空間名字為APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
2.出發EXP命令
SQL>host exp userid=”””sys/password as sysdba”””?
transport_tablespace=y tablespace=(app_data, app_index)
以上要需注意的是
·為了在SQL中行執EXP,USERID必須用三個引號,在UNIX中也必須注意防止“/”的應用
·在816和后以,必須應用sysdba才能作操
·這個命令在SQL中必須放置在一行(這里是因為示顯問題放在了兩行)
3.拷貝據數件文到另一個所在,即目標據數庫
? 可是以cp(unix)或copy(windows)或通過ftp傳輸件文(必定要在bin方法)
4.把地本的表空間設置為寫讀
5.在目標據數庫附加該據數件文
imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y “datafile=(c:\temp\app_data,c:\temp\app_index)”
6.設置目標據數庫表空間為寫讀
alter tablespace app_data read write;
alter tablespace app_index read write;
化優EXP/IMP的方法:
? ? 當要需exp/imp的據數量比較大時,這個進程要需的間時是比較長的,我們可以用一些方法來化優exp/imp的作操。
exp:應用直接路徑 direct=y
oracle會避開sql語句處置擎引,直接從據數庫件文中讀取據數,然后寫入導出件文.
可以在導出日記中觀察到: exp-00067: table xxx will be exported in conventional path
? ? 如果沒有應用直接路徑,必須保障buffer參數的值足夠大.
? ? 有一些參數于direct=y不兼容,沒法用直接路徑導出可動移的tablespace,或者用query參數導出據數庫子集.
? ? 當導入導出的據數庫運行在不同的os下時,必須保障recordlength參數的值致一.
imp:通過以下幾個徑途化優
1.防止盤磁排序
將sort_area_size設置為一個較大的值,比如100M
2.防止日記換切等待
加增重做日記組的數量,增大日記件文小大.
3.化優日記緩沖區
比如將log_buffer容量擴展10倍(最大不要超越5M)
4.應用陣列入插與提交
commit = y
注意:陣列方法不能處置括包LOB和LONG類型的表,對于這樣的table,如果應用commit = y,每入插一行,就會行執一次提交.
5.應用NOLOGGING方法減小重做日記小大
在導入時指定參數indexes=n,只導入據數而疏忽index,在導完據數后在通過腳本建創index,指定 NOLOGGING選項
導出/導入與字符集
? ? 停止據數的導入導出時,我們要注意關于字符集的問題。在EXP/IMP進程當中我們要需注意四個字符集的參數:導出端的客戶端字符集,導出端據數庫字符集,導入端的客戶端字符集,導入端據數庫字符集。
我們首先要需查看這四個字符集參數。
查看據數庫的字符集的信息:
SQL> select * from nls_database_parameters;
PARAMETER ? ? ? ? ? ? ? ? ? ? ?VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE ? ? ? ? ? ? ? ? ? AMERICAN
NLS_TERRITORY ? ? ? ? ? ? ? ? ? AMERICA
NLS_CURRENCY ? ? ? ? ? ? ? ? ? $
NLS_ISO_CURRENCY ? ? ? ? ? ? ? AMERICA
NLS_NUMERIC_CHARACTERS ? ? ? ? .,
NLS_CHARACTERSET ? ? ? ? ? ? ? ZHS16GBK
NLS_CALENDAR ? ? ? ? ? ? ? ? ? GREGORIAN
NLS_DATE_FORMAT ? ? ? ? ? ? ? ?DD-MON-RR
NLS_DATE_LANGUAGE ? ? ? ? ? ? ?AMERICAN
NLS_SORT ? ? ? ? ? ? ? ? ? ? ? ? BINARY
NLS_TIME_FORMAT ? ? ? ? ? ? ? ?HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT ? ? ? ? ? DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT ? ? ? ? ? ? HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT ? ? ? ?DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY ? ? ? ? ? ? ?$
NLS_COMP ? ? ? ? ? ? ? ? ? ? ? BINARY
NLS_NCHAR_CHARACTERSET ? ? ? ? ZHS16GBK
NLS_RDBMS_VERSION ? ? ? ? ? ? ?8.1.7.4.1
NLS_CHARACTERSET:ZHS16GBK是前當據數庫的字符集。
我們再來查看客戶端的字符集信息:
客戶端字符集的參數NLS_LANG=_< territory >.
language:指定oracle息消應用的言語,日期中日和月的示顯。
Territory:指定幣貨和數字的式格,地域和盤算期星及日期的習氣。
Characterset:制控客戶端應用程序應用的字符集。常通設置或于等客戶端的代碼頁?;蛘邔τ趗nicode應用設為UTF8。
在windows中,詢查和改修NLS_LANG可在注冊表中停止:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\
xx指存在多個Oracle_HOME時的系統編號。
在unix中:
$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK
改修可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8
常通在導出時最好把客戶端字符集設置得和據數庫端雷同。當停止據數導入時,主要有以下兩種情況:
(1) ? ?源據數庫和目標據數庫有具雷同的字符集設置。
這時,只要設置導出和導入端的客戶端NLS_LANG于等據數庫字符集可即。
(2) ? ?源據數庫和目標據數庫字符集不同。
? ? 先將導出端客戶端的NLS_LANG設置成和導出端的據數庫字符集致一,導出據數,然后將導入端客戶端的NLS_LANG設置成和導出端致一,導入據數,這樣轉換只發生在據數庫端,而且只發生一次。
? ? 這類情況下,只有當導入端據數庫字符集為導出端據數庫字符集的嚴厲超集時,據數才能完整導勝利,否則,可能會有據數不致一或碼亂現出。
不同本版的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號為2261722,你可以到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;?
/?
可以跨本版的應用EXP/IMP,但必須確正地應用EXP和IMP的本版:?
1、總是應用IMP的本版匹配據數庫的本版,如:要導入到817中,應用817的IMP工具。
2、總是應用EXP的本版匹配兩個據數庫中最低的本版,如:從9201往817中導入,則應用817本版的EXP工具。
文章結束給大家分享下程序員的一些笑話語錄: 問:你覺得讓你女朋友(或者任何一個女的)從你和李彥宏之間選一個,你覺得她會選誰?
答:因為李艷紅這種敗類,所以我沒女友!
轉載于:https://www.cnblogs.com/jiangu66/archive/2013/04/28/3049866.html
總結
以上是生活随笔為你收集整理的数据库导出All about Oracle IMP/EXP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像对象paip.Image对象出现“对
- 下一篇: 一周小记(五)