os: centos 7.4
db: oracle 12.1.0.2
db_block_checking 是对 block 做逻辑性检查,避免内存中数据块的损坏.
db_block_checksum 是对 block 做物理性检查,用于 DBWn 和 direct loader 数据块写入到磁盘时,基于块内的所有字节计算得出一个校验值并将其写入块头.
db_block_checking
DB_BLOCK_CHECKING = { FALSE | OFF | LOW | MEDIUM | TRUE | FULL }
通过 ALTER SYSTEM 来修改
alter system set DB_BLOCK_CHECKING=FULL;
OFF or FALSE
用户表空间将不会进行 block checking ,但是 system 表空间始终是需要检查的.
LOW
当块在内存中的内容发生变化后,只做基本的块头检查.(比如,UPDATE, INSERT or DELETE,RAC 的实例间传输)
MEDIUM
除索引外的所有对象,进行 LOW 级别的检查 和完整性检查
FULL or TRUE
所有对象的 LOW + MEDIUM,进行完整性和正确性检查.
其中,设置为 FALSE 或者 TRUE 是为了兼容老版本.
根据参数值的设置不同,会增加额外的 1% ~ 10% 的代价.如果性能可以接受的话,建议设置为 FULL.
db_block_checksum
DB_BLOCK_CHECKSUM = { OFF | FALSE | TYPICAL | TRUE | FULL }
通过 ALTER SYSTEM 来修改
alter system set DB_BLOCK_CHECKSUM=FULL;
OFF or FALSE
DBWn 只在 system 表空间计算 checksums , 而在用户表空间是不会计算的.
TYPICAL or TRUE
当读入时候重新计算校验和写出时候的校验对比,如果不同则认为是块损坏
会增加额外 1% ~ 2% 的代价,oracle 强烈建议设置为 TYPICAL.
FULL
当读入时候重新计算校验和写出时候的校验对比,如果不同则认为是块损坏.
设置为FULL模式,则基于update/delete应用程序语句级别的改变发生后,校验值会被重新计算并写入.
同时对于日志块,在写入之前,同样会生产校验值并写入到块头。该参数主要是防止IO硬件和IO子系统的错误
会增加额外 4% ~ 5% 的代价
同样,设置为 FALSE 或者 TRUE 是为了兼容老版本.所以在设置时尽量不要设置为 false,true
参考:
https://docs.oracle.com/database/121/REFRN/GUID-23700E5C-6BFC-48C2-9728-EB1F93F95DD6.htm#REFRN10029
https://docs.oracle.com/database/121/REFRN/GUID-A0F72B65-BC1C-441B-824E-03ADCE66063A.htm#REFRN10030