以下是一本甲骨文书的摘录
在缓存恢复期间,Oracle从上一个检查点开始从联机重做日志文件中重放事务。在此前滚操作期间,提交和未提交的更改都应用于数据文件。在前滚操作结束时,数据文件将具有提交的更改、写入数据文件以释放缓冲区缓存空间的未提交更改以及前滚操作应用的未提交更改。一旦完成缓存恢复,就可以打开数据库。
上面粗体的句子是我不明白的。由于重做日志文件的所有信息都是在提交后记录的,那么重做日志文件如何生成未实现的数据?
而且上面写着
在实例恢复的事务恢复阶段,Oracle应用撤销块回滚数据块中未提交的更改,这些更改要么是在实例崩溃之前写入的,要么是在缓存恢复期间由前滚操作编写的。
我理解,如果脏块被写入磁盘而没有事先提交(如果有可能的话),在事务恢复期间,可以使用撤销块回滚它们。但是,如何才能撤消块可以用来回滚未提交的更改(这些更改是什么?)通过在缓存恢复期间重放重做日志而引入的?
嗯,我不明白,因为在线重做日志应该只包含提交的信息,在实例恢复期间创建未公开的信息。
发布于 2017-01-04 00:23:58
重做日志文件如何生成未提交的数据,因为它的所有信息都是在提交后记录的?
LGWR进程将重做日志从重做日志缓冲区缓存刷新为联机重做日志文件。
DBWn进程将脏缓冲区写入磁盘。这些触发器都会重新执行刷新,其中可能包括未提交的事务。
但是,如何才能撤销块可以用来回滚未提交的更改(这些更改到底是.)通过在缓存恢复期间重放重做日志而引入的?
让我举一个例子,假设您有一个数据块,其中包含一个带有值5的单列行。您只需尝试使用update tbl set col1=6更新它。在此过程中,将生成撤销以再现其原始值,即5,并生成重做以答复事务,即再现最新的值,即6。
接下来,如果此事务未提交且不幸的实例崩溃,则在下一次启动期间,Oracle (特别是SMON进程)获取需要恢复到缓冲区缓存中的块,并使用重做日志重新应用更改,如果有人试图读取您之前修改过的行,则Oracle只是将包含该行的数据块回滚到其原始值(即使用undo的原始值5)。
更新:从这个博客中提取以下警告日志摘录。
ALTER DATABASE OPEN
Beginning crash recovery of 1 threads
Started redo scan
Completed redo scan
read 80458 KB redo, 1721 data blocks need recovery
Started redo application at
Thread 1: logseq 490, block 52626
Recovery of Online Redo Log: Thread 1 Group 1 Seq 490 Reading mem 0
Mem# 0: /home/oracle/app/oracle/oradata/orcl/redo01.log
Recovery of Online Redo Log: Thread 1 Group 2 Seq 491 Reading mem 0
Mem# 0: /home/oracle/app/oracle/oradata/orcl/redo02.log
Recovery of Online Redo Log: Thread 1 Group 3 Seq 492 Reading mem 0
Mem# 0: /home/oracle/app/oracle/oradata/orcl/redo03.log
Completed redo application of 15.26MB
Completed crash recovery at
Thread 1: logseq 492, block 31015, scn 6082434
1721 data blocks read, 1721 data blocks written, 80458 redo k-bytes read
Sun Jan 09 00:50:27 2011这清楚地表明块号1721需要恢复。为了做到这一点,将块加载到内存中(缓冲器缓存)并进行重做。该块在恢复后被写回数据文件。
这也解释在(第9章重做和撤消,如何重做和撤消一起工作,页面)专家甲骨文架构第三版书托马斯凯特。
来自ASKTOM
嗨汤姆
感谢后续smon会阅读并在恢复阶段对它们进行重做。
https://dba.stackexchange.com/questions/159894
复制相似问题