db_block_checking与db_block_chec…

本文详细介绍了Oracle数据库中的db_block_checking与db_block_checksum参数的作用与区别,包括它们如何帮助确保数据的一致性和完整性,以及这些设置对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

db_block_checking与db_block_checksum
    db_block_checking与db_block_checksum两个参数都是对block进行检查,然而两者很容易混淆。事实上,两个参数中前者是对块做逻辑性检查,后者则是做物理性检查。两者各司其职,并不矛盾。下面分别给出具体描述。

1.db_block_checking

        db_block_checking 是当block发生任何变化的时候进行逻辑上的完整性和正确性检查。该参数能够避免内存中数据块的损坏。
        块的检查将对系统会有1%到10%的性能影响。取决于对db_block_checking参数的设置。频繁的DML将使得块检查带来更多的开销。
        在系统负荷允许的情形下建议设置为full。该参数对SYSTEM表空间始终是处于“打开”状态,而不管该参数是否设置为OFF。
        下面是该参数的设置参考。FALSE和TRUE是为了老版本的兼容。

        Property             Description
        ---------------     ------------
        Parameter type         String
        Syntax                 DB_BLOCK_CHECKING = { FALSE| OFF| LOW | MEDIUM | TRUE| FULL}  -->OFF(=FALSE),FULL(=TRUE)
        Default value          FALSE
        Modifiable             ALTER SYSTEM
        Basic                  No
                         

2.db_block_checksum

        db_block_checksum 用于DBWn和direct loader数据块写入到磁盘时,基于块内的所有字节计算得出一个校验值并将其写入块头。
   在该参数设置为typical和full时,读入时重新计算校验,并和写出时候的校验对比,如果不同则认为是块损坏。
   如果设置为FULL模式,则基于update/delete应用程序语句级别的改变发生后,校验值会被重新计算并写入。同时对于日志块,在写入之前,同样会生产校验值并写入到块头。
   该参数主要是防止IO硬件和IO子系统的错误。如果设置为OFF则只对系统表空间有效。
   下面是该参数的设置参考。

   FALSE和TRUE是为了老版本的兼容。

        Property             Description
        ---------------     ------------
        Parameter type         String
        Syntax                 DB_BLOCK_CHECKSUM = { OFF| FALSE| TYPICAL | TRUE| FULL}  -->OFF(=FALSE),FULL(=TRUE)
        Default value          TYPICAL
        Modifiable             ALTER SESSION,ALTER SYSTEM
        Basic                  No


3.存在的问题

   如果db_block_checking = off,非系统表空间中数据在逻辑上可能已经损坏,但是 db_block_checksum 却是无法检查出来的(负责物理层面的校验),原样写到磁盘原样读到内存,
   因为它只校验块在写出后和读入之间是否发生变化而不检查写出前是否存在逻辑上的正确。

   有些情况下,比如索引块损坏,造成通过索引无法获得数据,但是读索引块的时候并没有出1578错误,有可能是这个原因。

   SQL>ho oerr ora 1578
   01578,00000,"ORACLE data block corrupted (file # %s, block # %s)"
   // *Cause:  The data block indicated was corrupted, mostly due to software
   //          errors.
   // *Action: Try to restore the segment containing the block indicated. This
   //          may involve dropping the segment and recreating it. If there
   //          is a trace file,report the errors init to your ORACLE
   //          representative


4.db_block_checking和db_block_checksum这两个参数对性能的影响
   
   下面的例子中做一个测试来查看该参数对性能的影响。实际上,环境的不同将使得测试结果会大相庭径。

a. 创建测试对象        

SQL>select *  from v$version where rownum<2;  
 
BANNER  
----------------------------------------------------------------------   
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0- Production         
 
SQL>show parameter db_block_che  
 
NAME                                 TYPE        VALUE  
----------------------------------------------- ------------------------------   
db_block_checking                    string      FALSE  
db_block_checksum                    string      TYPICAL  
 
SQL>show user;  
USER is "SCOTT"  
 
SQL>create table test (col int) tablespace users nologging;  -->由于空间压力在此不记录日志   
Table created.  


b. 修改两个参数为FALSE        

SQL>alter system set db_block_checksum=FALSE;  
System  altered.  

SQL>set timing on;  

c. 对测试表test中三次分别插入100,000行数据  
           
SQL> begin                                   -->第一次插入数据   
  for i in 1..1000000  
  loop  
    insert into test values(i);  
  end loop;  
  end;  
  /  
 
PL/SQL procedure successfully completed.   
Elapsed: 00:00:59.57       
 
SQL>commit;                             
 
SQL>alter system checkpoint;            
 
 
SQL>@insert_test.sql                         -->第二次插入数据   
PL/SQL procedure successfully completed.  
Elapsed: 00:00:59.13  
 
SQL>commit;  
 
SQL>alter system check point;  
 
SQL>@insert_test.sql                        -->第三次插入数据   
PL/SQL procedure successfully completed.  
Elapsed: 00:00:56.87  
 
SQL>commit;  
 
SQL>alter system check point;  

从上面的结果可以看出插入100百万条记录所需的最短时间为56.87秒,最长的时间为59.57,平均时间为58.5233。

d. 修改两个参数为TRUE     
   
SQL>alter system set db_block_checksum=TRUE;   
SQL>alter system set db_block_checking=TRUE;  
 
SQL>show parameter db_block_ch  
 
NAME                                 TYPE        VALUE  
----------------------------------------------- ------------------------------   
db_block_checking                    string      TRUE  
db_block_checksum                    string      TRUE  


e. 再次测试表test中三次分别插入100,000行数据            


SQL>@insert_test.sql                    -->第一次插入数据   
PL/SQL procedure successfully completed.  
Elapsed: 00:02:58.01  
 
SQL>commit;  
SQL>alter system check point;  
 
SQL>@insert_test.sql                    -->第二次插入数据   
PL/SQL procedure successfully completed.  
Elapsed: 00:03:01.66  
 
SQL>commit;  
 
SQL>alter system checkpoint;            -->第三次插入数据   
 
SQL>@insert_test.sql  
PL/SQL procedure successfully completed.  
Elapsed: 00:02:49.15  
 
SQL>commit;  
 
SQL>alter system checkpoint;  

从上面的结果可以看出插入100百万条记录所需的最长时间为03:01.66秒,最短的时间为02:49.15,平均时间为02:57秒左右。
 
 
5.总结
   a. 对结果进行对比,可以看出当将两个block参数设置为true时,其速度比为false时慢了近30%,不过此对比根据实际环境应有所不同。

   b. 对于性能上的差异而言,当设置两个block参数设置为true时,将需要更多的CPU资源来生成校验值以及进行内存块的验证。
   同时,该操作容易引起redo copy latch的持有时间增加,和引起这个latch的竞争。

   c. 不管db_block_checking和db_block_checksum这两个参数的值为何值,SYSTEM表空间都会进行做checking和checksum,
   可以通过隐含参数 db_always_check_system_ts设置为FALSE,但为了SYSTEM表空间数据安全,不建议将这个隐含参数值设置为FALSE。

   d. checksum 通过校验结构保证写入到数据文件的块与从数据文件读取的块前后是一致的。通常用于侦测由于IO操作(磁盘损坏,硬件损坏)引发的坏块。
    但它并不侦测在内存中已经出错的数据块。不管错误与否,DBWn都会将其写入到数据文件。

   e. checking 则正好弥补了checksum的不足,它对数据块在内存提供一致性验证,确保每一个数据块的完整性。

   f. 更多关于Block checking,http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1094433279412

转自:http://blog.csdn.net/leshami/article/details/6628679


下为COP试题


27. The DB_BLOCK_CHECKING initialization parameter is set to FALSE. What level of block checking
would be performed?
A.The Oracle database will not perform block checking for any of the data blocks.
B.The Oracle database will perform block checking for the default permanent tablespace only.
C.The Oracle database will perform block checking for the data blocks in all user tablespaces.
D.The Oracle database will perform block checking for the data blocks in the SYSTEM tablespace only.
E.The Oracle database will perform block checking for the data blocks in the SYSTEM and SYSAUX
tablespaces.
Answer: D

28. The DB_BLOCK_CHECKING initialization parameter is set to TRUE. What would be the result of this
setting on the data blocks being written to the datafiles, every time the DBWn writes?
A.The Oracle database will check all data blocks by going through the data on each block, making sure
the data is self­consistent.
B.DBWn and the direct loader will calculate checksum and store it in the cache header of every data
block when writing it to disk.
C.The Oracle database will check data blocks belonging to the SYSTEM tablespace only, by going
through the data on each block, making sure the data is self­consistent.
D.The Oracle database will check data blocks belonging to the SYSAUX tablespace only, by going
through the data on each block, making sure the data is self­consistent.
E.The Oracle database will check data blocks in the SYSTEM and SYSAUX tablespaces only, by going
through the data on each block, making sure the data is self­consistent.
Answer: A
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值