生产数据库居然可以断电, 加ups了

解决方案 »

  1.   

    当然,机房一般用的都是有ups的专用电,但是基于国情,也会有不用的。
    另外,我是想知道理论上会不会有此种情况发生。
      

  2.   

    commit后数据就写入磁盘了,不会丢失的。
      

  3.   

    commit前数据在回滚段里,也是在磁盘上,commit是把回滚段的数据写入正式的表。
      

  4.   

    Oracle应该不是你说的那样操作吧?
      

  5.   

    我所知道的(如果不对,大家可以拍砖):
    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万元是不会白取的!!
      

  6.   

    1.LGWR可能会进行I/O合并,最差情况下每次commit都有I/O操作
    2.回滚段也受redo log保护
      

  7.   

    根据oracle的资料,I/O合并也应该是最通常3秒钟一次。不论是写入日志也好,回滚也好,数据空间也好,只要想不丢数据,作一次磁盘i/o是不可避免的。要想做到这一点,每次commit就得一次磁盘i/o,这点是很清楚的,然而这样做的效率不可避免大幅度降低,oracle会这样做么?
      

  8.   

    每次commit是要进行一次I/O,不过不是写数据文件(不是发生DBW0),而是写重做日志文件(发生LGWR),这一点是可以肯定的。这是因为写数据文件每次至少要写一个块的大小,而写重做日志文件只是写几个字节,二者在数量上有数量积的差别。这也是Oralce的精妙之处!