Oracle資料庫備份與恢復之RMAN

gjm008發表於2008-12-27

4.7 高階主題

    4.7.1  使用RMAN備份集恢復DB到其他機器  1常規方法)

    用途:利用生產 DB的備份集建立測試環境或備用資料庫(  設定成相同的 DBID,不需要連線原始 DB,只需要利用 Catalog

    步驟:

    1.準備工作,配置目標DB環境

    在目標 DB上設定 ORACLE相關的環境變數:記下生產 DB ORACLE_SIDDBID $set ORACLE_SID=ming      在目標 DB建立與生產 DB相同的目錄,將生產 DB  pfile 檔案 FTP到目標DB,或者,在第二步中可以從備份集中進行恢復得到 PFILE.      在目標  DB  上建立生產  DB    RMAN  備份集存放的目錄,沒有使用  catalog情況時這點必然保持一樣?      移植備份集(確定包含控制檔案,資料檔案,歸檔檔案)到目標  DB      配置網路連線

    2.目標DBnomount狀態下恢復pfile controlfile

    連線恢復目錄和目標資料庫:$ RMAN target / catalog rman/rman@rcdb RMAN > set DBID= 3324789823 RMAN > startup nomount RMAN> restore spfile to pfile ‘/home/oracle/pfile’ [from ‘backupset name’] RMAN> restore controlfile [to    'xx '] from '/xx/ ORADB_ctl_20070111_c-xx';(控制檔案的恢復可以參考 4.4.4.6  中其他方法)

    3.啟動目標DB    mount,在目標DBRestore Recover

    RMAN> alter database mount ——可能會提示找不到密碼檔案,不用理會 如果備份集的位置改變了,需要先進行交叉校驗:RMAN> catalog start with '/newdir' RMAN> crosscheck backup RMAN> report schema;然後 restore / recover  RMAN> run { allocate channel ch_disk_db_1 device type diskrestore databaserecover database until sequence=2412 thread=1——最後一個 arachivelog sequence release channel ch_disk_db_1

    }

    4.Resetlogs  開啟目標  DB

    聯機日誌檔案並沒有恢復,所以需要  resetlogs SQL> alter database open resetlogs

    5.重建臨時表空間,重建密碼檔案,立即備份資料庫

    重建臨時表空間:因為備份時不備份臨時檔案,v$tempfile 中查詢為空,所以可以增加一個檔案即可:SQL>  alter  tablespace  temp  add  tempfile  '/u05/oracle/oradata/crm/temp01.dbf'  size 10M;重建密碼檔案可以通過 orapwd命令重建密碼檔案

    備註:恢復時有時遇到的一個問題RMAN-03002    ORA-27064 錯誤解決辦法:  把資料檔案 resize oracle block size 的整數倍SQL> alter database datafile 'xxx' resize n MB

    4.7.2  使用RMAN備份集恢復DB到其他機器  2複製方法)

    使用  RMAN  DUPLICATE  命令可 以在保 留目 標數 據庫 的基礎上 依靠目標 資料庫(Target  Database)的備份建立一個副本資料庫(Duplicate  Database  .該副本即可與目標數 據庫完全相同,也可僅包含目標資料庫表空間的一部子集。目標站點(Target  Site)以及副 本站點(Duplicate Site)甚至可以在同一臺機器上。

      生成新的唯一的 DBID,如果控制檔案中仍儲存有備份資訊,可以不連線 Catalog 

    步驟:

    1.準備工作,配置副本DB環境

    1.  備份主資料庫(包括資料檔案、控制檔案以及所有歸檔),並把該備份集拷貝到副本 資料庫機器同樣的目錄下。

    2.  拷貝主資料庫的初始化引數檔案 pfile 到副本資料庫機器上,並根據需要作相應修改,建立密碼檔案。

    3.  配置主資料庫到副本資料庫的連線。

    2.啟動副本資料庫到  nomount下,目錄資料庫必須MOUNT (或OPEN

    $ sqlplus /nolog SQL> conn / as sysdba SQL> startup nomount

    3.執行RMAN,分別連線主資料庫與副本資料庫例項

    控制檔案中儲存有備份資訊,可以不連線 Catalog

    在副本資料庫上:$ rman target sys/change_on_install@MING auxiliary /

    4.執行復制命令

    如果沒有配置自動分配通道的話,需要手工指定至少  1  條輔助通道。

    DUPLICATE命令將自動完成:將還原所有資料檔案,重新建立控制檔案,並利 用新的引數檔案啟動恢復資料庫到一致狀態,最後用  resetlog  方式開啟資料庫,並 重建  redolog

    RMAN> RUN { ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISKduplicate target database tocrmnofilenamecheck RELEASE CHANNEL aux1}

    5.重建臨時表空間,立即備份資料庫

    SQL>  alter  tablespace  temp  add  tempfile  '/u05/oracle/oradata/crm/temp01.dbf'  size 10M

    附:Duplicate 複製命令的一些高階用法:

    1.NOFILENAMECHECK異機恢復需要指定  NOFILENAMECHECK,可以跳過檔名檢測,避免  oracle  錯 誤的領會你的操作意圖。

    2.指定PFILE如果輔助例項不是用 SPFILE啟動,需要指定  PFILE  引數,PFILE檔案必須放在執行  RMAN  的客戶端上。

    3.跳過不需要複製的表空間要跳過只讀表空間,在執行 duplicate 命令時指定  SKIP READONLY 子句即可。

    要跳過離線表空間,在執行 duplicate 命令之前將其置為  OFFLINE NORMAL 狀態即可,RMAN  複製時會跳過只讀或離線表空間的資料檔案。

    要跳過正常的表空間,指定 SKIP TABLESPACE ts_name

    4.恢復到以前的時間點要恢復到以前的時間點,在 duplicate 命令中指定  UNTIL TIME 'SYSDATE-1' 5.建立過程中重新命名控制檔案可以使用 restore controlfile from …;或者 dbms_backup_restore 包恢復出控制元件檔案,然後在初始化引數檔案 PFILE 中進行正確的設定。

    6.建立過程中重新命名線上日誌檔案1.執行  duplicate 命名時指定 LOGFILE子句,手工設定 redo logs 檔名。 例:LOGFILE GROUP 1 '/oradata/newdb/redo01_1.log'

    '/oradata/newdb/redo01_2. log' SIZE 200K,)

    2.副本資料庫初始化引數檔案 PFILE中設定 LOG_FILE_NAME_CONVERT LOG_FILE_NAME_CONVERT = 'string1' 'string2' 'string3' 'string4' ……;將  strin1 替換為 string2string3 替換為 string4 7.建立過程中重新命名資料檔案,或改變資料庫檔案的新的路徑1.在初始化引數中重新命名:DB_FILE_NAME_CONVERT=‘xxxx’‘yyyy’2. Duplicate Duplicate Duplicate 命令中重新命名資料檔案: duplicate target database to newdb DB_FILE_NAME_CONVERT='xxxx' 'yyyyy ');3.使用 SET NEWNAME  命令重新命名資料檔案SET NEWNAME FOR DATAFILE 1 TO '/xxx/xxx.dbf'4.使用  CONFIGURE AUXNAME  命令重新命名資料檔案CONFIGURE AUXNAME FOR DATAFILE 1 TO '/xxxx/xxx.dbf'5.重新命名臨時檔案路徑SET NEWNAME FOR TEMPFILE '/xxx/xxx.dbf' TO '/yyy/xxx.dbf'

    例:一個比較複雜的複製命令如下:

    RMAN> RUN {

    allocate auxiliary channel newdb1 device type sbt

    duplicate target database to newdb

    DB_FILE_NAME_CONVERT='/h1/oracle/dbs/trgt/''/h2/oracle/oradata/newdb/'

    UNTIL TIME 'SYSDATE-1'       # specifies incomplete recovery

    SKIP TABLESPACE cmwlite drsys example        # skip desired tablespaces

    PFILE = /dbs/initNEWDB.ora

    LOGFILE

    GROUP 1 '/oradata/newdb/redo01_1.log'

    '/oradata/newdb/redo01_2. log' SIZE 200K

    GROUP 2 '/oradata/newdb/redo02_1. log''

    '/oradata/newdb/redo02_2. log'' SIZE 200K

    GROUP 3 '/oradata/newdb/redo03_1. log''

    '/oradata/newdb/redo03_2. log'' SIZE 200K REUSE

    }

    4.7.3  表空間時間點恢復(TSPITR

    使用者可能錯誤的刪除了幾個表,而且還截斷了幾個表,如果進行整庫恢復可能代價比較

    高,這時,我們可以執行表空間時間點恢復(tablespace point-in-time recovery  TSPITR)。

    為了掌握如何執行 TSPITR,應該理解下面這些術語:輔助例項(auxiliary  instance):  這是我們建立的臨時例項,RMAN  使用這個例項執行TSPITR.完成 TSPITR  後,這個例項可以刪除。

    輔助集(auxiliary  set):  輔助例項上的檔案集。包括控制檔案、回滾段或者重做段的表空間、系統表空間、聯機日誌檔案等,還可以選擇輔助例項的臨時表空間。

    恢復集(recovery set):    要執行 TSPITR  的表空間/資料檔案集目標資料庫:    實際執行 TSPITR  的資料庫

    TSPITR  的本質是,RMAN  將要進行時間點恢復的表空間按照設定的條件恢復到輔助例項上,然後再從輔助例項將表空間傳到目標資料庫,從而避免整個資料庫的恢復,減少恢 復時間,而且這期間其他表空間仍然可用。(  使用者管理的備份與恢復也可以使用 TSPITR

    檢查TSPITR之後丟失的物件,被丟失物件資訊的獲取:SQL> Select owner name From TS_PITR_OBJECTS_TO_BE_DROPPED Where tablespace_name = 'USER01' And creation_time > to_date '2004-09-27 112521' 'yyyy-mm-dd hh24miss' );進行TSPITR  的基本步驟是(與有些書上的步驟略有不同):(0  檢查需要恢復的表空間的資料檔案備份和控制檔案備份是否存在(1  驗證表空間的可傳輸性(2  準備輔助例項(3  執行實際的 TSPITR4  在目標資料庫上執行 TSPITR  後的操作。

    1.驗證表空間的可傳輸性

    RMAN  使用 Oracle  可傳送的表空間特性來執行 TSPITR,因此表空間本身必須是可傳送的。許多因素都導致表空間不可傳送。

    TSPITR  限制不能還原包含  SYS  使用者物件不能執行 TSPITR  恢復具有複製主表的表空間 不支援使用快照日誌的表空間 不能還原含有回滾段的表空間不能還原含有分割槽物件(該物件的分割槽跨越多個表空間)的表空間表空間中不能含有 VARRAY、巢狀表、外部表物件TSPITR  不能用於恢復刪除的表空間。

    可以通過  TS_PITR_CHECK  檢視來判斷表空間是否可傳送。如果表空間不可傳送,那 麼執行  TSPITR    時就會失敗。下面是查詢 USERS  表空間是否可傳送的語句:SQL> SELECT OBJ1_NAME "Object Owner"obj1_name "Object Name" obj1_type "Object Type"ts1_name "Tablespace Name"reason FROM TS_PITR_CHECK   WHERE ts1_name='USERS';如果未選定行,說明 USERS  表空間可傳輸。

    2.準備TSPITR  的輔助例項  AUXILIARY INSTANCE

    啟動 TSPITR 之前,需要準備輔助例項。這是一個不需要  RMAN  參與的手工過程。執行下面的步驟來建立輔助例項:u    建立口令檔案u    建立輔助例項的引數檔案: 編輯輔助例項引數檔案的一個簡單方法是把目標資料庫的引數檔案改一下即可。如果目標資料庫用的是 SPFILE,那麼在  SQLPLUS  中執行 CREATE PFILE FROM SPFILE  就可以生成引數檔案。

    注意:control_files  設定為輔助例項上的檔名db_name = 目標例項lock_name_space 如果輔助例項與目標資料庫同一主機,必須設定 instance_name service_names    取一新名,如 AUX db_file_name_convert    資料檔名的轉換log_file_name_convert    日誌檔名的轉換註釋掉 log_archive_start  引數u    如果在 Windows NT  上執行 Oracle,需要使用 oradim  來新增資料庫服務u    啟動輔助例項,如有必要,配置 tnsnames.ora,測試是否連通。

    3.執行實際的TSPITR

    例子: 恢復使用者誤刪除的某個重要的表。將例項 MING  USERS  表空間恢復到 SCN 3818161  的時候。

    啟動輔助例項:C\>SET ORACLE_SID=AUX1 C\>SQLPLUS /NOLOG SQL> CONNECT / AS SYSDBA SQL> STARTUP NOMOUNT;請注意,SET ORACLE_SID=AUX1  很重要,這樣就可以不用配置 TNSNAMES.ORA執行實際的TSPITR 首先要連到目標資料庫和輔助例項。可以聯到恢復目錄,也可以不連到恢復目錄: C\> SET ORACLE_SID=AUX1 C\> RMAN TARGET /@MING CATALOG RMAN/RMAN@RECO AUXILIARY / RMAN> RECOVER TAB LESPACE USERS UNTIL SCN 233646

    等待完成表空間的恢復。當然也可以用 UNTIL TIME  或者 UNTIL SEQUENCE 子句,例:RMAN> run { allocate auxiliary channel c1 device type diskrecover tablespace user02 until logseq 9}

      這裡有些版本有一個 ORACLE BUG,執行到最後可能會報錯,需要打補丁  ?? )

    可以改變輔助集/恢復集資料檔案的位置和名稱:set newname for datafile 5 to 'c\demo\user01.dbf'configure auxname for datafile 1 to '/backup/xxx.dbf‘;在初始化引數檔案中用 DB_FILE_NAME_CONVERT 進行轉換

    10g  中增加了auxiliary destination    ,更方便RMAN> recover tablespace user01 until logseq 19 auxiliary destination 'd\auxiliary'

    4.執行TSPITR  後的操作首先應該重新連線 RMAN與目標資料庫,並且備份剛恢復的表空間。完成備份後,需要將表空間聯機(RMAN    TSPITR  後使表空間離線)。最後,我們還要關閉或刪除輔 助資料庫。

    4.7.4  塊媒體恢復  Block Media Recovery BMR

    產生塊損壞的原因一般是間斷或隨機的  I/O  錯誤或者是記憶體的塊錯誤。要恢復的壞塊 資訊可以從報警與跟蹤檔案,表與索引的分析,DBV  工具或第三方媒體管理工具以及具體 的查詢語句中獲得。

    1. DBV 工具    dbv file=EYGLE.DBF blocksize=8192 2. RMAN> backup validatedatafile 4    ——  或者 BACKUP VALIDATE DATABASE備份的 壞 塊 資訊 儲存在  V$BACKUP_CORRUPTION V$COPY_CORRUPTION  V$DATABASE_BLOCK_CORRUPTION 檢視中。

    V$BACKUP_CORRUPTION                           顯示歷史訛誤的檢視 V$DATABASE_BLOCK_CORRUPTION    顯示當前資料塊訛誤的檢視。 一旦修正了資料庫的塊訛誤,就需要重新執行  BACKUP VALIDATE DATABASE  命令,然後確認 V$DATABASE_BLOCK_CORRUPTION 中沒有其他訛誤。

    RMAN  可以備份包含損壞資料塊的資料檔案,通過設定  set maxcorrupt  可以跳過指定個數的壞塊來避免備份失敗。

    RMAN> set maxcorrupt for datafile 1 to 0;在 Oracle9i中可以用  RMAN來執行塊級的恢復,而且恢復期間資料檔案可以是聯機狀 態。RMAN通過  Block Media Recovery(簡稱 BMR)來執行塊級恢復操作。假設我們在查詢一個  Oracle  表的時候接收到下面的錯誤:ERROR  位於第  1    行:ORA-01578 ORACLE  資料塊損壞(檔案號  5,塊號  97

    ORA-01110    資料檔案  5    'E\xxxx.dbf'那麼我們就可以在  RMAN中用  BLOCKRECOVER 命令來修復:RMAN> BLOCKRECOVER DATAFILE 5 BLOCK97; 啟動  blockrecover    03-9  -06 正在啟動全部恢復目錄的  resync完成全部  resync使用通道  ORA_DISK_1通道  ORA_DISK_1    正在從資料檔案副本 E\xxxx.bak 恢復塊

    正在開始介質的恢復完成介質的恢復完成  blockrecover    03-9  -06

    恢復V$DATABASE_BLOCK_CORRUPTION 檢視中列出的壞塊:RMAN> blockrecover corruption list [ restore until time 'sysdate - 10' ];恢復指定壞塊:RMAN> blockrecover datafile 2 block 1213 datafile 9 block 19RMAN> blockrecover tablespace system dba 4440444405 from tag "weekly_backup" RMAN> blockrecover tablespace system dba 4440444405 restore until time 'sysdate-2'

    4.7.5  使用恢復目錄恢復前一個對應物

    在不完全恢復完成之後,通常需要使用  resetlogs  選項來開啟資料庫。resetlogs  表示 一個資料庫邏輯生存期的結束和另一個資料庫邏輯生存期的開始。資料庫的邏輯生存期 也被稱為一個對應物(incarnation)。每次使用  resetlogs  選項來開啟資料庫後都會建立一個 新的資料庫對應物。

    使用 RMAN可以進行穿越  resetlogs 的恢復,即可以恢復到前一個對應物。10g 版本 增強了這方面的功能。

    1  使用恢復目錄的情況使用恢復目錄的情況下,恢復前一個對應物是非常簡單的。首先,用list    incarnation;來顯示有哪些對應物:RMAN> list incarnation

資料庫&nbs

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

相關文章