--************************************

-- 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)

        Defaultvalue              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)

        Defaultvalue              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:  Thedatablockindicated was corrupted, mostly due tosoftware

   //          errors.

   // *Action: Try torestorethesegmentcontaining theblockindicated. This

   //          may involve dropping thesegmentandrecreating it. Ifthere

   //          isa tracefile,report theerrorsinit toyour ORACLE

   //          representative


4.db_block_checking和db_block_checksum这两个参数对性能的影响

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

      a. 创建测试对象       

        SQL>select *   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                                   -->第一次插入数据
2 fori in1..1000000
3 loop
4 insert into test values(i);
5 end loop;
6 end;
7 /

PL/SQL procedure successfully completed.

Elapsed: 00:00:59.57

SQL>commit;

SQL>alter system check point;

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.13,平均时间为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://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1094433279412​


6.快捷参考

有关性能优化请参考

    ​​Oracle 硬解析与软解析​

    ​​共享池的调整与优化(Shared pool Tuning)​

    ​​Buffer cache 的调整与优化(一)​

    ​​Oracle 表缓存(caching table)的使用​


有关ORACLE体系结构请参考

    ​​Oracle 表空间与数据文件​

    ​​Oracle 密码文件​

    ​​Oracle 参数文件​

    ​​Oracle 联机重做日志文件(ONLINE LOG FILE)​

    ​​Oracle 控制文件(CONTROLFILE)​

    ​​Oracle 归档日志​

    ​​Oracle 回滚(ROLLBACK)和撤销(UNDO)​

    ​​Oracle 数据库实例启动关闭过程​

    ​​Oracle 10g SGA 的自动化管理​

    ​​Oracle 实例和Oracle数据库(Oracle体系结构)​


有关闪回特性请参考

    ​​Oracle 闪回特性(FLASHBACK DATABASE)​

    ​​Oracle 闪回特性(FLASHBACK DROP &RECYCLEBIN)​

    ​​Oracle 闪回特性(Flashback Query、Flashback Table)​

    ​​Oracle 闪回特性(Flashback Version、Flashback Transaction)​


有关基于用户管理的备份和备份恢复的概念请参考

    ​​Oracle 冷备份​

    ​​Oracle 热备份​

    ​​Oracle 备份恢复概念​

    ​​Oracle 实例恢复​

    ​​Oracle 基于用户管理恢复的处理​​(详细描述了介质恢复及其处理)

    ​​SYSTEM 表空间管理及备份恢复​

    ​​SYSAUX表空间管理及恢复​


有关RMAN的备份恢复与管理请参考

    ​​RMAN 概述及其体系结构​

    ​​RMAN 配置、监控与管理​

    ​​RMAN 备份详解​

    ​​RMAN 还原与恢复​

    ​​RMAN catalog 的创建和使用​

    ​​基于catalog 创建RMAN存储脚本​

​基于catalog 的RMAN 备份与恢复​

​使用RMAN迁移文件系统数据库到ASM​

   ​​RMAN 备份路径困惑(使用plus archivelog时)​


有关ORACLE故障请参考

    ​​ORA-32004 的错误处理​

    ​​ORA-01658 错误​

    ​​CRS-0215 错误处理​

    ​​ORA-00119,ORA-00132 错误处理​

    ​​又一例SPFILE设置错误导致数据库无法启动​

    ​​对参数FAST_START_MTTR_TARGET = 0 的误解及设定​

    ​​SPFILE 错误导致数据库无法启动(ORA-01565)​


有关ASM请参考

    ​​创建ASM实例及ASM数据库​

    ​​ASM 磁盘、目录的管理​

    ​​使用 ASMCMD 工具管理ASM目录及文件​


有关SQL/PLSQL请参考

    ​​SQLPlus 常用命令​

    ​​替代变量与SQL*Plus环境设置​

    ​​使用Uniread实现SQLplus翻页功能​

    ​​SQL 基础-->SELECT 查询

    ​​SQL 基础--> NEW_VALUE 的使用

    ​​SQL 基础--> 集合运算(UNION 与UNION ALL)

    ​​SQL 基础--> 常用函数

    ​​SQL 基础--> 视图(CREATE VIEW)

    ​​SQL 基础--> 创建和管理表

    ​​SQL 基础--> 多表查询

    ​​SQL 基础--> 过滤和排序

    ​​SQL 基础--> 子查询

    ​​SQL 基础--> 分组与分组函数

    ​​SQL 基础--> 层次化查询(START BY ... CONNECT BY PRIOR)

    ​​SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

    ​​PL/SQL --> 游标

    ​​PL/SQL --> 异常处理(Exception)

    ​​PL/SQL --> 语言基础

    ​​PL/SQL --> 流程控制

    ​​PL/SQL --> PL/SQL记录

    ​​PL/SQL --> 包的创建与管理

    ​​PL/SQL --> 隐式游标(SQL%FOUND)

    ​​PL/SQL --> 包重载、初始化

    ​​PL/SQL --> DBMS_DDL包的使用

    ​​PL/SQL --> DML 触发器

    ​​PL/SQL --> INSTEAD OF 触发器

    ​​PL/SQL --> 存储过程

    ​​PL/SQL --> 函数

    ​​PL/SQL --> 动态SQL

    ​​PL/SQL --> 动态SQL的常见错误


有关ORACLE其它特性

    ​​Oracle 常用目录结构(10g)​

    ​​使用OEM,SQL*Plus,iSQL*Plus管理Oracle实例​

    ​​日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING)​

    ​​表段、索引段上的LOGGING与NOLOGGING​

    ​​Oralce OMF 功能详解​

    ​​Oracle 用户、对象权限、系统权限 ​​ 

    ​​Oracle 角色、配置文件​

    ​​Oracle 分区表​

    ​​Oracle 外部表​

    ​​使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)​

    ​​簇表及簇表管理(Index clusteredtables)​

    ​​数据泵 EXPDP 导出工具的使用​

    ​​数据泵 IMPDP 导入工具的使用​

    ​​导入导出 Oracle 分区表数据​

    ​​SQL*Loader使用方法​

    ​​启用用户进程跟踪​

    ​​配置非默认端口的动态服务注册​

    ​​配置ORACLE 客户端连接到数据库​

    ​​system sys,sysoper sysdba 的区别​

    ​​ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAME​

    ​​Oracle 补丁全集 (Oracle 9i 10g 11g Path)​

    ​​Oracle 10.2.0.1 升级到 10.2.0.4​

    ​​Oracle 彻底 kill session​