检查数据块一致性

已有 786 次阅读2013-1-2 16:19 |个人分类:block| 检查

数据块的一致性分成物理和逻辑两种,对应的故障原因也可能是物理和逻辑两种。Oracle提供了多种方法进行这两种一致性检查,包括设置参数、使用工具等,下面将分别介绍。

使用初始化参数

数据库每次启动时都会读取初始化参数,根据参数值进行配置,因此和后面介绍的其他手段比起来,利用初始化参数是一劳永逸的方法,用户需要特别注意以下两个参数。

1.物理一致性检查:数据块校验和(Block Checksum

这种检查方法就是说,Oracle 在把 SGA 中的数据块写回磁盘之前,先计算数据块的校验和,填写数据块头的对应字段,然后再把数据块写入磁盘;下次读出数据块时重新计算校验和,和 数据块头的字段比较,如果不一致,则意味着存储介质有故障,会抛出 ORA-1578 错误。通过设置初始化参数 db_block_checksum=true/false 来启用、关闭这个功能。根据 Oracle 官 方稳当,启用这个功能只会增加 1%2% 的负载,所以 Oracle 推荐启用这个检查功能。在 Oracle 9i、Oracle 10g 中,这个功能缺省就是启用的。当参数值为 True 时,Oracle 除了会对所 有表空间的数据块进行校验和检查,还会对 redo log 块做校验和。如果设置成 False,Oracle 则 只会对 System 表空间的数据块进行校验和检查。如果在建库之初没有启用校验和检查,也就是这个参数一开始设置成 False,则数据块头不 会记录 Checksum 字段。即使以后启用了这个功能,也不会立刻把所有数据块加上 Checksum 字 段。只有启用了校验和检查后又被修改过的数据块,才会在数据块头增加校验和字段,这时检查的只是部分数据块。如果想立即对所有数据块做 Checksum,可以使用 RMAN 对数据文件做一个 Copy,在 Copy 过程中,RMAN 会把数据块从读缓冲区拷贝到写缓冲区,在这个缓冲区对拷过程中会对数据块做校验,并加上 Checksum 字段。下面脚本演示了这个方法:

run {
copy datafile '/prod/original.dbf' to '/prod/backup.dbf';
sql "alter database rename file''/prod/original.dbf''to''/prod/backup.dbf''";
}

2.逻辑一致性检查:逻辑数据块检查(Logical Block Checking

这个功能意味着:每当 Oracle 要修改一个数据块时,会先对数据块内容做一个一致性检查。如果这种一致性检查失败,会抛出 ORA-600 的 Internal 错误。当 Oracle 检查到数据块的逻辑一致性时,会尝试对数据块做 Cache Recovery,如果不能把数据块恢复到一致状态,Oracle 就会把这个数据块标志为 Software Corrupt,当有查询访问到这个数据块时,也会抛出前面的 ORA-1578 错误。

这个检查方法检查的是数据逻辑上的一致性,比单纯的校验和检查更有助于早期发现错误, 避免错误蔓延导致严重后果。但是这个检查功能会增加 1%10%的负载,尤其 DML 操作越密 集,性能影响越大。

通过设置参数 db_block_checking=true 可以启用这个功能。在 Oracle 10g 中,这个参数默认值是 false,意味着只对 System 表空间做逻辑一致性检查。如果想要在全库范围启用这个功能,Oracle 建 议在启用之前先对所有数据文件进行一致性检查,可以使用后面要介绍到的 DBV 或 RMAN 等工具。

注意标 志数据块 software corrupt 是通过数据块头的一些标志位实现的。如果数据块被标识为 software corrupt,则这个数据块内的数据就丢失了。但是从 Oracle 8.1.6 之后,这些数据 块不会被标识为 software corrupt。

DBV工具

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

Analyze validate structure 命令。

这个工具有如下特点。

  • 以只读的方式打开数据文件,在检查过程中不会修改数据文件的内容。
  •  可以在线检查数据文件,而不需要关闭数据库。
  • 不能检查控制文件和日志文件,而只能检查数据文件。
  • 这个工具可以检查 ASM 文件,但是数据库必须 Open 状态,并且需要通过 USERID指定用户,比如:dbv file=+DG1/ORCL/datafile/system01.dbf userid=system/sys
  • 在许多 UNIX 平台下,DBV 要求数据文件有扩展名,如果没有可以通过建立链接的方法,然后对链接文件进行操作,比如:

ln -s /dev/rdsk/mydevice /tmp/mydevice.dbf

 

某些平台,DBV 工具不能检查超过 2GB 的文件,如果碰到 DBV-100 错误,请先检查备份文件大小,Metalink Bug 710888 对这个问题有描述。

  • DBV 只会检查数据块的正确性,但不会关心数据块是否属于哪个对象。

DBV 命令参数表

参 数

含 义

缺 省 值

FILE

要检查的数据文件名

没有缺省值

START

检查起始数据块号

数据文件的第一个数据块

END

检查的最后一个数据块号

数据文件的最后一个数据块

BLOCKSIZE

数据块大小,这个值要和数据库的

DB_BLOCK_SIZE 参数值一致

缺省值 8192

LOGFILE

检查结果日志文件

没有缺省值

续表

参 数

含 义

缺 省 值

FEEDBACK

显示进度

0

PARAFILE

参数文件名

没有缺省值

USERID

用户名、密码

没有缺省值

SEGMENT_ID

ID,参数格式<tsn.segfile.segblock>

没有缺省值

下面这个例子检查 users01.dbf 文件。

[oracle@dbs ~]dbv file=users01.dbf blocksize=2048

 

DBVERIFY - Verification starting : FILE = users01.dbf kdbchk: a row ends in the middle of another
tab=0 slot=1 begin=0x7a0 len=0x14
Page 3 failed with check code 5
Page 10 is marked software corrupt
Page 12 is marked software corrupt
DBVERIFY - Verification complete
Total Pages Examined : 512
Total Pages Processed (Data) : 1
Total Pages Failing (Data) : 1
Total Pages Processed (Index) : 0
Total Pages Failing (Index) : 0
Total Pages Empty : 507
Total Pages Marked Corrupt : 2
Total Pages Influx : 0

注意:这个工具的报告使用的是 page 作为单位,含义和 data block 相同。

除 了 检 查 数 据 文 件 , 这 个 工 具 还 允许 检查 单 独 的 Segment , 这 时 参 数 值 的 格 式 是<tsn.segfile.segblock>,如以下例子。

(1)查看对象的 tsn、segfile、segblock 属性:

SQL> select t.ts#, s.header_file, s.header_block from v$tablespace t, dba_segments s where s.segment_name=&apos;TAB1&apos;
and t.name = s.tablespace_name;
TS# HEADER_FILE HEADER_BLOCK
------ ----------- ------------
0 1 30297

(2)检查 Segment:

[oracle@dbs ~]$ dbv userid=system/H2oisWater SEGMENT_ID= 0.1.30297
DBVERIFY: Release 10.2.0.1.0 - Production on Wed Sep 10 11:03:10 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved. DBVERIFY - Verification starting : SEGMENT_ID = 0.1.30297
DBVERIFY - Verification complete
Total Pages Examined : 25
Total Pages Processed (Data) : 21
Total Pages Failing (Data) : 0
Total Pages Processed (Index) : 0
Total Pages Failing (Index) : 0Total Pages Processed (Other) : 0
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 4
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 656769 (0.656769)

 

Analyze 命令

Analyze 命令可以完成很多功能,收集对象的统计信息,而检查对象一致性的格式如下:

Analyze table validate structure cascade online(offline)

配性,检查分区表的记录是否在正确的分区中,检查出的问题会放在 USER_DUMP_DEST 目录下的 trace 文件中。使用这个命令需要注意下面几个方面:

 

  • 特殊的表中,这个表叫作 invalid_rows 表,其中需要用 utlvalid.sql 脚本提前建立,对应的检查语法是:Analyze table name validate structure into invalid_rows;
  • 如果检查索引,这个命令会检查数据块和索引块的一致性,但是不会确认每条记录都 有相应的索引项或者索引有对应的记录,如果需要这种检查,需要使用 cascade 关键字。
  • 如果使用 online 子句,可以在有 DML 操作时在线检查一致性,只是这时不会收集对 象的统计信息;而如果使用 offline 方式,表会被锁住。
  • 这个命令会对系统性能有一定影响。

注意Trace 文件内容最后会有 nrow 字样,就代表数据块中的记录数,通过这个内容就可以评 估影响。

 

RMAN 工具

使用 RMAN 命令做备份时,先把数据块读到 RMAN 的读缓冲区,然后拷贝到 RMAN 的写 缓冲区,从写缓冲区写到物理介质上。在从读缓冲到写缓冲的拷贝过程中,RMAN 会对数据块 的一致性进行检查。可以利用这个功能完成对数据块的检查。

(1)检查数据文件,其命令格式如下:

这个命令只进行一致性检查,并不进行备份。关键字 validate 就是物理一致性检查;logical 是逻辑性检查。Oracle 10g 数据库的 db_block_checksum 参数默认值是 true,则可以只用 check logical 进行逻辑一致性检查。

检查的进度 、结果都可以从视图中查看, 需要注意的是检查结果放在 v$database_block_corruption,这是个动态视图,每次执行 RMAN 备份时,前一次的结果会被覆盖。

下面是这个命令的几个例子。

检查整个数据库: 其 他 恢 复

RMAN>backup check logical validate database;

检查单个数据文件或几个数据文件:

RMAN>backup check logical validate datafile 1, 2;

检查过程的进度状态:

select sid, serial#, context, sofar, totalwork, round(sofar/totalwork*100,2) "%_complete" from v$session_longops
where opname like &apos;RMAN%&apos;
and opname not like &apos;%aggregate%&apos; and totalwork != 0
and sofar <> totalwork

检查结果如下:

Select * from v$database_data_corruption

(2)检查备份文件。

RMAN 除了可以检查数据文件,还可以检查备份文件,这个功能的命令是 restore validate

系列。下面是关于这个命令的举例。

检查数据库备份:

restore validate database;

检查最近的控制文件备份:

restore validate controlfile to &apos;c:\temp\control01.ctl&apos;;

检查备份的日志文件:

restore validate archivelog from sequence ????? until sequence XXXXX?;


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 加入社区

他的关注

意见
反馈