DB2 BLOB字段的not logged属性

最近一个客户因为机房停电,造成DB2数据库无法启动。用在线备份恢复数据库后前滚数据,发现数据是正常的,唯独一些大字段的值被置成了二进制0。对此问题研究并反复测试后,最终确认是BLOB字段设置成not logged而造成的。

 

这个属性的意思就是在更新和新增BLOB字段值时,不会将修改和新增的BLOB的数据的值写入归档日志。归档日志中只会记录字段被更新了,但更新的具体内容不记录。

 

数据库崩溃后,用在线备份来恢复数据库,然后前滚数据到一个时间点,那么从备份时间,到这个时间点之间,修改和新增的大字段数据被置成二进制0。因为在前滚的时候,数据库是按照归档日志来恢复数据库的,归档日志库中只记录了字段被修改,没有记录修改成什么,那数据库只好把他们都置0了。如果前滚到最小时间点,那应该是不会有数据被置0,因为备份时间到最小时间点之间,不会有大字段更新。

 

默认情况下,这个属性是logged的。如果表已经新建,又想改为not logged的话,比较麻烦,需要将数据导出,drop掉表,新建表,然后把数据导回去。

 

IBM这样设计主要考虑到性能问题,因为大字段可能会有好几G大小,在更新的数据文件的同时,在把这些数据写入归档日志,一方面归档日志会增长的很快,另一方面对IO也是个巨大的压力。所以,如果大字段很大的话,最好设置成not logged的。

 

解决这个问题的办法:

方法一、修改属性为logged,记录内容。这个方法的前提是,评估对系统形成造成的影响,并合理的配置IO。IBM专家的建议是,将数据,归档日志,活动日志放在不同的卷组上,使用不同的IO

方法二、使用离线备份的方法,离线备份恢复时不需要前滚,自然也用不上归档日志了。但这样会把备份后的数据丢掉了,只能通过重做数据来做了。但这也比数据被置0好。看用户是否能接受了。

 

 

你可能感兴趣的:(数据库,IO,db2,活动,IBM,测试)