||
数据块的一致性分成物理和逻辑两种,对应的故障原因也可能是物理和逻辑两种。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 命令。
这个工具有如下特点。
ln -s /dev/rdsk/mydevice /tmp/mydevice.dbf
某些平台,DBV 工具不能检查超过 2GB 的文件,如果碰到 DBV-100 错误,请先检查备份文件大小,Metalink Bug 710888 对这个问题有描述。
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='TAB1'
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 文件中。使用这个命令需要注意下面几个方面:
注意: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 'RMAN%'
and opname not like '%aggregate%' and totalwork != 0
and sofar <> totalwork
检查结果如下:
Select * from v$database_data_corruption。
(2)检查备份文件。
RMAN 除了可以检查数据文件,还可以检查备份文件,这个功能的命令是 restore validate
系列。下面是关于这个命令的举例。
检查数据库备份:
restore validate database;
检查最近的控制文件备份:
restore validate controlfile to 'c:\temp\control01.ctl';
检查备份的日志文件:
restore validate archivelog from sequence ????? until sequence XXXXX?;