ORACLE RMAN针对坏块的修复技巧

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638    QQ号:47079569    邮箱:service@parnassusdata.com

 

损坏块的RMAN

在这种情况下,我们的数据库管理员Bob决定使用RMAN的块多媒体功能只恢复数据文件的损坏块。 

首先,Bob检查了为本次损坏生成的alert.log 文件和一个跟踪文件,如下:

Hex dump of (file 4, block 76) in trace filec:\oracle\product\10.2.0\admin\db1\udump\db1_ora_2968.trc
Corrupt block relative dba: 0x0100004c (file 4, block 76)
Bad check value found during buffer read
Data in bad block:
type: 6 format: 2 rdba: 0x0100004c
last change scn: 0x0000.00086aeb seq: 0x3 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x6aeb0603
check value in block header: 0xa13a
computed block checksum: 0xb
Reread of rdba: 0x0100004c (file 4, block 76) found same corrupted data

通过打开写入到alert.log文件带有扩展名 .trc的跟踪文件,他获得更多信息:

Corrupt block relative dba: 0x0100004c (file 4, block 76)
Bad check value found during buffer read
Data in bad block:
type: 6 format: 2 rdba: 0x0100004c
last change scn: 0x0000.00086aeb seq: 0x3 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x6aeb0603
check value in block header: 0xa13a
computed block checksum: 0xb
Reread of rdba: 0x0100004c (file 4, block 76) found same corrupted data

为了获得更多信息,Bob 使用 dbv (dbverify) 实用工具获得所有损坏块的列表:

C:\>dbv file=c:\oracle\product\10.2.0\oradata\db1\users01.dbf
DBVERIFY: Release 10.2.0.1.0 – Production on Sat Oct 17 20:50:00 2015
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY – Verification starting : FILE =c:\oracle\product\10.2.0\oradata\db1\USERS01.DBF
Page 76 is marked corrupt
Corrupt block relative dba: 0x0100004c (file 4, block 76)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x0100004c
last change scn: 0x0000.00086aeb seq: 0x3 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x6aeb0603
check value in block header: 0xa13a
computed block checksum: 0xb

DBVERIFY – Verification complete
Total Pages Examined         : 640
Total Pages Processed (Data) : 29
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 2
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 35
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 573
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 0
Highest block SCN            : 551659 (0.551659)
C:\>

从上面的结果可以看出, Bob只有一个损坏块。

注释:如果损坏的数据块的数量不是太大,然后使用BLOCK RECOVER命令并指定损坏的块,如果有很多损坏的块我们不想 一一指定,那么你有另一个选择,运行backup backup validate命令之后运行 blockrecover corruption list命令,一旦开始运行这些命令中的一个,  v$database_block_corruption 视图就会被一系列损坏数据块填充。

然后Bob 运行了 backup validate命令,填充了v$database_block_corruption 视图:

SQL>
select * from
v$database_block_corruption;
no rows selected

RMAN> backup validate datafile 4;

SQL>
select * from
v$database_block_corruption;

FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
———- ———- ———- —————— ———
4         76          1                  0 CHECKSUM

Bob使用第一种方法,通过运行 blockrecover 命令恢复损坏的块,如下:

RMAN> blockrecover datafile 4 block 76;

Starting blockrecover at 17-OCT-09
using target database control file instead of recovery catalog

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00004
channel ORA_DISK_1: reading from backup piece
C:\ORACLE\product\10.2.0\flash_recovery_area\db1\backupset\2009_10_17\
o1_mf_nnndf_tag20091017t163201_5fmbsl9r_.bkp
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:02

starting media recovery
archive log thread 1 sequence 3 is already on disk as file
C:\ORACLE\product\10.2.0\flash_recovery_area\db1\archivelog\2009_10_17\
o1_mf_1_3_5fmbtrk2_.arc
………………
………………
media recovery complete, elapsed time: 00:00:01
Finished blockrecover at 17-OCT-09
RMAN>
SQL>
select * from
test_corruption;

STR
———-
Test

该命令从备份复原了具体的数据块,通过应用归档重做日志文件恢复数据文件。

注释:  blockrecover 不再在 Oracle 11g中使用,块恢复的新的句法是recover?datafile?

损坏数据块的RMAN

恢复该块的另一个选择是运行 blockrecover corruption list命令,该命令恢复写入到v$database_block_corruption视图的所有损坏数据块,从Oracle 11g开始,当任何进程或数据库实用工具遇到数据块损坏时v$database_block_corruption视图得到更新,另外,你可以使用validate datafile block 命令在具体的数据文件中验证特定的块。

这里, Bob 尝试使用该命令恢复损坏的块,如下:

RMAN> blockrecover corruption list;
restoring blocks of datafile 00004
……
……
starting media recovery
Finished blockrecover at 17-OCT-09

SQL>
select * from
test_corruption;

STR
———-
Test

正如我们看到的, blockrecover corruption list 命令恢复了所有损坏的数据块。

恢复多个数据文件的多个块是有可能的,使用表空间名和数据块地址 (DBA)恢复数据块也是有可能的,为进行检验,我们创建两个表空间和三个表,损坏所有的表,然后使用不同的方法恢复它们。

创建两个表空间和三个表:

 SQL>
create
tablespace tbs_one datafile ‘c:\tbs_one.dbf’ SIZE 1M;
Tablespace created.

SQL>
create
tablespace tbs_two datafile ‘c:\tbs_two.dbf’ size 1M;0
Tablespace created.

SQL>
create
table tbl_one (str varchar2(10)) tablespace users;
Table created.

SQL>
drop
table tbl_one;
Table dropped.

SQL>
create
table tbl_one (str varchar2(10)) tablespace  tbs_one;
Table created.

SQL>
create
table tbl_two (str varchar2(10)) tablespace tbs_two;
Table created.

SQL>
create
table tbl_three (str varchar2(10)) tablespace users;
Table created.

SQL>
insert into
tbl_one values(‘test’);
1 row created.

SQL> insert into
tbl_two values(‘test’);
1 row created.

SQL>
insert into
tbl_three values(‘test’);
1 row created.

SQL> commit;
Commit complete.
SQL>

RMAN> backup database plus archivelog;

你已经创建了带有三个表的表空间并备份了整个数据库,现在我们通过在十六进编辑器中打开并改变行的第一个字母(字母t)损坏三个所有的数据文件,保存文件并编辑。

为了查看损坏,从RMAN 运行backup validate database命令,检查 v$database_block_corrupton视图。

RMAN> backup validate database;

SQL>
select * from
v$database_block_corruption;

FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTION
———- ———- ———- —————— ———-
5         13          1                  0 CHECKSUM
6         13          1                  0 CHECKSUM
4         69          1                  0 CHECKSUM

SQL>
select * from
tbl_one;

STR
———-
test

SQL> select * from
tbl_two;

STR
———-
test

SQL> select * from
tbl_three;
STR
———-
test

在这里,虽然你已经损坏了数据文件,但是你还是可以查询表,事实上,从数据库高速缓存缓冲区查询的行不是从数据文件,如果你刷新高速缓存缓冲区,你将不能查询表,因为现在我们直接从数据文件查询。

SQL> alter
system flush buffer_cache;
System altered.

SQL> select * from
tbl_one;
select * from tbl_one
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 13)
ORA-01110: data file 5: ‘c:\tbs_one.dbf’

SQL> select * from
tbl_two;
select * from tbl_two
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 13)
ORA-01110: data file 6: ‘c:\tbs_two.dbf’

SQL> select * from
tbl_three;
select * from tbl_three
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 69)
ORA-01110: data file 4:
‘C:\ORACLE\product\10.2.0\oradata\db1\users01.dbf’
SQL>

现在铜鼓在一个命令行中使用数据文件参数恢复前两个表空间,使用表空间参数会恢复第三个表空间,现在恢复所有的损坏数据块

RMAN> blockrecover datafile 5 block 13 datafile 6 block 13;
Starting blockrecover at 18-OCT-09
restoring blocks of datafile 00005
restoring blocks of datafile 00006
…………
…………
starting media recovery
media recovery complete, elapsed time: 00:00:03
Finished blockrecover at 18-OCT-09
RMAN>

正如显示的那样,使用一个命令恢复了两个不同的数据文件,现在使用有关写入到 alert.log文件的数据块地址 (DBA)的信息,恢复第三个表空间,这是 来自 alert.log文件的信息:

Hex dump of (file 4, block 69) in trace filec:\oracle\product\10.2.0\admin\db1\udump\db1_ora_2460.trc
Corrupt block relative dba: 0x01000045 (file 4, block 69)
Bad check value found during buffer read
Data in bad block:
type: 6 format: 2 rdba: 0x01000045
last change scn: 0x0000.00086381 seq: 0x3 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x63810603
check value in block header: 0xca6
computed block checksum: 0x56
Reread of rdba: 0x01000045 (file 4, block 69) found same corrupted data
Sun Oct 18 14:59:27 2015
Corrupt Block Found
tsn = 4, tsname = users
rfn = 4, blk = 69, rdba = 16777285
objn = 51349, objd = 51349, object = tbl_three, subobject =
segment owner = sys, segment type = Table Segment
Sun Oct 18 15:18:11 2015

损坏块的数据块号是16777285 ,它存在于用户表空间上,现在使用这些值,恢复损坏块,如下:

RMAN> blockrecover tablespace users dba 16777285;
Starting blockrecover at 18-OCT-09
using channel ORA_DISK_1
…………..
…………..
Finished blockrecover at 18-OCT-09
RMAN>

接下来,使用下列命令查询表,已检查损坏数据库块是否得以恢复:

SQL> select * from
tbl_one
2  union all
3  select * from
tbl_two
4  union all
5  select * from
tbl_three;

STR
———-
test
test
test
SQL>

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号