sql - RedoLog 在 Oracle 中是如何工作的?

标签 sql database oracle

The First part of question:

据我所知,Oracle 数据库中的 RedoLog 用于保护数据库免受数据丢失。据我了解,RedoLog 职责的一个示例是在事务中断后恢复数据。例如,如果电源意外关闭。但我不明白数据库是否会在数据库下次醒来后立即在重做日志中应用更改? DB 是否将 redoLog 中的更改直接提交到 DataFiles。或者它只是启动事务并更改缓冲区中的 block 并将它们标记为脏?但是谁将这些脏 block 提交给数据库文件呢?我如何才能继续中断的交易?

Second part of the question:

如果我在事务中有这个 DML: 让我们假设 a = 1 对于 id = 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 中?)它会增加旧值还是新值?

我为我糟糕的英语道歉。将不胜感激任何答案。

最佳答案

当您执行commit 语句时,所有来自SGA 的缓存数据(已提交和未提交)都会进入您数据库的联机重做日志文件。这项工作由 LGWR(Log writer process)完成。所以所有数据(甚至是撤消数据)都受到联机重做日志文件的保护。 DBWR (DataBase WRiter) 进程使用惰性算法将数据存储到数据文件中。它每 3 秒(默认情况下,您可以自定义此值)将数据写入数据文件,或者如果您的缓冲区已填满 80%,或者如果出现检查点。

因此,如果您断电,下次在数据库启动期间,您的联机重做数据将从联机重做日志文件中前滚,然后回滚所有未提交的事务(您的撤消数据也受联机重做保护日志文件)。

关于你的例子,如果你不提交你的事务,你将在数据库恢复后找不到更新的数据。如果您的 A 值已被不同的 DML 更改,此数据也将存储在联机重做日志文件中,因此首先您的更新将前滚,然后是更改 的 DML 值将被前滚。

关于sql - RedoLog 在 Oracle 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286930/

相关文章:

mysql - 从Rails 3中的ActiveRecord查询MySQL中的一个月或一周的日期

sql - 有没有办法通过 SQL 获取不带扩展名的文件名?

database - Oracle 针对高容量写入和低容量读取的建议

sql - Oracle 中的 varchar(max) 相当于什么?

java - 如何将空字符串更新到oracle Clob

oracle - 在 GROUP BY 查询中将值聚合到表类型中

sql - 如何填补 MySQL 中的日期空白?

sql - Count(*) with order by not working on PostgreSQL which works on Oracle

mysql - 重新排序/重置自动增量主键

database - 有没有办法为 Postgres 列强制执行特定的字符串结构?