Oracle中的RedoLog是如何工作的?

4
第一部分问题: 据我所知,Oracle DB 中的 RedoLog 用于保护数据库免受数据丢失。我理解 RedoLog 的一个例子是在事务中断后恢复数据。例如,如果突然断电。但我无法理解的是,DB 是否会在下次启动时直接应用 RedoLog 中的更改?DB 是否会将在 RedoLog 中的更改直接提交到 DataFiles。或者它只是启动事务并更改缓冲区中的块并将其标记为脏块?但是,谁会将这些脏块提交到 DB 文件中呢?如何继续被中断的事务?
第二部分问题: 如果我有以下 DML 在事务中: 假设 id = 1 的值为 a = 1
UPDATE test_table 
SET a = (SELECT a FROM test_table WHERE id = 1) + 1 
WHERE id = 1;

我刚刚在TEST_TABLE中增加了A的值。所以,如果事务失败,并且我的DML语句被写入RedoLog,它将在下次打开数据库时被还原。但是,如果另一个DB实例在数据文件中更改了A的值,那么重做更改向量在RedoLog中会怎样(实际上可能发生吗,在ORACLE RCA中可能吗?)它会增加旧值还是新值?对于我的糟糕的英语表示歉意。感谢任何答案。

3
请阅读Oracle Database Concepts,并且可能需要参加OCA课程,以便了解Oracle内存架构、进程、重做日志、撤消记录、行和表锁定、并发性、死锁、崩溃恢复、检查点、预读写、事务原子性、一致性、事务隔离、数据库块缓存和其他相关内容,这样才能理解全局。我怀疑在SO或dba.SE(更适合)上可能没有一个答案 - 除非有人把整本书塞到这里。 - YasirA
为什么不使用简单的更新语句呢?UPDATE test_table SET a = a + 1 WHERE id = 1 ; - ypercubeᵀᴹ
1个回答

11

当你执行commit语句时,SGA中的所有缓存数据(已提交和未提交)都会传输到数据库的在线重做日志文件中。这项工作由LGWR(日志写入进程)完成。因此,所有的数据(包括撤销数据)都受在线重做日志文件的保护。DBWR(数据库写入进程)使用惰性算法将数据存储到数据文件中。它会在默认情况下每3秒钟将数据写入数据文件(你可以自定义此值),或者在缓冲区填满80%时,或在发生检查点时。

如果你断电了,在下次启动数据库时,你的数据将从在线重做日志文件进行前滚,然后回滚所有未提交事务(你的撤消数据也受在线重做日志文件的保护)。

关于你的示例,如果你没有提交你的事务,在数据库恢复后你将无法找到更新后的数据。如果你的A值已被不同的DML更改,这个数据也将存储在在线重做日志文件中,所以首先会前滚你的更新操作,然后再前滚更改A值的DML操作。


1
哇,这是一个很棒的解释! - Maheswaran Ravisankar
1
重做日志也包含未提交的数据,这些数据也会被发送到最终的备用数据库。如果重做流以提交结束,数据将被固定,并在恢复时进行恢复。 - user123664
1
@ik_zelf,就像我所说的,“所有数据(包括撤销数据)都受在线重做日志文件的保护”,不管怎样,感谢您的评论。 - neshkeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接