ORACLE 坏块的模拟和查看
阅读原文时间:2023年07月11日阅读:1

坏块的模拟和查看
使用bbed工具修改数据文件的块,然后使用dbv和rman工具查看坏块。

1.创建数据:根据dbv查看没有坏块Total Pages Marked Corrupt : 0
create table bbed (id number,name varchar2(20)) tablespace MNT_TBS;
insert into bbed values(1,'zhaoxu');
insert into bbed values(1,'kingle');
commit;

[oracle@test bbed]$ dbv userid=sys/oracle file=/u02/app/oracle/oradata/test/mnt_tbs.dbf

DBVERIFY: Release 10.2.0.5.0 - Production on Tue Sep 28 15:46:52 2021

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

DBVERIFY - Verification starting : FILE = /u02/app/oracle/oradata/test/mnt_tbs.dbf
DBVERIFY - Verification complete

Total Pages Examined : 60672
Total Pages Processed (Data) : 43587
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 13993
Total Pages Failing (Index): 0
Total Pages Processed (Other): 1014
Total Pages Processed (Seg) : 228
Total Pages Failing (Seg) : 0
Total Pages Empty : 1850
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 1390345 (0.1390345)

2.寻找数据块位置:查看表中数据所在数据文件号和块
select id,name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from bbed;
ID NAME FILE# BLOCK#
---------- -------------------- ---------- ----------
1 zhaoxu 6 57244
1 kingle 6 57244

BBED连接数据库(bbed默认密码为blockedit)
/*bbed不能直接操作封装在ASM里面的数据文件,所以需要将对应的数据文件转存出来。
bbed password=blockedit parfile=bbed.par

vi bbed.par
blocksize=8192
listfile=/home/oracle/bbed/filelist.txt
mode=edit

vi filelist.txt
/u02/app/oracle/oradata/test/mnt_tbs.dbf
*/

[oracle@test bbed]$ bbed password=blockedit parfile=bbed.par

BBED: Release 2.0.0.0.0 - Limited Production on Tue Sep 28 15:44:58 2021

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

************* !!! For Oracle Internal Use only !!! ***************

BBED> set filename /u02/app/oracle/oradata/test/mnt_tbs.dbf
BBED-00202: invalid parameter (/)

BBED> set filename '/u02/app/oracle/oradata/test/mnt_tbs.dbf'
FILENAME /u02/app/oracle/oradata/test/mnt_tbs.dbf

BBED> map
File: /u02/app/oracle/oradata/test/mnt_tbs.dbf (0)
Block: 1 Dba:0x00000000
------------------------------------------------------------
Data File Header

struct kcvfh, 676 bytes @0

ub4 tailchk @8188

BBED> show all
FILE# 0
BLOCK# 1
OFFSET 0
DBA 0x00000000 (0 0,1)
FILENAME /u02/app/oracle/oradata/test/mnt_tbs.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/bbed/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No

BBED> set dba 6,57244
DBA 0x0180df9c (25223068 6,57244)

BBED> find /c kingle --这就是我们找到的字符位置
File: /u02/app/oracle/oradata/test/mnt_tbs.dbf (6)
Block: 57244 Offsets: 8169 to 8191 Dba:0x0180df9c
------------------------------------------------------------------------
6b696e67 6c652c01 0202c102 067a6861 6f787502 06bbde

<32 bytes per line>

3.更改数据,修改第6号数据文件的57244块
BBED> dump /v dba 6,57244 offset 8169 count 32
File: /u02/app/oracle/oradata/test/mnt_tbs.dbf (6)
Block: 57244 Offsets: 8169 to 8191 Dba:0x0180df9c
-------------------------------------------------------
6b696e67 6c652c01 0202c102 067a6861 l kingle,…ha
6f787502 06bbde l oxu..

<16 bytes per line>

BBED> modify 100 dba 6,57244;
File: /u02/app/oracle/oradata/test/mnt_tbs.dbf (6)
Block: 57244 Offsets: 8169 to 8191 Dba:0x0180df9c
------------------------------------------------------------------------
64696e67 6c652c01 0202c102 067a6861 6f787502 06bbde

<32 bytes per line>

BBED> dump /v dba 6,57244 offset 8169 count 32
File: /u02/app/oracle/oradata/test/mnt_tbs.dbf (6)
Block: 57244 Offsets: 8169 to 8191 Dba:0x0180df9c
-------------------------------------------------------
64696e67 6c652c01 0202c102 067a6861 l dingle,…ha
6f787502 06bbde l oxu..

<16 bytes per line>

exit

4.查看数据块
dbv userid=sys/oracle file=/u02/app/oracle/oradata/test/mnt_tbs.dbf
[oracle@test bbed]$ dbv userid=sys/oracle file=/u02/app/oracle/oradata/test/mnt_tbs.dbf

DBVERIFY: Release 10.2.0.5.0 - Production on Tue Sep 28 15:57:18 2021

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

DBVERIFY - Verification starting : FILE = /u02/app/oracle/oradata/test/mnt_tbs.dbf
Page 57244 is marked corrupt
Corrupt block relative dba: 0x0180df9c (file 6, block 57244)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x0180df9c
last change scn: 0x0000.0013debb seq: 0x2 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xdebb0602
check value in block header: 0xf5f8
computed block checksum: 0xf00

DBVERIFY - Verification complete

Total Pages Examined : 60672
Total Pages Processed (Data) : 43586
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 13993
Total Pages Failing (Index): 0
Total Pages Processed (Other): 1014
Total Pages Processed (Seg) : 228
Total Pages Failing (Seg) : 0
Total Pages Empty : 1850
Total Pages Marked Corrupt : 1 --表示存在坏块
Total Pages Influx : 0
Highest block SCN : 1390345 (0.1390345)

5.查看数据库数据
SQL> select * from bbed;
ID NAME
---------- --------------------
1 zhaoxu
1 kingle
--查询正常,因为在buffer_cache中缓存了块,而修改的是文件中的块。两个块现在不一致,清空buffer cache后再次查询测试表。

SQL> alter system flush buffer_cache;

System altered.

SQL> select * from bbed;
select * from bbed
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 57244)
ORA-01110: data file 6: '/u02/app/oracle/oradata/test/mnt_tbs.dbf'

6.校验坏块

SQL> analyze table bbed validate structure cascade online;
analyze table bbed validate structure cascade online
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 57244)
ORA-01110: data file 6: '/u02/app/oracle/oradata/test/mnt_tbs.dbf'

7.rman校验坏块
[oracle@test ~]$ rman target /

Recovery Manager: Release 10.2.0.5.0 - Production on Tue Sep 28 16:01:19 2021

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

connected to target database: TEST (DBID=2286280424)

RMAN> backup check logical validate database;

Starting backup at 28-SEP-21
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=144 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00002 name=/u02/app/oracle/oradata/test/undotbs01.dbf
input datafile fno=00001 name=/u02/app/oracle/oradata/test/system01.dbf
input datafile fno=00006 name=/u02/app/oracle/oradata/test/mnt_tbs.dbf
input datafile fno=00003 name=/u02/app/oracle/oradata/test/sysaux01.dbf
input datafile fno=00005 name=/u02/app/oracle/oradata/test/example01.dbf
input datafile fno=00004 name=/u02/app/oracle/oradata/test/users01.dbf
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:25
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:05
Finished backup at 28-SEP-21

RMAN>

--RMAN的检查结果放在v$database_block_corruption
SQL> select file#,block#,blocks from v$database_block_corruption;

FILE# BLOCK# BLOCKS
---------- ---------- ----------
6 57244 1

拓展:

BV(DBVERIFY)是Oracle提供的一个命令行工具,它可以对数据文件物理和逻辑两种一致性检查。但是这个工具不会检查索引记录和数据记录的匹配关系,这种检查必须使用analyze validate structure命令。

这个工具有如下特点:
1.以只读的方式打开数据文件,在检查过程中不会修改数据文件的内容。
2.可以在线检查数据文件,而不需要关闭数据库。
3.不能检查控制文件和日志文件,只能检查数据文件。
4.这个工具可以检查ASM文件,但数据库必须Open状态,并且需要通过USERID指定用户,比如:dbv file=+DG1/ORCL/datafile/system01.dbf userid=system/sys
5.在许多UNIX平台下,DBV要求数据文件有扩展名,如果没有可以通过建立链接的方法,然后对链接的方法,然后对链接文件进行操作,比如:ls -n /dev/rdsk/mydevice /tmp/mydevice.dbf
6.某些平台,DBV工具不能检查超过2GB的文件,如果碰到DBV-100错误,请先检查文件大小,MOS Bug 710888对这个问题有描述。
7.DBV只会检查数据块的正确性,但不会关系数据块是否属于哪个对象。
8.对于祼设备建议指定END参数,避免超出数据文件范围。比如:dbv FILE=/dev/rdsk/r1.dbf END=。可以在v$datafile视图中用bytes字段除以块大小来获得END值。

DBVERIFY - Verification starting : FILE = /u02/app/oracle/oradata/test/mnt_tbs.dbf
DBVERIFY - Verification complete

Total Pages Examined : 60672 --( 检查总页数)
Total Pages Processed (Data) : 43587 --(处理的总页数(数据))
Total Pages Failing (Data) : 0 --(总页数失败(数据))
Total Pages Processed (Index): 13993 --(处理的总页数(索引))
Total Pages Failing (Index) : 0 --(总页面失败(索引))
Total Pages Processed (Other): 1014 --(处理的总页数(其他))
Total Pages Processed (Seg) : 228 --(处理的总页数(Seg))
Total Pages Failing (Seg) : 0 --(总页数失败(Seg)
Total Pages Empty : 1850 --(总页数空)
Total Pages Marked Corrupt : 0 --(总页数标记为损坏)
Total Pages Influx : 0 --(总页面数量)
Highest block SCN : 1390345 (0.1390345) --(最高块SCN)

参考:

https://www.cnblogs.com/kingle-study/p/10857467.html

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章