♣题目 部分
在Oracle中,参数DB_BLOCK_CHECKSUM和DB_BLOCK_CHECKING的作用是什么?
♣答案部分
何时进行数据块的一致性检查呢?当一个数据块被读或写的时候,将对块的进行一致性检查,检查的内容包括块的版本、比较块在Cache和Block Buffer中的数据块地址,然后根据要求进行校验和(checksum)。
块的一致性检查由DB_BLOCK_CHECKSUM和DB_BLOCK_CHECKING两个初始化参数控制。DB_BLOCK_CHECKSUM是一种物理检查,用于防止物理I/O的损坏,默认值是TYPICAL,只有在写入(DBWn常规写或用户进程直接路径写入)数据文件时,根据一个CHECKSUM算法计算数据块的校验和,然后写入数据块的块头,下次在读取的时候会重新计算块的CHECKSUM值,与块头进行比对以判断该块是否损坏。如果将其设置为FULL,还会验证内存中的块的CHECKSUM值,避免内存的问题导致块的损坏。即使将DB_BLOCK_CHECKSUM值设置为FALSE,对于SYSTEM表空间也会进行相关的验证。DB_BLOCK_CHECKSUM主要是为了防止I/O硬件和I/O子系统的错误。
DB_BLOCK_CHECKING参数(默认值为FALSE)主要用于数据块的逻辑一致性检查,但只是在块内,不包括块间的逻辑检查,用于防止在内存中损坏或数据损坏。当启用DB_BLOCK_CHECKING时,可能会产生内部错误ORA-600[kddummy_blkchk]或者ORA-600[kdBlkCheckError]。
如果db_block_checking被启用,且磁盘的块已经被逻辑损坏,那么下一次更新块将会标记该块为软损坏(Soft Corrupt),将来对这个块的读将产生ORA-1578错误。在这种情况下报告损坏错误“DBV-200:Block,dba ,already marked corrupted”。即使将DB_BLOCK_CHECKING值设置为FALSE,对于SYSTEM表空间也会进行相关的验证。
作者:小麦苗