本文共 1602 字,大约阅读时间需要 5 分钟。
Oracle引入了检查点机制来解决LGWR和DBWR可能导致的不一致问题,从而确保数据库的一致性。检查点分为完全检查点和增量检查点两种形式。
在Oracle8i之前,所有检查点都是完全检查点。完全检查点会将数据缓冲区中的所有脏数据块写入数据文件,并同步数据文件和控制文件,确保数据库一致性。从8i开始,完全检查点仅在以下两种情况下发生:
ALTER SYSTEM CHECKPOINT命令IMMEDIATE、TRANSACTIONAL、NORMAL)完全检查点会导致大量IO操作,严重影响性能。因此,Oracle在8i后引入了增量检查点。
Oracle从8i开始使用检查点队列来实现增量检查点。检查点队列记录了数据库中所有脏数据块的信息,DBWR根据队列内容将脏数据块写入数据文件。队列中的条目按时间顺序记录,每个条目包含RBA、数据文件号和块号。即使数据块多次修改,队列中的位置保持不变,只记录最早的RBA,确保最早修改的数据块优先写入。
检查点队列的核心是通过每3秒一次的“心跳”(心跳记录在控制文件中)来更新检查点位置。Oracle提供了四个参数来控制检查点位置和重做日志末尾的距离,这四个参数实际用于控制队列中的条目数量,而不是检查点发生的频率。
fast_start_io_target
fast_start_io_target设置为30,000。 fast_start_mttr_target
fast_start_mttr_target为600秒后,fast_start_io_target将失效。 log_checkpoint_timeout
log_checkpoint_interval
除了上述四个参数外,Oracle还会将重做日志文件末尾前90%的位置设为检查点位置。在每个重做日志中,这些位置可能不同,Oracle会选择离日志末尾最近的位置作为实际检查点位置。
基于检查点队列
在9i后,增量检查点通过队列记录脏数据块信息,DBWR按队列顺序写入数据文件。这种机制使得Instance Recovery时可以从队列中的最大RBA开始,而不是从上一次检查点的SCN开始,大大缩短恢复时间。两次重做日志扫描
在应用重做日志之前,日志会被扫描以确定哪些记录需要应用。9i新增了DBWR写入日志的信息,使得早期的日志不会被应用。Rollforward和Rollback
在Instance Recovery时,必须先定位到重做日志并应用所有日志。Rollforward包括提交和未提交的数据。Rollback由smon和on-demand rollback完成,清理未提交的事务。数据块更新必然写入回滚段
数据块更新会记录前镜像,确保恢复时可以重建原有的数据状态。回滚段的事务状态
回滚段记录了事务的状态,帮助恢复时识别已提交或未提交的事务。Instance Crash后的恢复流程
通过这样的机制,Oracle确保了在Instance Crash后,数据库能够快速恢复到一致状态。
转载地址:http://eepfk.baihongyu.com/