oracle 前滚之后,数据库中的数据可能包含未提交的数据么?

[复制链接]
查看11 | 回复9 | 2021-10-12 20:11:36 | 显示全部楼层 |阅读模式
当数据库发生crash的时候,需要根据日志进行前滚。
前滚之后,数据库中的数据可能包含未提交的数据么?
[1] 好,现在根据文档得知,确实包含了未提交的数据。但是这就产生了一个问题,这个前滚是根据 redo log 实现的,然而 redo log 的形成是根据是否提交【等】来将log buffer 中的数据刷新到 redo log 文件中的!
所以,内存中可能存在未提交的事物在再次开启服务的时候就丢失了!原因是没有被写入 redo log ...=>进而,得知不应该包含未提交的数据...
这个问题困扰了好几天,希望大师们给我解答一下!!


回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
实例恢复后不可能有未提交的数据。
回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
我的意思是在未进行回滚之前!
就是只进行了前滚的过程...
回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
这里的回滚并不是回滚掉数据库里已有的未提交的数据。 在执行一个事物时,首先修改一个块,尽管提交了也会将这个块的前映像写到UNDO中去,当实例启动时,回滚只会去回滚那种比REDO记录的块新,而又未提交的数据。 这是我的理解, 如果错误,望指正
回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
instance recovery
1.rolling forward
open db
2. rollback(用到UNDO)
日志文件-》构造内存-》写到数据文件
没有递交的数据rollback用到UNDO表空间


回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
这个需要看看
回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
本帖最后由 demonat 于 2012-9-27 17:01 编辑
先编辑掉

回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
在commit之前,可能已经写了redo log,写了datafile, 在前滚之后,回滚之前,这些数据都是没提交的数据啊
回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
肯定有,但是回滚之后就木有了
回复

使用道具 举报

千问 | 2021-10-12 20:11:36 | 显示全部楼层
当修复完故障启动实例的时候,Oracle的SMON进程会执行实例恢复,检查控制文件中的STOP SCN号(SCN 有四种1:系统SCN 2:数据文件SCN 3:启动SCN号 4: 终止SCN号) 数据库在正常运行中终止SCN号始终是空的,当数据库正常关闭的时候,会进行完全检查点,并将SCN号更新。当实例崩溃的时候,Oracle还没来得及更新终止SCN号的时候,这时候终止SCN号是空的,当SMON进程检查该终止SCN号是空的,就认为数据库没有正常关闭,于是开始了实例的恢复。
SMON进行实例恢复的时候,会从控制文件中查找检查点位置,根据在控制文件中查找到的检查点位置到联机日志文件中搜索这一位置,然后从该位置开始应用重做条目。重现实例崩溃的那个时间点的状态,这个过程叫做前滚,等待前滚完毕,数据库缓存中会有已经提交的和没有提交的脏数据块。 SMON进程实例恢复完成,并打开数据库,没有被提交的数据将被回滚。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行