Fan_-_ 2017-01-05 01:52 采纳率: 100%
浏览 1156
已采纳

Oracle如何避免partial write

本人小菜鸟一枚,最近在学习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 2017-01-05 02:18
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置