分享

使用oracle10g blockrecover恢复数据库坏块

 wghbeyond 2012-04-09

使用oracle10g blockrecover恢复数据库坏块

SQL> create tablespace block_rec;
表空间已创建。

SQL> select name from v$datafile;
NAME
-------------------------------------------------------------------------------
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_OMF_TEST_326SNC34_.DBF
+DG1/ora10g/datafiles/asmtbs01.dbf
G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF
已选择7行。

SQL> select file#,name from v$datafile;
FILE#  NAME
-------------------------------------------------------------------------------
     G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
     G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF
     G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
     G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
     G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_OMF_TEST_326SNC34_.DBF
     +DG1/ora10g/datafiles/asmtbs01.dbf
     G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF
已选择7行。

SQL> alter database datafile 7 resize 1m;
数据库已更改。

SQL> create user block_rec identified by "block_rec"
  temporary tablespace temp
  default tablespace block_rec
  quota unlimited on block_rec;
用户已创建。

SQL> grant resource,connect to block_rec;
授权成功。

SQL> conn block_rec/block_rec@ora10g;
已连接。
SQL> create table t(a number);

表已创建。

SQL> begin
  for x in 1..1000 loop
  insert into t values(x);
  commit;
  end loop;
  end;
  /

PL/SQL 过程已成功完成。
SQL> select count(*) from t;

  COUNT(*)
----------
      1000

备份当前数据库:
C:\Documents and Settings\linyuefeng>rman target / nocatalog

恢复管理器: Release 10.2.0.1.0 - Production on 星期六 4月 21 16:54:29 2007

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到目标数据库: ORA10G (DBID=3937140947)
使用目标数据库控制文件替代恢复目录

RMAN> backup as backupset database plus archivelog tag='fulldatabase';
启动 backup 于 21-4月 -07
当前日志已存档
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=85 devtype=DISK
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =1 记录 ID=6 时间戳=620258970
输入存档日志线程 =1 序列 =2 记录 ID=7 时间戳=620424206
输入存档日志线程 =1 序列 =3 记录 ID=8 时间戳=620486944
输入存档日志线程 =1 序列 =4 记录 ID=9 时间戳=620497466
输入存档日志线程 =1 序列 =5 记录 ID=10 时间戳=620497621
输入存档日志线程 =1 序列 =6 记录 ID=11 时间戳=620497719
输入存档日志线程 =1 序列 =7 记录 ID=12 时间戳=620499360
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\07IFO4D2_1_1 标记=FULLDATABASE 注
释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:09
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =10 记录 ID=1 时间戳=620168764
输入存档日志线程 =1 序列 =11 记录 ID=2 时间戳=620170149
输入存档日志线程 =1 序列 =12 记录 ID=3 时间戳=620172357
输入存档日志线程 =1 序列 =13 记录 ID=4 时间戳=620174799
输入存档日志线程 =1 序列 =14 记录 ID=5 时间戳=620175861
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\08IFO4DB_1_1 标记=FULLDATABASE 注
释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:08
完成 backup 于 21-4月 -07

启动 backup 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF

输入数据文件 fno=00003 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF

输入数据文件 fno=00005 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_OMF_TEST_326
SNC34_.DBF
输入数据文件 fno=00006 name=+DG1/ora10g/datafiles/asmtbs01.dbf
输入数据文件 fno=00002 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DB
F
输入数据文件 fno=00004 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
输入数据文件 fno=00007 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\09IFO4DL_1_1 标记=TAG20070421T1656
20 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:16
完成 backup 于 21-4月 -07

启动 backup 于 21-4月 -07
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =8 记录 ID=13 时间戳=620499458
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\0AIFO4G2_1_1 标记=FULLDATABASE 注
释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 21-4月 -07

启动 Control File and SPFILE Autobackup 于 21-4月 -07
段 handle=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\C-3937140947-20070421-02 commen
t=NONE
完成 Control File and SPFILE Autobackup 于 21-4月 -07

SQL> insert into t select * from t;

已创建1000行。

SQL> insert into t select * from t;

已创建2000行。

SQL> insert into t select * from t;

已创建4000行。

SQL> commit;

提交完成。

使用EDIT编辑数据文件
G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF,然后保存。
SQL> alter system flush buffer_cache;
SQL> conn block_rec/block_rec@ora10g;
已连接。
SQL> select count(*) from t;
select count(*) from t
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 15)
ORA-01110: 数据文件 7:
'G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF'
在ALERT.LOG文件中也会记载:
Corrupt block relative dba: 0x01c0000f (file 7, block 15)
Bad check value found during buffer read
Data in bad block:
 type: 6 format: 2 rdba: 0x01c0000f
 last change scn: 0x0000.000e92e9 seq: 0x3 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x92e90603
 check value in block header: 0xcf7e
 computed block checksum: 0x74c8
Reread of rdba: 0x01c0000f (file 7, block 15) found same corrupted data
Sat Apr 21 17:16:32 2007
Corrupt Block Found
         TSN = 9, TSNAME = BLOCK_REC
         RFN = 7, BLK = 15, RDBA = 29360143
         OBJN = 51507, OBJD = 51507, OBJECT = T, SUBOBJECT =
         SEGMENT OWNER = BLOCK_REC, SEGMENT TYPE = Table Segment
可以用DBV进行检查:
C:\Documents and Settings\linyuefeng>dbv file=G:\oracle\oradata\ORA10G\DATAFILE\
O1_MF_BLOCK_RE_32MMQWTH_.DBF blocksize=8192

DBVERIFY: Release 10.2.0.1.0 - Production on 星期六 4月 21 17:23:44 2007

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - 开始验证: FILE = G:\oracle\oradata\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
页 12 标记为损坏
Corrupt block relative dba: 0x01c0000c (file 7, block 12)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c0000c
 last change scn: 0x0000.000e9956 seq: 0x1 flg: 0x06
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x99560601
 check value in block header: 0x90b7
 computed block checksum: 0x56ad

页 15 标记为损坏
Corrupt block relative dba: 0x01c0000f (file 7, block 15)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c0000f
 last change scn: 0x0000.000e92e9 seq: 0x3 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x92e90603
 check value in block header: 0xcf7e
 computed block checksum: 0xaeec

 

DBVERIFY - 验证完成

检查的页总数: 128
处理的页总数 (数据): 11
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 11
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 104
标记为损坏的总页数: 2
流入的页总数: 0
最高块 SCN            : 956758 (0.956758)

也可以使用RMAN进行检查,然后相关的坏块记录会记录到v$database_block_corruption中:
SQL> select * from v$database_block_corruption where file#=7;
未选定
RMAN> backup validate datafile 7;
启动 backup 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00007 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 21-4月 -07
SQL> select * from v$database_block_corruption where file#=7;
FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
----- ---------- ---------- ------------------ ---------
           12                          0 CHECKSUM
           15                          0 CHECKSUM

进行恢复:
RMAN> blockrecover datafile 7 block 12,15;

启动 blockrecover 于 21-4月 -07
使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00007 的块
通道 ORA_DISK_1: 正在读取备份段 G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\09IFO4DL_
1_1
通道 ORA_DISK_1: 已从备份段 1 恢复块
段句柄 = G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\09IFO4DL_1_1 标记 = TAG20070421T
165620
通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:02

正在开始介质的恢复
介质恢复完成, 用时: 00:00:03

完成 blockrecover 于 21-4月 -07
查看数据:
SQL> select count(*) from t;

  COUNT(*)
----------
      8000

SQL> select * from v$database_block_corruption where file#=7;

FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
----- ---------- ---------- ------------------ ---------
           12                          0 CHECKSUM
        15                          0 CHECKSUM
RMAN> backup validate datafile 7;

启动 backup 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00007 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 21-4月 -07

SQL> select * from v$database_block_corruption where file#=7;

未选定行
SQL> drop user block_rec cascade;

用户已删除。

SQL> drop tablespace block_rec including contents and datafiles;

表空间已删除。
最好再进行一次全备份。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约