update的执行后未commit的时候

[复制链接]
查看11 | 回复7 | 2013-1-28 09:12:18 | 显示全部楼层 |阅读模式
update的执行后未commit的时候
还没有commit的时候,这个时候 log buffer中是否存在对应的记录操作日志?
如果有的话,有可能被写入 redo logfile 吗?

回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
log buffer中有记录,没有commit 也会被写入redo logfile,你可以看log buffer写redo logfile 的几个条件,其实commit是其中一个。
回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
都会有的
回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
会有的
回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
那么如果一个很大的事务,比如update 一个很大的表,其中执行期间会redo logfile都会切换好几个来回。
如果后面我选择了rollback ,我们知道logfile的切换会导致对应的data file中的部分会被dbwr进程写入。那么如果这个时候把oracle进程杀死
我试了一下,oracle起来之后还是可以正常。我想应该是实例恢复的回滚了的原因。那么redo logfile中写入的日志信息应该是要支持重演。
我想在实例恢复的时候回滚表空间有用途吗?
回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
会的,有时候事物过大的话也会被写出
回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
本帖最后由 ydwangd1987 于 2013-8-10 01:14 编辑
参见Oracle官方文档
http://docs.oracle.com/cd/E11882_01/server.112/e25789/process.htm#CNCPT1251
描述如下
Note:
LGWR can write redo log entries to disk before a transaction commits. The redo entries become permanent only if the transaction later commits.在一个事务提交之前,LGWR有可能已经把位于log buffer中的该事务所对应的redo log entries写入到online redo log file中。
因为处理commit之外以下情况也会导致LGWR工作:
三分之一的log buffer写满online redo log的切换每隔三秒钟或者redo log buffer中积累的1M的数据DBWn触发LGWR(即write-ahead protocol),如果DBWn发现要同步到磁盘上的数据所对应的redo log entries还没有刷新到online redo log file上,就会触发LGWR。
所以在未commit之前是有可能被写入到online redo log file上的。

回复

使用道具 举报

千问 | 2013-1-28 09:12:18 | 显示全部楼层
ydwangd1987 发表于 2013-8-10 01:12
参见Oracle官方文档
http://docs.oracle.com/cd/E11882_01/server.112/e25789/process.htm#CNCPT1251
描述 ...

谢谢,这个我也是明白的,其实我是想知道,假设update执行了一个很大的事务,然后相对应的redo log已经写入了redo logfile中了,但是如果后面执行了rollback的话或者说这个时候系统断电的话,在update期间我已经执行了 checkpoint,就是有部分data也已经被写入了datafile文件中了,然后oracle起来后是如何回滚这些已经被更新的data的呢?我在启动的时候把undo表空间指向了另一个表空间。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行