RedoLog如何在Oracle中运行?

Ole*_*nko 4 sql database oracle

问题的第一部分:

据我所知,Oracle DB中的RedoLog用于保护数据库免受数据丢失.据我所知,RedoLog的一个例子就是在事务中断后恢复数据.例如,如果意外关闭电力.但我无法理解数据库应用程序更改重做日志DB下次唤醒后直接?数据库提交是否在redoLog中直接更改为DataFiles.或者它只是启动事务并更改缓冲区中的块并将它们标记为脏?但是谁将这些脏块提交给DB文件呢?我怎么能继续被中断的交易?

问题的第二部分:

如果我有这个DML in transacion:让我们假设a = 1id = 1

UPDATE test_table 
SET a = (SELECT a FROM test_table WHERE id = 1) + 1 
WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

我只是在TEST_TABLE中增加了A. 因此,如果事务失败,并且我的DML语句被写入RedoLog,则下次打开DB时将恢复它.但是,如果值的A变化与数据文件中的另一个数据库实例有关.RedoLog中的重做更改向量是什么(实际上可能会发生,可能是在ORACLE RCA中?)它会增加旧值还是新值?

我为我糟糕的英语道歉.将欣赏任何答案.

zar*_*tra 10

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

因此,如果您放电,下次在数据库启动时,从在线重做中启动数据将从在线重做日志文件中转发,然后回滚所有未提交的事务(您的撤消数据也受在线重做日志文件保护) .

关于您的示例,如果您不提交事务,则在数据库恢复后将无法找到更新的数据.如果您的A值已被其他DML更改,则此数据也将存储在联机重做日志文件中,因此首先您的更新将被转发,然后更改该A值的DML 将被转发.