Oracle介質恢復(二)

fengpinDBA發表於2013-12-05

4.        塊的損壞與恢復

塊已經不是Oracle的格式,或者其內部是不一致的,那麼這個塊就被認為已損壞。塊介質恢復是當資料檔案是聯機時,還原和恢復資料塊的技術。如果只有一些塊被破壞,那麼塊介質恢復是較好的恢復選擇。

BBEDBlock Brower and EDitor)是Oracle的一款內部工具,可以用來直接檢視和修改Oracle資料檔案塊的內容。BBED是一個針對Oracle的二進位制編譯工具。該工具不受Oracle支援,預設是不生成可執行檔案的,在使用錢需要重新編譯。

1)   編譯BBED

直接在Oracle 11gR2 的環境中編譯BBED,將收到以下錯誤資訊:

$ cd $ORACLE_HOME/rdbms/lib

$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

……

gcc: /u01/app/oracle/11.2.0/db_1/rdbms/lib/ssbbded.o: No such file or directory

gcc: /u01/app/oracle/11.2.0/db_1/rdbms/lib/sbbdpt.o: No such file or directory

Oracle 11gR2 環境中編譯BBED可執行檔案所需要的ssbbded.osbbdpt.o物件檔案被移除,不過可以從Oracle 10g環境中將這兩個檔案拷貝到Oracle 11g環境中進行編譯。

除了將上面的ssbbded.osbbdpt.o檔案拷貝到Oracle 11g環境外,BBED還需要用到$ORACLE_HOME/rdbms/mesg目錄下的bbedus.msgbbedus.msb兩個資訊檔案,這幾個檔案都需要從Oracle 10g中拷貝到Oracle 11g中對應的目錄中。下面是將以上4個檔案從Oracle 10g中拷貝到Oracle 11g對應目錄之後的編譯過程:

            $ cd $ORACLE_HOME/rdbms/lib

            $ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

            $ file bbed

            $ size bbed

            $ ldd bbed

            $ cp bbed $ORACLE_HOME/bin/

            $ cd /

            $ which bbed

             /u01/app/oracle/product/11.2.0/db_1/bin/bbed

            編譯成功後登入BBED,登入時需要密碼(預設密碼是:blockedit

            $ bbed

2)   BBED模擬表資料塊的損壞

a.        建立測試表

SQL> create table test.testbbed as select * from dba_tables;

b.        建立BBED引數檔案

由於BBED無法對ASM進行操作,所以這裡將表建立到ACFS檔案系統的儲存裝置上。這裡建立兩個BBED引數檔案,filelist.txt儲存要操作的資料檔案的ID和路徑,bbed.par儲存資料檔案的塊大小、filelist.txt的位置和操作模式:

$ more filelist.txt

6 /testbbed/tbtbs01.dbf

$ more bbed.par

blocksize=8192

listfile=filelist.txt

mode=edit

filelist.txt的內容可通過select file_idfile_name from dba_data_filesSQL查詢得到。

c.        BBED基本操作

ü   使用指定的引數檔案登入BBED

$ bbed parfile=bbed.par

ü  顯示BBED配置檔案中指定的資料檔案資訊:

BBED> info

ü  設定要操作的資料檔案:

BBED> set file 6

ü  顯示要操作的資料檔案的詳細資訊:

BBED> show

d.        模擬壞塊

修改檔案號為6的第136號塊:

BBED> modify 1000 file 6 block 136

如果修改錯誤,可以執行revert命令回滾。

e.        驗證壞塊

BBED執行以下命令驗證資料塊,發現block 136已經損壞

BBED> verify

f.         使用DBV工具驗證

使用DBV工具驗證發現file 6 block 136已經損壞

$ dbv file=/testbbed/tbtbs01.dbf blocksize=8192

g.        執行塊讀取操作

執行一個test.testbbed的全表掃描,收到ORA-01578錯誤

SQL> alter system flush buffer_cache;

SQL> select /*+FULL(T)*/ COUNT(1) FROM TEST.TESTBBED T;

3)   RMAN的塊恢復

塊介質恢復用來恢復一個單獨的塊或者資料檔案中資料塊的集合,如果是小資料量的資料丟失或損壞,而不是整個資料檔案,這種型別的恢復是很有用的。通常,塊損壞會在跟蹤檔案中報告錯誤資訊。

塊級別的資料丟失通常是由以下兩個原因造成的:

n   I/O錯誤引起的映象資料丟失。

n   記憶體損壞,重新整理到磁碟。

a.        使用RMAN BLOCKRECOVER命令的注意事項

n   目標資料庫必須在MOUNT或者OPEN狀態,如果執行某個資料檔案的塊介質恢復,那麼該資料檔案不能是離線狀態。

n   塊介質恢復不支援基於時間點的塊恢復。

n   只能在損壞的塊上執行塊介質恢復。

n   塊被標記為介質損壞之後是不能訪問的,直達恢復完成。

n   當使用備份的控制檔案載入資料庫時,不能執行塊的介質恢復。

n   必須有一個包含損壞塊檔案的全備份,塊介質恢復不能使用增量備份。

n   如果RMAN訪問塊介質恢復需要特定歸檔Redo日誌檔案失敗,那麼將執行還原FAILOVER,嘗試使用RMAN資料庫中列出的適合這個操作的所有其它備份,如果沒有合適的備份存在執行才會失敗。

n   資料檔案頭不能被恢復

n   不能在非歸檔模式下執行塊介質恢復。

b.        RMAN BLOCKRECOVER命令的使用方式

RMAN BLOCKRECOVER命令有以下三種使用方式:

方式1 使用BLOCKRECOVER CORRUPTION LIST命令恢復在V$DATABASE_BLOCK_CORRUPTION檢視中報告的所有塊:

RMAN> blockrecover corruption list;

方式2 使用BLOCKRECOVER 命令的時候指定檔案號和塊號:

RMAN> blockrecover datafile block ;

方式3 執行blockrecover命令的時候指定表空間和資料塊地址(DBA):

RMAN> blockrecover tablespace DBA ;

c.        RMAN BLOCKRECOVER使用的例子

例子1 恢復3個資料檔案的損壞塊:

RMAN> BLOCKRECOVER DATAFILE 2 BLOCK 12,13 DATAFILE 3 BLOCK 5,98,99 DATAFILE 4 BLOCK 19;

例子2:從資料檔案拷貝中還原、恢復一系列塊:

RMAN> RUN

{

BLOCKRECOVER DATAFILE 3 BLOCK 2,3,4,5 TABLESPACE sales DBA 4194405,4194409,4194412 from DATAFILECOPY;

}

例子3:從指定的tag備份總還原、恢復塊

RMAN> BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404,4194405 FROM TAG “weekly_backup”;

例子4:從用於恢復資料到兩天以前的備份中還原、恢復SYSTEM表空間中的兩個塊:

RMAN> BLOCKRECOVER TALBESPACE SYSTEM DBA 4194404,4194405 RESOTRE UNTILL TIME ‘sysdate-2’;

例子5:執行備份驗證資料庫,修復在V$DATABASE_BLOCK_CORRUPTION中記錄的所有損壞塊:

RMAN> BACKUP VALIDATE DATABASE;

RMAN> BLOCKRECOVER CORRUPTION LIST;

4)   確定損壞塊對應的物件

要確定一個損壞的物件需要知道AFN(Absolute File Numbe,絕對檔案號)BL(Block Number,塊號)AFNRFNRelative File Number,相對檔案號)通常是相同的,但是也可能不同(特別是如果資料庫從Oracle7遷移或者如果使用的是可傳輸、可插拔的表空間),獲得正確的AFNRFN就顯得非常重要,如果指定了錯誤的AFN將導致找不到物件或錯誤識別物件。

a.        確定AFNBL

方法1:從ORA-1578得到AFN

ORA-1578之後產生的ORA-1110錯誤提供AFN號碼。

方法2:從DBVERIFY輸出獲得AFN

通過使用DBV工具會報告損壞的塊,DBV工具通過提供與相關的RDBARFNBL資訊。

方法3:從RMAN獲得AFN

RMANV$DATABASE_BLOCK_CORRUPTION檢視報告損壞的塊。該檢視的欄位FILE#表示AFN,欄位BLOCK#表示BL

b.        定位損壞的物件

一旦AFN被識別,執行以下SQL語句定位損壞的物件:

SQL> select *

From DBA_EXTENTS

Where file_id=&AFN

And &BL BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS-1;

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

相關文章