您好,欢迎访问一九零五行业门户网

Oracle block corrupt 坏块

总体上来讲,oracle的坏块可以分为两种情景:物理损坏和逻辑损坏。物理损坏是由于存储等原因造成的,致使oracle在处理数据块时发
总体上来讲,oracle的坏块可以分为两种情景:物理损坏和逻辑损坏。物理损坏是由于存储等原因造成的,致使oracle在处理数据块时发现块的checksum不一致。逻辑损坏多是由于oracle的bug或者内存错误引起,通过检测数据块的checksum并不会发现什么问题,但是在逻辑上这些块已经发生了损坏。
oracle通过两个参数来控制对物理损坏和逻辑损坏的检测:
sql> show parameter db_block_check
name        type  value
------------------------------------ ----------- ------------------------------
db_block_checking      string  false
db_block_checksum      string  true
 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
      这里有一点需要注意,即只有在对数据块发生修改时,db_block_checking才会发生作用。如
sql> show parameter db_block_check
name        type  value
------------------------------------ ----------- ------------------------------
db_block_checking      string  false
db_block_checksum      string  true
sql> alter system flush buffer_cache;
system altered.
sql> select * from scott.s2;//查询时没有问题
t1    t2
---------- --------------------
51809    lllll
51888    sc
51574    pk_dept
51573    dept
1575emp,  5
51576    pk_emp
51578    salgrade
7 rows selected.
sql> update scott.s2 set t2='aaaa' where t1='51809';//修改也没有问题
1 row updated.
sql> commit;
commit complete.
sql> alter system flush buffer_cache;
system altered.
sql> alter system set db_block_checking=true;
system altered.
sql> select * from scott.s2;//查询是没有问题的
t1    t2
---------- --------------------
51809    aaaa
51888    sc
51574    pk_dept
51573    dept
1575emp,  5
51576    pk_emp
51578    salgrade
7 rows selected.
sql> update scott.s2 set t2='bbbb' where t1 = '51809';//修改时触发了逻辑检测
update scott.s2 set t2='bbbb' where t1 = '51809'
            *
error at line 1:
ora-00607: internal error occurred while making a change to a data block
ora-00600: internal error code, arguments: [kddummy_blkchk], [5], [20], [6113],
[], [], [], []
sql> select * from scott.s2;//发现逻辑错误后,oracle将块标记为坏块,此时数据块无法访问了
select * from scott.s2
*
error at line 1:
ora-01578: oracle data block corrupted (file # 5, block # 20)
ora-01110: data file 5: '/home/app/oraten/oradata/oraten/tbs201.dbf'
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
其它类似信息

推荐信息