关于oracle与磁盘i/o的困惑,请高手解答。
DBWR,LGWR通常每3秒进行一次写入,那么说orale每3秒做一次i/o,在这期间,假如说我取了1万块钱,执行commit,那么数据应该还未写入硬盘,如果此时断电,重启,那么可以根据日志恢复数据的一致性,但是,我的1万元的取款记录还没写道硬盘里,是不是就白取了?
如果每commit一次,oracle就做一次磁盘i/o,那么效率是不是太低了?
问题点数:60、回复次数:11Top
1 楼waterye(Water Ye)回复于 2005-05-21 21:03:29 得分 0
生产数据库居然可以断电, 加ups了Top
2 楼xyzhh(逍遥者寒号)回复于 2005-05-23 08:36:48 得分 0
没人理我?Top
3 楼xyzhh(逍遥者寒号)回复于 2005-05-23 08:40:02 得分 0
当然,机房一般用的都是有ups的专用电,但是基于国情,也会有不用的。
另外,我是想知道理论上会不会有此种情况发生。Top
4 楼tomhuang(春城)回复于 2005-05-23 09:09:44 得分 0
commit后数据就写入磁盘了,不会丢失的。Top
5 楼tomhuang(春城)回复于 2005-05-23 09:11:51 得分 0
commit前数据在回滚段里,也是在磁盘上,commit是把回滚段的数据写入正式的表。Top
6 楼cccclb(磊冰Ben)回复于 2005-05-23 09:38:42 得分 0
Oracle应该不是你说的那样操作吧?Top
7 楼everydream(可口可乐)回复于 2005-05-23 10:13:59 得分 50
我所知道的(如果不对,大家可以拍砖):
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万元是不会白取的!!Top
8 楼nebulaly(极高明而道中庸)回复于 2005-05-23 13:05:13 得分 10
1.LGWR可能会进行I/O合并,最差情况下每次commit都有I/O操作
2.回滚段也受redo log保护Top
9 楼xyzhh(逍遥者寒号)回复于 2005-05-23 13:37:06 得分 0
根据oracle的资料,I/O合并也应该是最通常3秒钟一次。不论是写入日志也好,回滚也好,数据空间也好,只要想不丢数据,作一次磁盘i/o是不可避免的。要想做到这一点,每次commit就得一次磁盘i/o,这点是很清楚的,然而这样做的效率不可避免大幅度降低,oracle会这样做么?Top
10 楼everydream(可口可乐)回复于 2005-05-23 18:08:17 得分 0
每次commit是要进行一次I/O,不过不是写数据文件(不是发生DBW0),而是写重做日志文件(发生LGWR),这一点是可以肯定的。这是因为写数据文件每次至少要写一个块的大小,而写重做日志文件只是写几个字节,二者在数量上有数量积的差别。这也是Oralce的精妙之处!
Top
11 楼nebulaly(极高明而道中庸)回复于 2005-05-24 09:05:10 得分 0
所以LGWR是顺序写入的Top




