关于数据块已提交状态信息在哪有?

数据块已经提交还是未提交这个信息是通过日志记录的吗?假如一个事务开始,这个事务修改了很多的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 篇文章,拥有财富 21,被 2 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P4 | 发表于 2013-8-26 09:06:36
jackey.qiu 发表于 2013-8-26 06:57
举个极端例子,如果你的buffer只有5M,但是要修改的数据是10M,那么另外5M已经写到了数据文件,当提交或回 ...

数据提交或者回滚和数据是否写入数据文件没得关系,提交时写一条redo表示事物完了,如果数据还在内存中我就去修改相应事物槽的状态啊,锁信息啥的。如果没在内存中我就下次读取的时候去修改,延迟提交就是这样。
回复

使用道具

P4 | 发表于 2013-8-26 06:57:59
举个极端例子,如果你的buffer只有5M,但是要修改的数据是10M,那么另外5M已经写到了数据文件,当提交或回滚的时候,这些已经写到硬盘的数据不会提交或回滚,等到下次访问的时候才提交或回滚,这就是oracle的延迟提交原理,由于buff不够用,发生checkpoint,那么延迟提交的这部分数据不会再redo中进行前滚或回滚,只是等到下次访问这部分数据的时候才会进行提交或回滚。
回复

使用道具

P3 | 发表于 2013-8-23 16:21:31
guo 发表于 2013-8-23 16:11
最近一次的checkpoint之后到日志文件结尾的这些redo信息

我知道是从检查点队列开始的那个LRBA也就是控制文件记录的LRBA到on disk LRBA这段日志,我是想说,如果内存中修改了好多buffer,而日志也记录了这些buffer的变化过程。如果一个buffer里面有多行,server process只修改了几行,剩下没有修改的那几行也会在日志里面记录?
回复

使用道具

guo
P4 | 发表于 2013-8-23 16:11:09
最近一次的checkpoint之后到日志文件结尾的这些redo信息
回复

使用道具

P3 | 发表于 2013-8-23 15:19:01
guo 发表于 2013-8-23 11:26
1、实例崩溃之后,结束scn是空,oracle再次启动,SMON进程检查该终止SCN号是空的,就认为数据库没有正常关 ...

日志文件那么小,就单独的跑这段日志能把崩溃的数据跑回来吗?这个我有点不解,它不借助数据文件吗?
回复

使用道具

guo
P4 | 发表于 2013-8-23 11:26:33
1、实例崩溃之后,结束scn是空,oracle再次启动,SMON进程检查该终止SCN号是空的,就认为数据库没有正常关闭,于是开始了实例的恢复。
2、实例恢复的时候只需要部分redo log,也就是LRBA到on disk LRBA这段日志,将结束scn追平
3、根据redo log,oracle 会将这段改变重演一遍,重现实例崩溃的那个时间点的状态,也就是前滚,等待前滚完毕,数据库缓存中会有已经提交的和没有提交的脏数据块。
4、SMON进程实例恢复完成,并打开数据库,没有提交的数据将被回滚。
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈