关于oracle与磁盘i/o的困惑,请高手解答。

xyzhh 2005-05-20 04:01:16
DBWR,LGWR通常每3秒进行一次写入,那么说orale每3秒做一次i/o,在这期间,假如说我取了1万块钱,执行commit,那么数据应该还未写入硬盘,如果此时断电,重启,那么可以根据日志恢复数据的一致性,但是,我的1万元的取款记录还没写道硬盘里,是不是就白取了?
如果每commit一次,oracle就做一次磁盘i/o,那么效率是不是太低了?
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nebulaly 2005-05-24
  • 打赏
  • 举报
回复
所以LGWR是顺序写入的
everydream 2005-05-23
  • 打赏
  • 举报
回复
我所知道的(如果不对,大家可以拍砖):
DBW0和LGWR是两个相互独立的Oracle后台进程,
LGWR发生的条件:1)提交 2)重做日志缓冲区1/3满 3)重做日志超过1M 4)在DBW0之前
DBW0发生的条件:1)脏缓冲区多 2)空闲冲区少 3)超时(3秒) 4)发生检查点(CKPT)
楼主提到的情况,数据确实没有写到数据文件中(没有发生DBW0),但是已经发生了LGWR(已经执行commit),此时发生断电,当重新启动历程后,由SMON后台进程负责执行自动恢复:
首先系统回进行一个前滚(Roll Forward),根据重做日志将已提交和未提交的数据全部写入。然后再执行一个回滚(Roll Back),整个过程的执行要用到回退段(RollBack Segment)的信息。经过这样的操作,1万元是不会白取的!!
cccclb 2005-05-23
  • 打赏
  • 举报
回复
Oracle应该不是你说的那样操作吧?
tomhuang 2005-05-23
  • 打赏
  • 举报
回复
commit前数据在回滚段里,也是在磁盘上,commit是把回滚段的数据写入正式的表。
tomhuang 2005-05-23
  • 打赏
  • 举报
回复
commit后数据就写入磁盘了,不会丢失的。
xyzhh 2005-05-23
  • 打赏
  • 举报
回复
当然,机房一般用的都是有ups的专用电,但是基于国情,也会有不用的。
另外,我是想知道理论上会不会有此种情况发生。
xyzhh 2005-05-23
  • 打赏
  • 举报
回复
没人理我?
everydream 2005-05-23
  • 打赏
  • 举报
回复
每次commit是要进行一次I/O,不过不是写数据文件(不是发生DBW0),而是写重做日志文件(发生LGWR),这一点是可以肯定的。这是因为写数据文件每次至少要写一个块的大小,而写重做日志文件只是写几个字节,二者在数量上有数量积的差别。这也是Oralce的精妙之处!
xyzhh 2005-05-23
  • 打赏
  • 举报
回复
根据oracle的资料,I/O合并也应该是最通常3秒钟一次。不论是写入日志也好,回滚也好,数据空间也好,只要想不丢数据,作一次磁盘i/o是不可避免的。要想做到这一点,每次commit就得一次磁盘i/o,这点是很清楚的,然而这样做的效率不可避免大幅度降低,oracle会这样做么?
nebulaly 2005-05-23
  • 打赏
  • 举报
回复
1.LGWR可能会进行I/O合并,最差情况下每次commit都有I/O操作
2.回滚段也受redo log保护
waterye 2005-05-21
  • 打赏
  • 举报
回复
生产数据库居然可以断电, 加ups了

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧