Database Backup and Recovery Reference(block)

参考文献 http://docs.oracle.com/cd/B19306_01/backup.102/b14194/rcmsynta010.htm

检查报错日志信息如下图:

看报错日志,应该是数据文件损坏了,进oracle查看一下

1)以下步骤是针对一个block损坏的整个报错还原及修复步骤:

oracle备份恢复系列-使用RMAN工具修复数据库坏块的方法 
如果数据库库文件有备份 ,并且是可用的备份,oracle可以通过备份修复坏块。
0.修复过程是在线操作,不需要文件offline
1.修复是针对块级别,修复时间很短
2.修复命令使用blockrecover
4.可以同时修复多个文件的多个坏块
SQL> create tablespace userdata datafile 'E:\ORACLE\ORADATA\DB01\userdata01.dbf' size 1m;
表空间已创建。
SQL> conn buffer/oracle
已连接。
SQL> create table t as select * from dba_tables;
表已创建。
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
 
重要的是在这里要有备份
RMAN> backup datafile 6;
启动 backup 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=149 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00006 name=E:\ORACLE\ORADATA\DB01\USERDATA01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 23-3月 -08
通道 ORA_DISK_1: 已完成段 1 于 23-3月 -08
段句柄=E:\ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET\2008_03_23\O1_MF_NNNDF_TAG20080323T130137_3YCS1L2G_.BKP 标记=TAG2008
0323T130137 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> show user
USER 为 "BUFFER"
SQL> insert into t select * from t;
已创建1579行。
SQL> /
insert into t select * from t
            *
第 1 行出现错误:
ORA-01653: 表 BUFFER.T 无法通过 8 (在表空间 USERDATA 中) 扩展
SQL> commit;
提交完成。
SQL> select count(*) from t;
  COUNT(*)
----------
      3158
SQL> alter system checkpoint;
系统已更改。
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
使用ultra edit工具破坏6号文件
SQL> startup
ORACLE 例程已经启动。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             222301060 bytes
Database Buffers          381681664 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from buffer.t;
select count(*) from buffer.t
                            *
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 23)
ORA-01110: 数据文件 6: 'E:\ORACLE\ORADATA\DB01\USERDATA01.DBF'
 
oracle数据库RMAN工具在做备份的时候会检查坏块,如果发现的话 ,会记录到下面的视图中
SQL> desc v$database_block_corruption
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 FILE#                                                                      NUMBER
 BLOCK#                                                                     NUMBER
 BLOCKS                                                                     NUMBER
 CORRUPTION_CHANGE#                                                         NUMBER
 CORRUPTION_TYPE                                                            VARCHAR2(9)
SQL> select * from  v$database_block_corruption;
未选定行
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日 3月 23 13:05:32 2008
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
 
通过下面这条命令,并不是做一个备份 ,只是对文件做一次校验,当然也可以发现坏块
RMAN> backup validate datafile 6;
启动 backup 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=130 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00006 name=E:\ORACLE\ORADATA\DB01\USERDATA01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> select * from  v$database_block_corruption;
     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         6         23          1                  0 CHECKSUM
 
使用rman命令修复坏块
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
RMAN> blockrecover datafile 6 block 23;
启动 blockrecover 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=137 devtype=DISK
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00006 的块
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET\2008_03_23\O1_MF_NNNDF_TAG20080323T130137_3
YCS1L2G_.BKP
通道 ORA_DISK_1: 已从备份段 1 恢复块
段句柄 = E:\ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET\2008_03_23\O1_MF_NNNDF_TAG20080323T130137_3YCS1L2G_.BKP 标记 = TAG
20080323T130137
通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:01
正在开始介质的恢复
介质恢复完成, 用时: 00:00:03
完成 blockrecover 于
RMAN> exit
恢复管理器完成。
SQL> select count(*) from buffer.t;
  COUNT(*)
----------
      3158
 
坏块修复后,并不会更新v$database_block_corruption,需要下次备份的时候更新
SQL> select * from  v$database_block_corruption;
     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         6         23          1                  0 CHECKSUM
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日 3月 23 13:09:43 2008
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
RMAN> backup validate datafile 6;
启动 backup 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=132 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00006 name=E:\ORACLE\ORADATA\DB01\USERDATA01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> select * from  v$database_block_corruption;
未选定行

使用blockrecover 对有多全坏块的数据文件进行恢复步骤

使用blockrecover 对有坏块的数据文件进行恢复。

先做一个测试环境。
SQL> create tablespace tbs4 datafile '/oracle/oradata/pradb/tbs4.dbf' size 20m;

Tablespace created.


SQL> create table test_blk tablespace tbs4 as select * from dba_objects;

Table created.

SQL> select count(*) from test_blk;

COUNT(*)
----------
50720

到此做一个数据的全备份。
RMAN> run{
2> allocate channel dev1 type disk;
3> allocate channel dev2 type disk;
4> backup tag='db_full_back_200907011656' database;
5> release channel dev1;
6> release channel dev2;
7> }


为了保证数据文本版本的一致性,我把数据库关闭后模拟数据块的损坏。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

用二进制编辑器编辑数据文件tbs4.dbf,我用的是FlexHEX.
说明:用vi或windows下的notepad都会造成整个数据文件的损坏,不建议使用文本编辑器。
把数据文本下载到windows下,用FlexHEX打开后,在主编辑窗口修改几个数值,然后保存。
把原来的数据文件tbs4.dbf改名为tbs4_back.dbf.然后把编辑过的文件传回来。


SQL> startup
ORACLE instance started.

Total System Global Area 285212672 bytes
Fixed Size 1267044 bytes
Variable Size 155191964 bytes
Database Buffers 121634816 bytes
Redo Buffers 7118848 bytes
Database mounted.
Database opened.

数据块有损坏,在启动过程中不会有任何错误提示。
但是我们在对驻留在该文件中的表做查询时就会报错:
SQL> select count(*) from test_blk;
select count(*) from test_blk
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 14, block # 56)
ORA-01110: data file 14: '/oracle/oradata/pradb/tbs4.dbf'

根据提示我们发现该文件有数据块损坏。
我们用dbv实用程序对该文件做数据块的检验:
[oracle@ceedb pradb]$ dbv file=tbs4.dbf blocksize=8192

DBVERIFY: Release 10.2.0.4.0 - Production on Wed Jul 1 17:14:03 200

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

DBVERIFY - Verification starting : FILE = tbs4.dbf
Page 56 is marked corrupt
Corrupt block relative dba: 0x03800038 (file 14, block 56)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x03800038
last change scn: 0x0000.003598ce seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x98ce0601
check value in block header: 0xd1d8
computed block checksum: 0x2400

Page 107 is marked corrupt
Corrupt block relative dba: 0x0380006b (file 14, block 107)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x0380006b
last change scn: 0x0000.003598e2 seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x98e20601
check value in block header: 0x4b8b
computed block checksum: 0x3364

Page 276 is marked corrupt
Corrupt block relative dba: 0x03800114 (file 14, block 276)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x03800114
last change scn: 0x0000.003598eb seq: 0x2 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x98eb0602
check value in block header: 0x384c
computed block checksum: 0x202d

Page 517 is marked corrupt
Corrupt block relative dba: 0x03800205 (file 14, block 517)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x03800205
last change scn: 0x0000.003598f3 seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x98f30601
check value in block header: 0xab3e
computed block checksum: 0x2d20



DBVERIFY - Verification complete

Total Pages Examined : 2560
Total Pages Processed (Data) : 693
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 28
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 1835
Total Pages Marked Corrupt : 4
Total Pages Influx : 0
Highest block SCN : 3512569 (0.3512569)

可见有4个块损坏。分别是56,107,276,517块。

我们还可以用
RMAN> backup validate database;
对数据库中的坏块进行验证。
RMAN> backup validate database;

Starting backup at 01-JUL-09
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=133 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/oracle/oradata/pradb/system01.dbf
input datafile fno=00003 name=/oracle/oradata/pradb/sysaux01.dbf
input datafile fno=00007 name=/oracle/oradata/pradb/idx_tbs.dbf
input datafile fno=00005 name=/oracle/oradata/pradb/example01.dbf
input datafile fno=00011 name=/oracle/oradata/pradb/PRADB/datafile/o1_mf_tbs2_52hhn82h_.dbf
input datafile fno=00008 name=/oracle/oradata/pradb/undo2.dbf
input datafile fno=00009 name=/oracle/oradata/pradb/audit_tab.dbf
input datafile fno=00010 name=/oracle/oradata/pradb/audit_idx.dbf
input datafile fno=00002 name=/oracle/oradata/pradb/tbs_test02.dbf
input datafile fno=00006 name=/oracle/oradata/pradb/tbs_test01.dbf
input datafile fno=00012 name=/oracle/oradata/pradb/testtbs.dbf
input datafile fno=00014 name=/oracle/oradata/pradb/tbs4.dbf
input datafile fno=00013 name=/oracle/oradata/pradb/test3.dbf
input datafile fno=00004 name=/oracle/oradata/pradb/users01.dbf

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
Finished backup at 01-JUL-09

检验后我们查 V$DATABASE_BLOCK_CORRUPTION
SQL> select * from v$database_block_corruption;

FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
14 276 1 0 CHECKSUM
14 517 1 0 CHECKSUM
14 107 1 0 CHECKSUM
14 56 1 0 CHECKSUM


刚才那些坏块都被列入到了视图V$DATABASE_BLOCK_CORRUPTION中。

为了不影响业务的运行,通过RMAN使用oracle BMR(Block Media Recover).
BMR可以比使用restore database节省大量的宕机时间,在恢复期间只有坏块的文件不可访问,而
其他可以继续访问。


RMAN> blockrecover datafile 14 block 56,107,276,517;

Starting blockrecover at 01-JUL-09
using channel ORA_DISK_1

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00014
channel ORA_DISK_1: reading from backup piece /oracle/flash_recovery_area/PRADB/backup...
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/oracle/flash_recovery_area/PRADB/backupset/2009_07_01/o1_mf_nnndf_DB_FUL...
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:04

starting media recovery
media recovery complete, elapsed time: 00:00:04

Finished blockrecover at 01-JUL-09


还可以通过RMAN> blockrecover corruption list进行块的恢复,这是在大量块损坏时或全部块损坏时使用,
前提是先执行RMAN>backup validate database,在V$DATABASE_BLOCK_CORRUPTION里有对应的坏块的列表。
RMAN> blockrecover corruption list;

Starting blockrecover at 01-JUL-09
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished blockrecover at 01-JUL-09


恢复完成后,我们进行一下验证
[oracle@ceedb pradb]$ dbv file=tbs4.dbf blocksize=8192

DBVERIFY: Release 10.2.0.4.0 - Production on Wed Jul 1 17:31:19 2009

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

DBVERIFY - Verification starting : FILE = tbs4.dbf


DBVERIFY - Verification complete

Total Pages Examined : 2560
Total Pages Processed (Data) : 697
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 28
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 1835
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 3512569 (0.3512569)

没有报告坏块。
再对test_blk执行查询
SQL> select count(*) from test_blk;

COUNT(*)
----------
50720

可见恢复成功。

blockrecover corruption list;  





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28590132/viewspace-1669638/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28590132/viewspace-1669638/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值