熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle中邏輯導出Exp/導入Imp的詳細介紹以及參數介紹

2013-11-13 22:25:22  來源: Oracle 

  導入/導出是ORACLE幸存的最古老的兩個命令行工具其實我從來不認為Exp/Imp是一種好的備份方式正確的說法是Exp/Imp只能是一個好的轉儲工具特別是在小型數據庫的轉儲表空間的遷移表的抽取檢測邏輯和物理沖突等中有不小的功勞當然我們也可以把它作為小型數據庫的物理備份後的一個邏輯輔助備份也是不錯的建議對於越來越大的數據庫特別是TB級數據庫和越來越多數據倉庫的出現EXP/IMP越來越力不從心了這個時候數據庫的備份都轉向了RMAN和第三方工具下面說明一下EXP/IMP的使用

  如何使exp的幫助以不同的字符集顯示set nls_lang=simplified chinese_chinazhsgbk通過設置環境變量可以讓exp的幫助以中文顯示如果set nls_lang=American_america字符集那麼幫助就是英文的了

  EXP的所有參數(括號中為參數的默認值)

  USERID 用戶名/口令 如 USERID=duanl/duanl

  FULL 導出整個數據庫 (N)

  BUFFER 數據緩沖區的大小

  OWNER 所有者用戶名列表你希望導出哪個用戶的對象就用owner=username

  FILE 輸出文件 (EXPDATDMP)

  TABLES 表名列表 指定導出的table名稱TABLES=tabletable

  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 行 () 的進度

  FILESIZE 各轉儲文件的最大尺寸

  QUERY 選定導出表子集的子句

  下列關鍵字僅用於可傳輸的表空間

  TRANSPORT_TABLESPACE 導出可傳輸的表空間元數據 (N)

  TABLESPACES 將傳輸的表空間列表

  IMP的所有參數(括號中為參數的默認值)

  USERID 用戶名/口令

  FULL 導入整個文件 (N)

  BUFFER 數據緩沖區大小

  FROMUSER 所有人用戶名列表

  FILE 輸入文件 (EXPDATDMP)

  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 行 () 的進度

  TOID_NOVALIDATE 跳過指定類型 id 的校驗

  FILESIZE 各轉儲文件的最大尺寸

  RECALCULATE_STATISTICS 重新計算統計值 (N)

  下列關鍵字僅用於可傳輸的表空間

  TRANSPORT_TABLESPACE 導入可傳輸的表空間元數據 (N)

  TABLESPACES 將要傳輸到數據庫的表空間

  DATAFILES 將要傳輸到數據庫的數據文件

  TTS_OWNERS 擁有可傳輸表空間集中數據的用戶

  關於增量參數的說明exp/imp的增量並不是真正意義上的增量所以最好不要使用

  使用方法

  Exp parameter_name=value or Exp parameter_name=(valuevalue……)

  只要輸入參數help=y就可以看到所有幫助

  EXP常用選項

  FULL 這個用於導出整個數據庫在ROWS=N一起使用時可以導出整個數據庫的結構例如

  exp userid=test/test file=/db_strdmp log=/db_strlog full=y rows=n compress=y direct=y

  注在oracleg中userid這個是可以不用寫的直接寫 用戶名/密碼 就可以了像這樣

  exp test/test file=/db_strdmp log=/db_strlog full=y rows=n compress=y direct=y

   OWNER和TABLE 這兩個選項用於定義EXP的對象OWNER定義導出指定用戶的對象;TABLE指定EXP的table名稱例如

  exp userid=test/test file=/db_strdmp log=/db_strlog owner=duanl

  注:有的時候我們可能會遇到只導出單表的情況下面這種方法可以幫你解決問題

  exp userid=test/test file=/db_strdmp log=/db_strlog table=nc_datafi_arap

  BUFFER和FEEDBACK 在導出比較多的數據時我會考慮設置這兩個參數例如

  exp userid=test/test file=yw_dmp log=yw__log feedback= buffer= tables=WOOK_YT

  FILE和LOG 這兩個參數分別指定備份的DMP名稱和LOG名稱包括文件名和目錄例子見上面

  COMPRESS 參數不壓縮導出數據的內容用來控制導出對象的storage語句如何產生默認值為Y使用默認值對象的存儲語句的init extent等於當前導出對象的extent的總和推薦使用COMPRESS=N

   FILESIZE該選項在i中可用 如果導出的dmp文件過大時最好使用FILESIZE參數限制文件大小不要超過G

  exp userid=duanl/duanl file=fffff filesize=G owner=scott

  這樣將創建fdmp fdmp等一系列文件每個大小都為G如果導出的總量小於G

  EXP不必創建fbmp

  IMP常用選項

  FROMUSER和TOUSER 使用它們實現將數據從一個SCHEMA中導入到另外一個SCHEMA中例如假設我們做exp時導出的為test的對象現在我們想把對象導入用戶

  imp userid=test/test file=expdatdmp fromuser=test touser=test

  IGNOREGRANTS和INDEXES 其中IGNORE參數將忽略表的存在繼續導入這個對於需要調整表的存儲參數時很有用我們可以先根據實際情況用合理的存儲參數建好表然後直接導入數據而GRANTS和INDEXES則表示是否導入授權和索引如果想使用新的存儲參數重建索引或者為了加快到入速度我們可以考慮將INDEXES設為N而GRANTS一般都是Y例如imp userid=test/test file=expdatdmp fromuser=test touser=test indexes=N

  表空間傳輸

  表空間傳輸是i新增加的一種快速在數據庫間移動數據的一種辦法是把一個數據庫上的格式數據文件附加到另外一個數據庫中而不是把數據導出成Dmp文件這在有些時候是非常管用的因為傳輸表空間移動數據就象復制文件一樣快

  關於傳輸表空間有一些規則

  ·源數據庫和目標數據庫必須運行在相同的硬件平台上

  ·源數據庫與目標數據庫必須使用相同的字符集

  ·源數據庫與目標數據庫一定要有相同大小的數據塊

  ·目標數據庫不能有與遷移表空間同名的表空間

  ·SYS的對象不能遷移

  ·必須傳輸自包含的對象集

  ·有一些對象如物化視圖基於函數的索引等不能被傳輸

  可以用以下的方法來檢測一個表空間或一套表空間是否符合傳輸標准

  exec sysdbms_ttstransport_set_check(‘tablespace_name’true);

  select * from systransport_set_violation;

  如果沒有行選擇表示該表空間只包含表數據並且是自包含的對於有些非自包含的表空間如數據表空間和索引表空間可以一起傳輸

  以下為簡要使用步驟如果想參考詳細使用方法也可以參考ORACLE聯機幫助

  設置表空間為只讀(假定表空間名字為APP_Data 和APP_Index)

  alter tablespace app_data read only;

  alter tablespace app_index read only;

  發出EXP命令

  SQL>host exp userid=”””sys/password as sysdba”””

  transport_tablespace=y tablespace=(app_data app_index)

  以上需要注意的是

  ·為了在SQL中執行EXPUSERID必須用三個引號在UNIX中也必須注意避免“/”的使用

  ·在和以後必須使用sysdba才能操作

  ·這個命令在SQL中必須放置在一行(這裡是因為顯示問題放在了兩行)

  拷貝數據文件到另一個地點即目標數據庫

  可以是cp(unix)或copy(windows)或通過ftp傳輸文件(一定要在bin方式)

  把本地的表空間設置為讀寫

  在目標數據庫附加該數據文件

  imp file=expdatdmp userid=”””sys/password as sysdba””” transport_tablespace=y “datafile=(c:tempapp_datac:tempapp_index)”

  設置目標數據庫表空間為讀寫

  alter tablespace app_data read write;

  alter tablespace app_index read write;

  優化EXP/IMP的方法

  當需要exp/imp的數據量比較大時這個過程需要的時間是比較長的我們可以用一些方法來優化exp/imp的操作

  exp:使用直接路徑 direct=y

  oracle會避開sql語句處理引擎直接從數據庫文件中讀取數據然後寫入導出文件

  可以在導出日志中觀察到: exp: table xxx will be exported in conventional path

  如果沒有使用直接路徑必須保證buffer參數的值足夠大

  有一些參數於direct=y不兼容無法用直接路徑導出可移動的tablespace或者用query參數導出數據庫子集

  當導入導出的數據庫運行在不同的os下時必須保證recordlength參數的值一致

  imp:通過以下幾個途徑優化

  避免磁盤排序

  將sort_area_size設置為一個較大的值比如M

  避免日志切換等待

  增加重做日志組的數量增大日志文件大小

  優化日志緩沖區

  比如將log_buffer容量擴大倍(最大不要超過M)

  使用陣列插入與提交

  commit = y

  注意:陣列方式不能處理包含LOB和LONG類型的表對於這樣的table如果使用commit = y每插入一行就會執行一次提交

  使用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 ZHSGBK

  NLS_CALENDAR GREGORIAN

  NLS_DATE_FORMAT DDMONRR

  NLS_DATE_LANGUAGE AMERICAN

  NLS_SORT BINARY

  NLS_TIME_FORMAT HHMISSXFF AM

  NLS_TIMESTAMP_FORMAT DDMONRR HHMISSXFF AM

  NLS_TIME_TZ_FORMAT HHMISSXFF AM TZH:TZM

  NLS_TIMESTAMP_TZ_FORMAT DDMONRR HHMISSXFF AM TZH:TZM

  NLS_DUAL_CURRENCY $

  NLS_COMP BINARY

  NLS_NCHAR_CHARACTERSET ZHSGBK

  NLS_RDBMS_VERSION

  NLS_CHARACTERSETZHSGBK是當前數據庫的字符集

  我們再來查看客戶端的字符集信息

  客戶端字符集的參數NLS_LANG=_< territory >

  language指定oracle消息使用的語言日期中日和月的顯示

  Territory指定貨幣和數字的格式地區和計算星期及日期的習慣

  Characterset控制客戶端應用程序使用的字符集通常設置或等於客戶端的代碼頁或者對於unicode應用設為UTF

  在windows中查詢和修改NLS_LANG可在注冊表中進行

  HKEY_LOCAL_MACHINESOFTWAREOracleHOMExx

  xx指存在多個Oracle_HOME時的系統編號

  在unix中

  $ env|grep NLS_LANG

  NLS_LANG=simplified chinese_chinaZHSGBK

  修改可用

  $ export NLS_LANG=AMERICAN_AMERICAUTF

  通常在導出時最好把客戶端字符集設置得和數據庫端相同當進行數據導入時主要有以下兩種情況

  () 源數據庫和目標數據庫具有相同的字符集設置

  這時只需設置導出和導入端的客戶端NLS_LANG等於數據庫字符集即可

  () 源數據庫和目標數據庫字符集不同

  先將導出端客戶端的NLS_LANG設置成和導出端的數據庫字符集一致導出數據然後將導入端客戶端的NLS_LANG設置成和導出端一致導入數據這樣轉換只發生在數據庫端而且只發生一次

  這種情況下只有當導入端數據庫字符集為導出端數據庫字符集的嚴格超集時數據才能完全導成功否則可能會有數據不一致或亂碼出現

  不同版本的EXP/IMP問題

  一般來說從低版本導入到高版本問題不大麻煩的是將高版本的數據導入到低版本中在Oraclei之前不同版本Oracle之間的EXP/IMP可以通過下面的方法來解決

  在高版本數據庫上運行底版本的catexpsql;

  使用低版本的EXP來導出高版本的數據;

  使用低版本的IMP將數據庫導入到低版本數據庫中;

  在高版本數據庫上重新運行高版本的catexpsql腳本

  但在i中上面的方法並不能解決問題如果直接使用低版本EXP/IMP會出現如下錯誤

  EXP: orACLE error %lu encountered

  orA: invalid column name

  這已經是一個公布的BUG需要等到Oracle才能解決BUG號為你可以到METALINK上去查看有關此BUG的詳細信息

  BUG歸BUG我們的工作還是要做在沒有Oracle的支持之前我們就自己解決在Oraclei中執行下面的SQL重建exurls視圖即可

  Create or REPLACE view exurls

  (objownobjnampolicypolownpolschpolfunstmtschkoptenabledspolicy)

  AS select uname oname rpname rpfschma rppname rpfname

  decode(bitand(rstmt_type) Select)

  || decode(bitand(rstmt_type) Insert)

  || decode(bitand(rstmt_type) Update)

  || decode(bitand(rstmt_type) Delete)

  rcheck_opt renable_flag

  DECODE(BITAND(rstmt_type ) )

  from user$ u obj$ o rls$ r

  where uuser# = oowner#

  and robj# = oobj#

  and (uid = or

  uid = oowner# or

  exists ( select * from session_roles where role=Select_CATALOG_ROLE)

  )

  /

  grant select on sysexurls to public;

  /

  可以跨版本的使用EXP/IMP但必須正確地使用EXP和IMP的版本

  總是使用IMP的版本匹配數據庫的版本要導入到使用的IMP工具

  總是使用EXP的版本匹配兩個數據庫中最低的版本中導入則使用版本的EXP工具


From:http://tw.wingwit.com/Article/program/Oracle/201311/19071.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.