ORACLE備份的分類

達芬奇的夢發表於2017-03-16
簡單的按照備份進行的方式,可以分為邏輯備份、冷備份(離線備份)、熱備份(聯機備份),其實冷備份與熱備份又可以合稱為物理備份 
按照備份的工具,可以分為EXP/IMP備份、OS複製、RMAN、第三方工具,如VERITAS  [@more@]

1、EXP/IMP邏輯備份 
   匯入/匯出是ORACLE倖存的最古老的兩個命令列工具了,其實我從來不認為Exp/Imp是一種好的備份方式,正確的說法是Exp/Imp只能是一個好的轉儲工具,特別是在小型資料庫的轉儲,表空間的遷移,表的抽取,檢測邏輯和物理衝突等中有不小的功勞。當然,我們也可以把它作為小型資料庫的物理備份後的一個邏輯輔助備份,也是不錯的建議。 
對於越來越大的資料庫,特別是TB級資料庫和越來越多資料倉儲的出現,EXP/IMP越來越力不從心了,這個時候,資料庫的備份都轉向了RMAN和第三方工具。下面我們還是簡要介紹一下EXP/IMP的使用。 
 i、使用方法 
    Exp parameter_name=value 
    Or Exp parameter_name=(value1,value2……) 
    只要輸入引數help=y就可以看到所有幫助 
    如: 
    C:>set nls_lang=simplified chinese_china.zhs16gbk 
    C:>exp -help 
    Export: Release 8.1.6.0.0 - Production on 星期四 4月 10 19:09:21 2003 
    (c) Copyright 1999 Oracle Corporation.  All rights reserved. 

    透過輸入 EXP 命令和使用者名稱/口令,您可以 
    在使用者 / 口令之後的命令: 

    例項: EXP SCOTT/TIGER 
    或者,您也可以透過輸入跟有各種引數的 EXP 命令來控制“匯出”的執行方式。
    要指定引數,您可以使用關鍵字: 

    格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN) 
    例項: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR) 
    或 TABLES=(T1: P1,T1: P2),如果 T1 是分割槽表 
    USERID 必須是命令列中的第一個引數。 
    關鍵字  說明(預設)        關鍵字      說明(預設) 
    -------------------------------------------------------------------------- 
    USERID   使用者名稱/口令            FULL         匯出整個檔案 (N) 
    BUFFER   資料緩衝區的大小          OWNER        所有者使用者名稱列表 
    FILE     輸出檔案 (EXPDAT.DMP)    TABLES       表名列表 
    COMPRESS 匯入一個範圍 (Y)   RECORDLENGTH  IO 記錄的長度 
    GRANTS  匯出許可權 (Y)            INCTYPE      增量匯出型別 
    INDEXES 匯出索引 (Y)           RECORD       跟蹤增量匯出 (Y) 
    ROWS    匯出資料行 (Y)         PARFILE      引數檔名 
    CONSTRAINTS 匯出限制 (Y)    CONSISTENT   交叉表一致性 
    LOG      螢幕輸出的日誌檔案    STATISTICS  分析物件 (ESTIMATE) 
    DIRECT   直接路徑 (N)              TRIGGERS     匯出觸發器 (Y) 
    FEEDBACK 顯示每 x 行 (0) 的進度 
    FILESIZE 各轉儲檔案的最大尺寸 
    QUERY    選定匯出表子集的子句 

    下列關鍵字僅用於可傳輸的表空間 
    TRANSPORT_TABLESPACE 匯出可傳輸的表空間後設資料 (N) 
    TABLESPACES 將傳輸的表空間列表 
    在沒有警告的情況下成功終止匯出。 
    C:> 
    幫助已經很詳細的說明了引數的意義和使用方法,並列舉了幾個簡單的例子,注意的是,從8i開始,已經開始支援資料子集的方法,就是可以指定自己的Where條件,可以從表中匯出一行或多行資料。 
    注意上面的set nls_lang=simplified chinese_china.zhs16gbk,透過設定環境變數,可以讓exp的幫助以中文顯示,如果set nls_lang=American_america.字符集,那麼你的幫助就是英文的了。 
增量和累計匯出必須在全庫方式下才有效,而且,大多數情況下,增量和累計匯出並沒有想象中的那麼有效。ORACLE從9i開始,不再支援增量匯出和累計匯出。 
  
  ii、表空間傳輸 
    表空間傳輸是8i新增加的一種快速在資料庫間移動資料的一種辦法,是把一個資料庫上的格式資料檔案附加到另外一個資料庫中,而不是把資料匯出成Dmp檔案,這在有些時候是非常管用的,因為傳輸表空間移動資料就象複製檔案一樣快。 
    關於傳輸表空間有一些規則,即: 
    ·源資料庫和目標資料庫必須執行在相同的平臺上。 
    ·源資料庫與目標資料庫必須使用相同的字符集。 
    ·源資料庫與目標資料庫一定要有相同大小的資料塊(9i已經不用) 
    ·目標資料庫不能有與遷移表空間同名的表空間 
    ·SYS的物件不能遷移 
    ·必須傳輸自包含的物件集 
    ·有一些物件,如物化檢視,基於函式的索引等不能被傳輸 
    可以用以下的方法來檢測一個表空間或一套表空間是否符合傳輸標準: 
    exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); 
    select * from sys.transport_set_violation; 
    如果沒有行選擇,表示該表空間只包含表資料,並且是自包含的。對於有些非自包含的表空間,如資料表空間和索引表空間,可以一起傳輸。 
    以下為簡要使用步驟,如果想參考詳細使用方法,也可以參考ORACLE聯機幫助。 
    a.設定表空間為只讀(假定表空間名字為APP_Data 和APP_Index) 
      alter tablespace app_data read only; 
      alter tablespace app_index read only; 
    b.發出EXP命令 
      SQL>host exp userid=”””sys/password as sysdba”””  
      transport_tablespace=y tablespace=(app_data, app_index) 
     以上需要注意的是 
    ·為了在SQL中執行EXP,USERID必須用三個引號,在UNIX中也必須注意避免“/”的使用 
    ·在816和以後,必須使用sysdba才能操作 
    ·這個命令在SQL中必須放置在一行(這裡是因為顯示問題放在了兩行) 
    c.複製資料檔案到另一個地點,即目標資料庫 
      可以是cp(unix)或copy(windows)或透過ftp傳輸檔案(一定要在bin方式) 
    d.把本地的表空間設定為讀寫 
    e.在目標資料庫附加該資料檔案 
      imp file=expdat.dmp userid=”””sys/password as sysdba””” 
      transport_tablespace=y 
     “datafile=(c: empapp_data,c: empapp_index)” 
    f.設定目標資料庫表空間為讀寫 
      alter tablespace app_data read write; 
      alter tablespace app_index read write; 

  iii、匯出/匯入與字符集 
    明白ORACLE的多國語言設定,ORACLE多國語言設定是為了支援世界範圍的語言與字符集,一般對語言提示,貨幣形式,排序方式和CHAR,VARCHAR2,CLOB,LONG欄位的資料的顯示等有效。ORACLE的多國語言設定最主要的兩個特性就是國家語言設定與字符集設定,國家語言設定決定了介面或提示使用的語言種類,字符集決定了資料庫儲存與字符集有關資料(如文字)時候的編碼規則。正如剛才上面的一個小例子,環境變數NLS_LANG的不同,導致EXP幫助發生變化,這就是多國語言設定的作用(NLS_LANG包含國家語言設定與字符集設定,這裡起作用的是國家語言設定,而不是字符集)。 
    ORACLE字符集設定,分為資料庫字符集和客戶端字符集環境設定。在資料庫端,字符集在建立資料庫的時候設定,並儲存在資料庫props$表中,對於8i以上產品,已經可以採用“Alter database character set 字符集”來修改資料庫的字符集,但也僅僅是從子集到超集,不要透過update props$來修改字符集,如果是不支援的轉換,可能會失去所有與字符集有關的資料,就是支援的轉換,也可能導致資料庫的不正常工作。字符集分為單位元組字符集與多位元組字符集,US7ASCII就是典型的單位元組字符集,在這種字符集中length=lengthb,而ZHS16GBK就是常用的雙位元組字符集,在這裡lengthb=2*length。 
    在客戶端的字符集環境比較簡單,主要就是環境變數或登錄檔項NLS_LANG,注意NLS_LANG的優先順序別為:引數檔案à登錄檔à環境變數àalter session。NLS_LANG的組成為“國家語言設定.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客戶端的字符集最好與資料庫端一樣(國家語言設定可以不一樣,如zhs16gbk的字符集,客戶端可以是nls_lang =simplified chinese_china.zhs16gbkAmeircan_America.zhs16gbk,都不影響資料庫字元的正常顯示),如果字符集不一樣,而且字符集的轉換也不相容,那麼客戶端的資料顯示與匯出/匯入的與字符集有關的資料將都是亂碼。 
    使用一點點技巧,就可以使匯出/匯入在不同的字符集的資料庫上轉換資料。這裡需要一個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 
    把852換成16進位制數,為354,把2、3位元組的00 01換成03 54,即完成了把該dmp檔案字符集從us7ascii到zhs16gbk的轉化,這樣,再把該dmp檔案匯入到zhs16gbk字符集的資料庫就可以了。(注意,十進位制數與十六進位制之間的轉換,想明白其中的道理) 

  iv、跨版本使用Exp/Imp 
Exp/Imp很多時候,可以跨版本使用,如在版本7與版本8之間匯出匯入資料,但這樣做必須選擇正確的版本,規則為: 
  ·總是使用IMP的版本匹配資料庫的版本,如果要匯入到816,則使用816的匯入工具。 
  ·總是使用EXP的版本匹配兩個資料庫中低的那個版本,如在815與816之間互導,則使用815的EXP工具。 

2.備份RMAN資料庫 
   RMAN自己的資料庫也需要備份,但是本身很小,而且不是經常發生變化,所以在每次RMAN備份完成後,都可以用如下指令碼對RMAN資料庫備份。 
   EXP pafile =exprman.sql 
   exprman.sql為 
   USERID=RMAN/RMAN 
   BUFFER=32768 
   OWNER=RMAN 
   FILE=RMAN.DMP 
   ROWS=Y 
   GRANTS=Y 
   COMPRESS=Y 
   CONSISTENT=Y 

3.使自動備份資料庫 
   自動備份資料庫不外乎以下三種方式 
    WINDOWS下的任務計劃(At命令) 
    UNIX下的Crontab 
    第三方工具如Viritas 
在以上三種方式中Viritas屬於第三方工具,很多人可能都沒有接觸,主要說一下windows的任務計劃與unix的cron 
   i、生成指令碼檔案,如backup.rcv 
   假定檔案內容如下: 
   $>cat backup.rcv 
     connect target sys/password rcvcat rman/rman@localname; 
     run{ 
     allocate channel c1 type disk; 
     allocate channel c2 type disk; 
     allocate channel c3 type disk; 
     backup fileaperset 3 format ‘/u01/oradata/backup/arch%u_%s_%p’  
     archivelog all delete input;    
     release channel c1; 
     release channel c2; 
     release channel c3; 
     } 
    ii、生成執行檔案 
     在windows上生成backup_archive.bat,內容包括 
     rman cmdfile = backup.rcv 
     在unix下生成 backup_archive.sh,內容包括 
     /oracle/ramn/rman cmdfile = backup.rcv 
    iii、加入排程 
     在windows中用任務計劃嚮導即可,或使用at命令。 
     在unix中,在目標機器上編寫一個檔案,用以啟動自動備份程式。假定檔名為ORACLE,檔案將放在/var/spool/cron/crontabs目錄下 
     $>cat oracle 
     0 23 * * 0 backup_archive.sh 
     #表示星期天23點對資料庫備份 
     0 12,18 * * * backup_archive.sh 
     #表示每天12點,18點備份 
     Crontab檔案的每一行由六個域(minutes,hours,day of month,month,day of week,command)組成,域之間用空格或Tab分隔開來 

常見誤區 
   1、使用EXP/IMP備份 
      EXP/IMP不是一個良好的備份工具,在以後的發展之中,ORACLE對EXP/IMP用於備份的支援會越來越低。ORACLE只是把EXP/IMP當作一個好的工具而不是備份工具,在對於大型資料庫,如TB級資料庫或資料倉儲,EXP/IMP肯定會力不從心。 
   2、在應用程式中備份資料庫  
      在論壇上,有很多這樣的要求,“我怎麼在程式中備份與恢復資料庫?”。首先說,這個並不是不可以實現,但是實現的過程會很複雜而且意外會很多。就我的感覺,提出這樣問題的人,首先一點就是對ORACLE或DBA的不瞭解,如果ORACLE可以這麼輕鬆的實現備份與恢復,那麼我可以說,就不需要DBA了。 
   3、冷備份比熱備份更容易,效果會更好 
      有人認為,冷備份是關閉資料庫進行的一致性備份,肯定比熱備份要好,使用也容易,其實不盡然,在熱備份中,一樣可以實現資料庫的全備份,而且不會影響到資料庫的執行。建議所有的生產機,都執行在歸檔方式下,採用熱備份方式。 

常見問題 

   1、我匯出的資料為什麼不能匯入,提示不支援的字符集轉換 
   答:參考上面的字符集原則,匯出資料時客戶端與資料庫字符集一致,匯入時修改為與目標資料庫字符集一致。 
   
   2、我的歸檔日誌越來越多,我什麼時候可以刪除歸檔日誌? 
   答:在每一次全備份(如OS全冷備份或全熱備份)或基於全備份的增量備份(如RMAN基於0級備份上的增量備份)後都可以刪除該備份點之前的歸檔日誌,建議在磁帶上保留一年。 

   3、全備份時一定需要備份所有資料檔案嗎? 
   答:不需要,起碼有兩類資料檔案可以不備份,一類就是臨時資料檔案,如果丟失,可以刪除後重建;一類是隻讀表空間資料檔案,如果上次備份以來,沒有修改過表空間的只讀屬性,就可以不需要備份。 
   
   4、聯機日誌需要備份嗎? 
   答:如果是歸檔方式熱備份,就沒有必要備份聯機日誌。但是對於冷備份,可以備份聯機日誌,特別是不歸檔狀態。備份過聯機日誌後的冷備份,因為資料庫是一致的,可以恢復到該備份點。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31444259/viewspace-2135490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章