二次写功能(DOUBLE WRITE)

背景说明

当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失。 这时是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。 二次写功能通过备份原始页的一个副本去解决页面部分写失效。

介绍

每次内存中页面进行回刷时先将页面回刷至DOUBLE WRITE文件,再将该页面回刷至数据文件。 尽管这样导致数据总是写入两次,但数据库内部针对二次写进行了优化,并不需要两倍的I / O开销或两倍的I / O操作。

当数据库进行实例恢复时, 如果发现数据页面校验数据失败, 则使用DOUBLE WRITE文件中的页面进行替换。

注解

DOUBLE WRITE文件必须是前一个数据库生命周期生成的,不可以跨越周期,否则发生不可预测的问题。

例如:oscar服务起来后创建DOUBLE WRITE文件并向文件中写入数据,关闭数据库,将DOUBLE WRITE文件移至其他位置a,这时再启动数据库,会创建一个新的DOUBLE WRITE文件并写入数据。 宕机后将位置a的DOUBLE WRITE文件替换掉了当前的DOUBLE WRITE文件,这时起服务,有可能误用该文件。严禁发生类似的情况。

DOUBLE WRITE文件创建在odbs下的实例名目录,后缀名为dw。

参数

ENABLE_DOUBLE_WRITE 是否开始二次写功能,默认开启。

注解

二次写功能依赖于crc校验,所以必须开启ENABLE_CHECK_SUM。