使用Oracle9i的blockrecover新特性修復數據庫中的壞塊
2024-08-29 13:37:20
供稿:網友
 
             
  1.備份數據庫
  
  D:/>rman target /
  
  恢復治理器: 版本9.2.0.6.0 - PRodUCtion
  
  Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
  
                                                                                              連接到目標數據庫: EYGLE (DBID=1365961916)
  
  RMAN> backup database format='d:/oradata/eygle_fullbk.bak' tag='eygle';
  
  啟動 backup 于 12-6月 -05
  
  正在使用目標數據庫控制文件替代恢復目錄
  
  分配的通道: ORA_DISK_1
  
  通道 ORA_DISK_1: sid=13 devtype=DISK
  
  通道 ORA_DISK_1: 正在啟動 full 數據文件備份集
  
  通道 ORA_DISK_1: 正在指定備份集中的數據文件
  
  在備份集中包含當前的 SPFILE
  
  備份集中包括當前控制文件
  
  輸入數據文件 fno=00001 name=D:/ORADATA/EYGLE/SYSTEM01.DBF
  
  輸入數據文件 fno=00005 name=D:/ORADATA/EYGLE/UNDOTBS2.DBF
  
  輸入數據文件 fno=00002 name=D:/ORADATA/EYGLE/EYGLE01.DBF
  
  通道 ORA_DISK_1: 正在啟動段 1 于 12-6月 -05
  
  通道 ORA_DISK_1: 已完成段 1 于 12-6月 -05
  
  段 handle=D:/ORADATA/EYGLE_FULLBK.BAK comment=NONE
  
  通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:27
  
  完成 backup 于 12-6月 -05
  
  RMAN> list backup;
  
  備份集列表
  ===================
  
  BS 要害字 類型 LV 大小    設備類型 經過時間 完成時間
  ------- ---- -- ---------- ----------- ------------ ----------
  2    Full  140M    DISK    00:00:22   12-6月 -05
  
  BP 要害字: 1  狀態: AVAILABLE  標記:TAG20050612T004442
  
  段名:D:/ORADATA/EYGLE_FULL.BAK
  
   包含的 SPFILE: 修改時間: 04-3月 -05
  
   備份集 2 中的數據文件列表
  
   文件 LV 類型 Ckp SCN  Ckp 時間  名稱
   ---- -- ---- ---------- ---------- ----
   1    Full 452236   12-6月 -05 D:/ORADATA/EYGLE/SYSTEM01.DBF
   2    Full 452236   12-6月 -05 D:/ORADATA/EYGLE/EYGLE01.DBF
   5    Full 452236   12-6月 -05 D:/ORADATA/EYGLE/UNDOTBS2.DBF
  
  BS 要害字 類型 LV 大小    設備類型 經過時間 完成時間
  ------- ---- -- ---------- ----------- ------------ ----------
  4    Full  140M    DISK    00:00:21   12-6月 -05
  
  BP 要害字: 2  狀態: AVAILABLE  標記:EYGLE
  
  段名:D:/ORADATA/EYGLE_FULLBK.BAK
  
   包含的 SPFILE: 修改時間: 04-3月 -05
  
   備份集 4 中的數據文件列表
  
   文件 LV 類型 Ckp SCN  Ckp 時間  名稱
   ---- -- ---- ---------- ---------- ----
   1    Full 492975   12-6月 -05 D:/ORADATA/EYGLE/SYSTEM01.DBF
   2    Full 492975   12-6月 -05 D:/ORADATA/EYGLE/EYGLE01.DBF
   5    Full 492975   12-6月 -05 D:/ORADATA/EYGLE/UNDOTBS2.DBF
  
  RMAN> exit
  
  恢復治理器完成。
  
  2.使用工具破壞數據塊
  
  可以使用UltraEdit或者WinHex打開文件修改某個數據塊,然后保存。
                         
  
  3.訪問損壞的數據
  
  D:/>sqlplus "/ as sysdba"
  
  SQL*Plus: Release 9.2.0.6.0 - Production on 星期日 6月 12 09:06:19 2005
  
  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
  
  已連接到空閑例程。
  
  09:06:19 SQL> startup
  ORACLE 例程已經啟動。
  
  Total System Global Area  59842188 bytes
  Fixed Size          454284 bytes
  Variable Size       33554432 bytes
  Database Buffers      25165824 bytes
  Redo Buffers         667648 bytes
  
  數據庫裝載完畢。
  
  數據庫已經打開。
  
  09:06:33 SQL> select count(*)from t;
  select count(*)from t
            *
  ERROR 位于第 1 行:
  ORA-01578: ORACLE 數據塊損壞(文件號2,塊號14)
  
  ORA-01110: 數據文件 2: 'D:/ORADATA/EYGLE/EYGLE01.DBF'
  
  此時alert_.log文件中會記錄損壞塊。
  ***
  Corrupt block relative dba: 0x0080000e (file 2, block 14)
  Bad check value found during buffer read
  Data in bad block -
   type: 6 format: 2 rdba: 0x0080000e
   last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
   consistency value in tail: 0x85840601
   check value in block header: 0xca4b, computed block checksum: 0x5a6
   spare1: 0x0, spare2: 0x0, spare3: 0x0
  ***
  Reread of rdba: 0x0080000e (file 2, block 14) found same corrupted data
  
  4.檢查壞塊
  
  也可以使用RMAN驗證數據文件,以發現壞塊:
  
  D:/>rman target /
  
  恢復治理器: 版本9.2.0.6.0 - Production
  
  Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
  
  連接到目標數據庫: EYGLE (DBID=1365961916)
  
  RMAN> backup validate datafile 2;
  
  啟動 backup 于 12-6月 -05
  
  正在使用目標數據庫控制文件替代恢復目錄
  
  分配的通道: ORA_DISK_1
  
  通道 ORA_DISK_1: sid=13 devtype=DISK
  
  通道 ORA_DISK_1: 正在啟動 full 數據文件備份集
  
  通道 ORA_DISK_1: 正在指定備份集中的數據文件
  
  輸入數據文件 fno=00002 name=D:/ORADATA/EYGLE/EYGLE01.DBF
  
  通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
  
  完成 backup 于 12-6月 -05
  
  RMAN> exit
  
  恢復治理器完成。
  
  此時alert_.log文件中會記錄RMAN發現的壞塊信息:
  ***
  Corrupt block relative dba: 0x0080000e (file 2, block 14)
  Bad check value found during backing up datafile
  Data in bad block -
   type: 6 format: 2 rdba: 0x0080000e
   last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
   consistency value in tail: 0x85840601
   check value in block header: 0xca4b, computed block checksum: 0x5a6
   spare1: 0x0, spare2: 0x0, spare3: 0x0
  ***
  Reread of blocknum=14, file=D:/ORADATA/EYGLE/EYGLE01.DBF. found same corrupt data
  
  5.查詢RMAN發現的壞塊信息
  
  09:08:25 SQL> select * from v$database_block_corruption where file#=2;
  
     FILE#   BLOCK#   BLOCKS CORRUPTION_CHANGE# CORRUPTIO
  ---------- ---------- ---------- ------------------ ---------
       2     14     1         0 FRACTURED
  
  已用時間: 00: 00: 00.00
  
  6.執行恢復
  
  D:/>rman target /
  
  恢復治理器: 版本9.2.0.6.0 - Production
  
  Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
  
  已連接到目標數據庫 (未啟動)
  
  RMAN> startup mount;
  
  Oracle 例程已啟動
  
  數據庫已加載
  
  系統全局區域總計       59842188 字節
  
  Fixed Size           454284 字節
  Variable Size         33554432 字節
  Database Buffers       25165824 字節
  Redo Buffers          667648 字節
  
  RMAN> blockrecover datafile 2 block 14 from backupset;
  
  啟動 blockrecover 于 12-6月 -05
  
  正在使用目標數據庫控制文件替代恢復目錄
  
  分配的通道: ORA_DISK_1
  
  通道 ORA_DISK_1: sid=11 devtype=DISK
  
  通道 ORA_DISK_1: 正在恢復塊
  
  通道 ORA_DISK_1: 正在指定要從備份集恢復的塊
  
  正在恢復數據文件 00002 的塊
  
  通道 ORA_DISK_1: 已從備份段 1 恢復塊
  
  段 handle=D:/ORADATA/EYGLE_FULLBK.BAK tag=EYGLE params=NULL
  
  通道 ORA_DISK_1: 塊恢復已完成
  
  正在開始介質的恢復
  
  完成介質的恢復
  
  完成 blockrecover 于 12-6月 -05
  
  7.檢查數據的恢復
  
  D:/>sqlplus "/ as sysdba"
  
  SQL*Plus: Release 9.2.0.6.0 - Production on 星期日 6月 12 09:10:55 2005
  
  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
  
  連接到:
  
  Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
  With the Partitioning, OLAP and Oracle Data Mining options
  JServer Release 9.2.0.6.0 - Production
  
  09:10:55 SQL> alter database open;
  
  數據庫已更改。
                         
  
  已用時間: 00: 00: 07.01
  09:11:08 SQL> select * from v$database_block_corruption where file#=2;
  
     FILE#   BLOCK#   BLOCKS CORRUPTION_CHANGE# CORRUPTIO
  ---------- ---------- ---------- ------------------ ---------
       2     14     1         0 FRACTURED
  
  已用時間: 00: 00: 00.01
  09:11:12 SQL> select count(*) from t;
  
   COUNT(*)
  ----------
      896
  
  已用時間: 00: 00: 00.00
  
  此時數據已經恢復,但是block corruption信息仍然記錄在數據庫中,直到下次validate才會清除這部分信息:
  D:/>rman target /
  
  恢復治理器: 版本9.2.0.6.0 - Production
  
  Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
  
  連接到目標數據庫: EYGLE (DBID=1365961916)
  
  RMAN> backup validate datafile 2;
  
  啟動 backup 于 12-6月 -05
  
  正在使用目標數據庫控制文件替代恢復目錄
  
  分配的通道: ORA_DISK_1
  
  通道 ORA_DISK_1: sid=9 devtype=DISK
  
  通道 ORA_DISK_1: 正在啟動 full 數據文件備份集
  
  通道 ORA_DISK_1: 正在指定備份集中的數據文件
  
  輸入數據文件 fno=00002 name=D:/ORADATA/EYGLE/EYGLE01.DBF
  
  通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
  
  完成 backup 于 12-6月 -05
  
  RMAN>
  
  此時從數據庫中查詢,壞塊信息被清除。
  
  09:11:22 SQL> select * from v$database_block_corruption where file#=2;
  
  未選定行
  
  已用時間: 00: 00: 00.00
  09:12:28 SQL>