2 ashic ashic 于 2017.01.05 09:52 提问

Oracle如何避免partial write 10C

本人小菜鸟一枚,最近在学习MySQL(边学MySQL边对比Oracle)时遇到一个问题
MySQL通过double write避免了partial page write.这个partial page write感觉就相当于Oracle的split block.那么Oracle如何保证写脏块时不会产生split block呢?

我知道rman可以避免split block是因为它以oracle block size作为最小IO单位,如果发现checksum不一致,就会重读,通过反复读避免split block. 当执行手工begin backup命令时,each time a block is changed the datbase writes the before-image of the entire block to the redo stream before modifying the block. Then, the database also records the changes to the block in the redo log,通过将oracle block的前镜像写入redo,使得在恢复是能够获取oracle block的整个before-image,以此为基础,在通过redo中的记录进行恢复.所以如果想要恢复split block,是要有该split block的整个前镜像的吧.

但是在正常的dbwr写脏块时,是不会记录befor-image到redo的吧.那么Oracle怎么解决这个问题啊

1个回答

Zhanjr
Zhanjr   2017.01.05 10:18

oracle如何处理页断裂
oracle与mysql一样,采用的redo日志也是逻辑物理格式,但没有doublewrite技术。我一直就想着oracle这么牛逼的数据库,一定有它自己的方式来应对这种问题。找了N久资料,中文的英文的,包括咨询大神,基本能得出一个结论:oracle遇到页断裂问题,一样会挂,重启不来。但是oracle有一个相对简单的策略来恢复数据库到一致状态,备份+归档日志。备份保证了数据页不发生页断裂,加上归档日志增量可以恢复到某个时间点。为什么不做呢?我想一般使用oracle都会使用DataGuard做容灾,主库发生故障时,备库会承担起主库的责任,然后异常主库通过备份+归档日志的方式来恢复,虽然不如doublewrite技术快,但也是能恢复出来的。

Zhanjr
Zhanjr 回复Fan_-_: 如果觉得答案对你有所帮助麻烦点下采纳,谢谢
10 个月之前 回复
ashic
ashic 回复Zhanjr: 再等等
12 个月之前 回复
Zhanjr
Zhanjr 回复Fan_-_: 如果觉得答案对你有所帮助麻烦点下采纳,谢谢
12 个月之前 回复
Zhanjr
Zhanjr 如果觉得答案对你有所帮助麻烦点下采纳,谢谢
12 个月之前 回复
ashic
ashic 我也是找了好久资料,ITPUB啥的都问了,感觉他们都没说出个所以然,也许真的向您说的这样,谢谢
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!