-轉載-使用Oracle9i的blockrecover新特性修復資料庫中的壞塊

yyp2009發表於2012-05-15
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>


連結:

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

相關文章