程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 數據庫備份與恢復總結-exp/imp (導出與導入裝庫與卸庫)

Oracle 數據庫備份與恢復總結-exp/imp (導出與導入裝庫與卸庫)

編輯:Oracle數據庫基礎

1.1  基本命令

 1.  獲取幫助   $ exp help=y $ imp help=y   2.  三種工作方式   1互式方式 $ exp        //  然後按提示輸入所需要的參數 2令行方式 $ exp user/pwd@dbname file=/Oracle/test.dmp full=y    //  命令行中輸入所需的參數   3數文件方式 $ exp parfile=username.par    //  在參數文件中輸入所需的參數 參數文件 username.par 內容 userid=username/userpassWord buffer=8192000 compress=n grants=y file=/Oracle/test.dmp full=y   3.  三種模式   1)表方式,將指定表的數據導出/導入。 導出: 導出一張或幾張表: $ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 導出某張表的部分數據 $ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\”where col1=\’…\’ and col2 \<…\” 導入 導入一張或幾張表 $  imp  user/pwd  file=/dir/xxx.dmp  log=xxx.log  tables=table1,table2  fromuser=dbuser touser=dbuser2 commit=y ignore=y   2)用戶方式,將指定用戶的所有對象及數據導出/導入。 導出 $ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx, yy) 只導出數據對象,不導出數據  (rows=n ) $ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n 導入 $  imp  user/pwd  file=/dir/xxx.dmp  log=xxx.log  fromuser=dbuser  touser=dbuser2 commit=y ignore=y 3)全庫方式,將數據庫中的所有對象導出/導入導出: $ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycommit=y ignore=y 導入 $ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2

1.2  高級選項

1.  分割成多個文件   以多個固定大小文件方式導出:這種做法通常用在表數據量較大,單個 dump文件可能 會超出文件系統的限制的情況 $ exp user/pwd file=1.dmp,2.dmp,3.dmp,…filesize=1000m    log=xxx.log full=y 以多個固定大小文件方式導入 $  imp  user/pwd file=1.dmp,2.dmp,3.dmp,…  filesize=1000m tables=xxx  fromuser=dbuser touser=dbuser2    commit=y ignore=y   2.  增量導出/導入   // Oracle 9i  以後 exp  不再支持  inctype 必須為  SYS  或  SYSTEM  才可執行增量導出導入 增量導出:   包括三個類型: (1)“完全”增量導出(Complete)  //  備份整個數據庫 $ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete (2)“增量型”增量導出      導出上一次備份後改變的數據。 $ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental (3)  “累計型”增量導出(Cumulative)只導出自上次“完全”導出之後數據庫中變化 了的信息。 $ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative 增量導入: $ imp usr/pwd FULL=y inctype=system/restore/inct ype 其中: SYSTEM:    導入系統對象 RESTORE:  導入所有用戶對象     3.  SYSDBA進行導出/導入     1.  用於 Oracle 技術支持 2.  用於表空間傳輸 例: $    imp    \'usr/pwd@instance    as    sysdba\'    tablespaces=xx    transport_tablespace=y file=xxx.dmp datafiles=xxx.dbf $  imp  file=expdat.dmp  userid=”””sys/passWord  as  sysdba”””  transport_tablespace=y “datafile=(c:tempapp_data,c:tempapp_index)”   4.  表空間傳輸  (度快)   表空間傳輸是  8i  新增加的一種快速在數據庫間移動數據的一種辦法,是把一個數 據庫上的格式數據文件附加到另外一個數據庫中,而不是把數據導出成  dmp  文件,這 在有些時候是非常管用的,因為傳輸表空間移動數據就象復制文件一樣快。 1.關於傳輸表空間有一些規則  (10g) ?      源數據庫和目標數據庫必須運行在相同的硬件平台上。   ?      源數據庫與目標數據庫必須使用相同的字符集。 ?      源數據庫與目標數據庫一定要有相同大小的數據塊 ?      目標數據庫不能有與遷移表空間同名的表空間 ?      SYS 的對象不能遷移 ?      必須傳輸自包含的對象集 ?      有一些對象,如物化視圖,基於函數的索引等不能被傳輸 (同字節序文件的跨平台可以用更換數據文件的文件頭的方法) (10g  支持跨平台的表空間傳輸,只要操作系統字節順序相同,就可以進行表空間 傳輸。需要使用 RMAN轉換文件格式,略) 2.  檢測一個表空間是否符合傳輸標准的方法: SQL > exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); SQL > select * from sys.transport_set_violations; 如果沒有行選擇,表示該表空間只包含表數據,並且是自包含的。對於有些非自包 含的表空間,如數據表空間和索引表空間,可以一起傳輸。   3要使用步驟: 如果想參考詳細使用方法,也可以參考 Oracle聯機幫助。 1.設置表空間為只讀(假定表空間名字為 APP_Data  和 APP_Index) SQL > alter tablespace app_data read only; SQL > alter tablespace app_index read only; 2.發出 EXP命令 SQL> host exp userid=”””sys/passWord as sysdba””” transport_tablespace=y tablespaces=(app_data, app_index) 以上需要注意的是 ·為了在 SQL 中執行 EXP,USERID 必須用三個引號,在 UNIX中也必須注意 避免“/”的使用 ·在 816和以後,必須使用 sysdba才能操作 ·這個命令在 SQL中必須放置在一行(這裡是因為顯示問題放在了兩行) 3.拷貝.dbf數據文件(以及.dmp文件)到另一個地點,即目標數據庫 可以是 cp(unix)或 cop y(Windows)或通過 FTP傳輸文件(一定要在 bin方式) 4.把本地的表空間設置為讀寫 $ alter tablespace app_data read write; $ alter tablespace app_index read write; 5.在目標數據庫附加該數據文件  (直接指定數據文件名) (表空間不能存在,必須建立相應用戶名或者用 fromuser/touser) $ imp file=expdat.dmp userid=”””sys/passWord as sysdba””” transport_tablespace=y    datafiles=(“c:\app_data.dbf,c:\app_index.dbf”) tablespaces=app_data,app_index tts_owners=hr,oe 6.設置目標數據庫表空間為讀寫 $ alter tablespace app_data read write; $ alter tablespace app_index read write;  

1.3  優化

 1.  加快exp速度   加大 large_pool_size,可以提高 exp的速度 采用直接路徑的方式(direct=y),數據不需要經過內存進行整合和檢查. 設置較大的 buffer,如果導出大對象,小 buffer會失敗。 export文件不在 Oracle使用的驅動器上 不要 export到 NFS文件系統 UNIX環境:用管道模式直接導入導出來提高 imp/exp的性能   2.  加快imp速度   建立一個 indexfile,在數據 import完成後在建立索引 將 import 文件放在不同的驅動器上 增加 DB_BLOCK_BUFFERS 增加 LOG_BUFFER 用非歸檔方式運行 Oracle:ALTER DATABASE NOARCHIVELOG; 建立大的表空間和回滾段,OFFLINE其他回滾段,回滾段的大小為最大表的 1/2 使用  COMMIT=N 使用 ANALYZE=N 單用戶模式導入 UNIX環境:用管道模式直接導入導出來提高 imp/exp的性能   3.  通過unix/Linux PIPE道加快exp/imp速度   通過管道導出數據: 1.通過 mknod -p 建立管道 $ mknod /home/exppipe p    //  在目錄/home下建立一個管道 exppipe注意參數 p 2.通過 exp和 gzip導出數據到建立的管道並壓縮 $ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz $ exp test/test tables=bitmap file=/home/newsys/test.pipe & gzip < /home/newsys/test.pipe > bitmap.dmp.gz 3.導出成功完成之後刪除建立的管道 $ rm    -rf    /home/exppipe   導出腳本 ###UNIX下 Oracle數據庫通過 PIPE管道進行備份 ###### using "export" and "tar" command to bakup Oracle datebase #######   trap "" 1 #nohup LOGFILE=/opt/bakup/log/bakup_ora.log   export LOGFILE DUMPDIR=/archlog_node1 export DUMPDIR exec >$LOGFILE 2>&1     echo echo ' Begin at ' `date` echo     #               clear old result file cd $DUMPDIR if [ -f exp.dmp.Z ] then echo "clear old result file" rm exp.dmp.Z fi     #               make pipe mkfifo exp.pipe chmod a+rw exp.pipe     #               gain the dmp.Z file compress < exp.pipe > exp.dmp.Z & su -u Oracle -c "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000"     echo echo '    exp end at '`date` echo     #               rm pipe rm exp.pipe     #               tar the dmp.Z file to tape mt -f /dev/rmt/0 rew tar cvf /dev/rmt/0 exp.dmp.Z     echo echo '    tar end at '`date` echo   通過管道導入生成的文件: 1.通過 mknod -p 建立管道   $ mknod /home/exppipe p 2.導入生成的壓縮文件 $ imp test/test file=/home/exppipe fromuser=test touser=Macro & gunzip < exp.dmp.gz > /home/exppipe 3.刪除管道 $ rm –fr /home/exppipe     4.  全庫導入的一般步驟   注意在導出時,需要通過toad或其他工具提取源數據庫創建主鍵和索引的腳本 1.  先全庫加 rows=n 把結構導進去 $ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n 2.  使業務用戶的觸發器失效/刪除主鍵和唯一索引 spool drop_pk_u.sql select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type in ('P','U'); / spool off spool disable_trigger.sql select 'alter trigger '||trigger_name||' disable;' from user_triggers; / spool off     @drop_pk_u.sql @disable_trigger.sql     3.  以 ignore=y全庫導入 $ imp system/manager file=exp.dmp log=imp.log full=y ignore=y 4.  通過 toad或其他工具提取源數據庫創建主鍵和索引的腳本,在目標數據庫中創建主鍵 和索引。使觸發器生效。

1.4  常見問題

 1.  字符集問題   Oracle  多國語言設置是為了支持世界范圍的語言與字符集,一般對語言提示, 貨幣形式,排序方式和  CHAR,VARCHAR2,C LOB,LONG  字段的數據的顯示等有效。 Oracle  的多國語言設置最主要的兩個特性就是國家語言設置與字符集設置,國家語 言設置決定了界面或提示使用的語言種類,字符集決定了數據庫保存與字符集有關數據 (如文本)時候的編碼規則。 Oracle 字符集設定,分為數據庫字符集和客戶端字符集環境設置。在數據庫端,   字符集在創建數據庫的時候設定,並保存在數據庫 props$表中。 在客戶端的字符集環境比較簡單,主要就是環境變量或注冊表項  NLS_ LANG,注 意 NLS_LANG的優先級別為:參數文件<注冊表<環境變量<alter  session。如果客戶端 字符集和服務器端字符集不一樣,而且字符集的轉換也不兼容,那麼客戶端的數據顯示 與導出/導入的與字符集有關的數據將都是亂碼。 使用一點點技巧,就可以使導出/導入在不同的字符集的數據庫上轉換數據。這裡 需要一個 2進制文件編輯工具即可,如 uedit32。用編輯方式打開導出的 dmp文件,獲 取  2 、 3  字節 的 內容 , 如  00  01 , 先 把 它 轉換 為  10  進 制 數, 為  1 ,使用 函 數 NLS_CHARSET_NAME 即可獲得該字符集: SQL> select nls_charset_name(1) from dual; NLS_CHARSET_NAME(1) ------------------- US7ASCII 可以知道該 dmp文件的字符集為 US7ASCII,如果需要把該 dmp文件的字符集換 成 ZHS16GBK,則需要用 NLS_CHARSET_ID 獲取該字符集的編號: SQL> select nls_charset_id('zhs16gbk') from dual; NLS_CHARSET_ID('ZHS16GBK') -------------------------- 把 852換成 16進制數,為 354,把 2、3字節的 00  01 換成 03  54,即完成了把該 dmp文件字符集從 us7ascii 到 zhs16gbk 的轉化,這樣,再把該 dmp文件導入到 zhs16gbk 字符集的數據庫就可以了。   2.  版本問題   Exp/Imp 很多時候,可以跨版本使用,如在版本 7與版本 8之間導出導入數據,但 這樣做必須選擇正確的版本,規則為: ·總是使用 IMP的版本匹配數據庫的版本,如果要導入到 816,則使用 816的導入工 具。 ·總是使用 EXP 的版本匹配兩個數據庫中低的那個版本,如在 815與 816之間互導,則使用 815的 EXP 工具。 imp和 exp版本不能往上兼容:    imp 可以導入低版本 exp生成的文件,  不能導入高版本 exp生成的文件。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved