实例失败后当重启数据库,实例恢复自动进行,可我模拟了一下实例失败(断电),重启后内存的东西没了啊

解决方案 »

  1.   

    内存里的数据,如果提交了,那么就能在数据库中查询到;如果未提交就没有了。
    要想看实例是否自动恢复,看alert的日志就能看到了
    在里面有相关的记录
      

  2.   

    你是怎么测试到实例恢复失败的呢?
    数据库启动是,会重新分配内存的。如果你已经COMMIT你的操作,数据库会通过SMON进程来进行实例恢复的(主要通过REDO和UNDO操作来完成)
      

  3.   

    下次启动数据库时,oracle自动进行的实例恢复。注意一点,这针对的是已经提交的事务。
      

  4.   

    实例恢复的原理是自上一次checkpoint以来,先redo已经提交的事务,再undo未提交的事务。如果断电的时候,有事务未提交,其内存中的数据当然不存在。
      

  5.   

    断电前提交或未提交的事务在日志文件中都有记录。断电后,内存中的数据都会丢失,实例恢复的时候,需要从物理文件中重新读取相应的数据块进高速缓冲区中,依照日志文件对这些数据块进行操作。基于事务的ACID原则,对于未提交的事务其对应的数据是不能持久性保存的。也就是,对于未提交的事务,其数据肯定还没有刷新到物理文件中。
      

  6.   

    实例恢复的原理
     
    当数据库突然崩溃,而还没有来得及将buffer cache里的脏数据块刷新到数据文件里,同时在实例崩溃时正在运行着的事务被突然中断,则事务为中间状态,也就是既没有提交也没有回滚。这时数据文件里的内容不能体现实例崩溃时的状态。这样关闭的数据库是不一致的。
    下次启动实例时,Oracle会由SMON进程自动进行实例恢复。实例启动时,SMON进程会去检查控制文件中所记录的、每个在线的、可读写的数据文件的END SCN号。数据库正常运行过程中,该END SCN号始终为空,而当数据库正常关闭时,会进行完全检查点,并将检查点SCN号更新该字段。而崩溃时,Oracle还来不及更新该字段,则该字段仍然为空。当SMON进程发现该字段为空时,就知道实例在上次没有正常关闭,于是由SMON进程就开始进行实例恢复了。
    SMON进程进行实例恢复时,会从控制文件中获得检查点位置。于是,SMON进程到联机日志文件中,找到该检查点位置,然后从该检查点位置开始往下,应用所有的重做条目,从而在buffer cache里又恢复了实例崩溃那个时间点的状态。这个过程叫做前滚,前滚完毕以后,buffer cache里既有崩溃时已经提交还没有写入数据文件的脏数据块,也还有事务被突然终止,而导致的既没有提交又没有回滚的事务所弄脏的数据块。
     
    前滚一旦完毕,SMON进程立即打开数据库。但是,这时的数据库中还含有那些中间状态的、既没有提交又没有回滚的脏块,这种脏块是不能存在于数据库中的,因为它们并没有被提交,必须被回滚。打开数据库以后,SMON进程会在后台进行回滚。
    有时,数据库打开以后,SMON进程还没来得及回滚这些中间状态的数据块时,就有用户进程发出读取这些数据块的请求。这时,服务器进程在将这些块返回给用户之前,由服务器进程负责进行回滚,回滚完毕后,将数据块的内容返回给用户。