关于数据块已提交状态信息在哪有?
数据块已经提交还是未提交这个信息是通过日志记录的吗?假如一个事务开始,这个事务修改了很多的buffer,而且事务运行的时间很长,其中一部分修改buffer的日志已经从log buffer 写入了redo log,一部分还在log buffer里面。如果这个时候事务进行了提交,那oracle会写二次关于修改提交的日志吗(说这个事务修改的这几个buffer已经提交)?如果实例突然崩溃了,oracle会根据日志记录的那些事务已经提交,这些事务包括那些buffer,然后根据对这些buffer的修改,通过日志文件和数据文件把buffer cache中那些已提交但是未写入数据文件的buffer和未提交但是已经写入redo log里面的buffer构造出来吗?这个跑日志恢复实例会不会用到数据文件呢?还是单独的跑SCN日志文件的LRBA到on disk LRBA这段日志就能把buffer cache回复出来? 1、实例崩溃之后,结束scn是空,oracle再次启动,SMON进程检查该终止SCN号是空的,就认为数据库没有正常关闭,于是开始了实例的恢复。2、实例恢复的时候只需要部分redo log,也就是LRBA到on disk LRBA这段日志,将结束scn追平
3、根据redo log,oracle 会将这段改变重演一遍,重现实例崩溃的那个时间点的状态,也就是前滚,等待前滚完毕,数据库缓存中会有已经提交的和没有提交的脏数据块。
4、SMON进程实例恢复完成,并打开数据库,没有提交的数据将被回滚。 guo 发表于 2013-8-23 11:26 static/image/common/back.gif
1、实例崩溃之后,结束scn是空,oracle再次启动,SMON进程检查该终止SCN号是空的,就认为数据库没有正常关 ...
日志文件那么小,就单独的跑这段日志能把崩溃的数据跑回来吗?这个我有点不解,它不借助数据文件吗? 最近一次的checkpoint之后到日志文件结尾的这些redo信息 guo 发表于 2013-8-23 16:11 static/image/common/back.gif
最近一次的checkpoint之后到日志文件结尾的这些redo信息
我知道是从检查点队列开始的那个LRBA也就是控制文件记录的LRBA到on disk LRBA这段日志,我是想说,如果内存中修改了好多buffer,而日志也记录了这些buffer的变化过程。如果一个buffer里面有多行,server process只修改了几行,剩下没有修改的那几行也会在日志里面记录? 举个极端例子,如果你的buffer只有5M,但是要修改的数据是10M,那么另外5M已经写到了数据文件,当提交或回滚的时候,这些已经写到硬盘的数据不会提交或回滚,等到下次访问的时候才提交或回滚,这就是oracle的延迟提交原理,由于buff不够用,发生checkpoint,那么延迟提交的这部分数据不会再redo中进行前滚或回滚,只是等到下次访问这部分数据的时候才会进行提交或回滚。 jackey.qiu 发表于 2013-8-26 06:57 static/image/common/back.gif
举个极端例子,如果你的buffer只有5M,但是要修改的数据是10M,那么另外5M已经写到了数据文件,当提交或回 ...
数据提交或者回滚和数据是否写入数据文件没得关系,提交时写一条redo表示事物完了,如果数据还在内存中我就去修改相应事物槽的状态啊,锁信息啥的。如果没在内存中我就下次读取的时候去修改,延迟提交就是这样。
页:
[1]