您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 数据库恢复的内在机制
当事务被提交时,该事务的变更的REDO信息会确保已经存入到联机日志文件。但是事务涉及到的数据块的修改写入数据文件是一个异步的过程。检查点和检查点进程推动这种异步机制的同步过程,而且直接影响了数据库实例恢复有关的行为。本章讨论的中心内容是:数据库自身如何确定什么时候需要恢复、实例恢复的详细内部过程、其他一些相关讨论主题数据库在“事务”当中发生变化,Oraccle数据库系统使用系统变更号(SystemChangeNumber,简写为SCN)来记录数据库内部的变化。数据库内部的很多事件,以及用户通过SQL语句对数据库内容进行变化,会让SCN值增长。我们知道,当应用程序提交(Commit)某个事务时,先是日志写入进程(LGWR)将LogBuffer中的该事务的纪录写入到联机重做日志文件成功后,才由ServiceProcess通知相关的用户进程:你的提交已成功。检查点出现,将推动检查点时刻前的日志文件中所参考的数据块的修改,已经被DBWR写入到数据文件中。CKPT进程会纪录该检查点的CheckpointSCN的信息到数据文件和控制文件中。从而推动了数据库的一个“同步点”。如果在下一个同步点完成之前,数据库发生失败,在数据库的实例恢复从系统当前检查点开始,运用后面的日志进行实例恢复。可以看出,检查点的出现,可以让数据库在运行时,“定期”的维护日志文件,数据文件进行状态一致性。有些类似于我们生活中:定期的不同的公司的账目结清,当一个检查点完成后,大家都承认,这个时间之前的一切账目已经结清。一、Oracle是如何确定需要恢复的1、正常运行的数据库的有关检查点信息纪录在数据库正常OPEN运行时,当一个检查点完成后,Oracle存储新的SystemCheckpointSCN值到控制文件中,我们可以通过下面的查询来得到该值。SQLselecta.CHECKPOINT_CHANGE#fromv$databasea;CHECKPOINT_CHANGE#------------------2798752785243SQLselecta.NAME,a.CHECKPOINT_CHANGE#fromv$datafilea;NAMECHECKPOINT_CHANGE#--------------------------------------------------------------------------------------C:\ORACLE\ORADATA\JACKY\SYSTEM01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\UNDOTBS01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\CWMLITE01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\DRSYS01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\EXAMPLE01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\INDX01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\ODM012798752785243C:\ORACLE\ORADATA\JACKY\TOOLS01.DBF2798752785243D:\DATAFILE\USERS01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\XDB01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\BLOCK.DBF2798752785243C:\ORACLE\ORADATA\JACKY\RMAN.DBF2798752785243C:\ORACLE\ORADATA\JACKY\TEST01.DBF279875278524313rowsselectedOracle也会在每个数据文件的头部存储存储CheckpointSCN的值,名称叫做StartSCN。主要作用是在数据库Open的时候,用于和控制文件有关信息进行比较,从而确定是否需要做恢复。SQLselecta.NAME,a.CHECKPOINT_CHANGE#fromv$datafile_headera;NAMECHECKPOINT_CHANGE#--------------------------------------------------------------------------------------C:\ORACLE\ORADATA\JACKY\SYSTEM01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\UNDOTBS01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\CWMLITE01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\DRSYS01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\EXAMPLE01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\INDX01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\ODM012798752785243C:\ORACLE\ORADATA\JACKY\TOOLS01.DBF2798752785243D:\DATAFILE\USERS01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\XDB01.DBF2798752785243C:\ORACLE\ORADATA\JACKY\BLOCK.DBF2798752785243C:\ORACLE\ORADATA\JACKY\RMAN.DBF2798752785243C:\ORACLE\ORADATA\JACKY\TEST01.DBF279875278524313rowsselectedOracle在控制文件为每个数据文件存储StopSCN的值,在正常OPEN的数据库中,该值为一个无穷大,查询时,显示NULL。SQLselecta.NAME,a.LAST_CHANGE#fromv$datafilea;NAMELAST_CHANGE#--------------------------------------------------------------------------------------------C:\ORACLE\ORADATA\JACKY\SYSTEM01.DBFC:\ORACLE\ORADATA\JACKY\UNDOTBS01.DBFC:\ORACLE\ORADATA\JACKY\CWMLITE01.DBFC:\ORACLE\ORADATA\JACKY\DRSYS01.DBFC:\ORACLE\ORADATA\JACKY\EXAMPLE01.DBFC:\ORACLE\ORADATA\JACKY\INDX01.DBFC:\ORACLE\ORADATA\JACKY\ODM01.DBFC:\ORACLE\ORADATA\JACKY\TOOLS01.DBFD:\DATAFILE\USERS01.DBFC:\ORACLE\ORADATA\JACKY\XDB01.DBFC:\ORACLE\ORADATA\JACKY\BLOCK.DBFC:\ORACLE\ORADATA\JACKY\RMAN.DBFC:\ORACLE\ORADATA\JACKY\TEST01.DBF13rowsselected2、正常关闭的数据库的有关检查点记录信息当我们正常关闭数据库(Shutdownimmediate或者Shutdownnormal),此时会执行一个检查点的过程,该过程会把控制文件中记录的每个数据文件的StopSCN进行设置,等于每个数据文件头部的StartSCN。所以,我们以startmount加载数据库,然后进行上面的查询。得到下图的结果:正常关闭数据库,在Mount模式下启动数据库,查询SystemCheckpointSCN和DataFileCheckpointSCN以及StartSCN、StopSCN变得一致。SQLstartupmount;ORACLE例程已经启动。TotalSystemGlobalArea135338868bytesFixedSize453492bytesVariableSize109051904bytesDatabaseBuffers25165824bytesRedoBuffers667648bytes数据库装载完毕。SQLselectcheckpoint_change#fromv$database;CHECKPOINT_CHANGE#------------------2.7988E+12SQLselectname,checkpoint_change#,last_change#fromv$datafilewherenamelike'%USER%';NAMECHECKPOINT_CHANGE#LAST_CHANGE#-------------------------------D:\DATAFILE\USERS01.DBF2.7988E+122.7988E+12SQL在OPEN数据库时,Oracle先检查数据文件头部所记录的StartSCN和控制文件中所记录的数据文件的CheckpointSCN是否一致,如果一致,Oracle进一步检查StartSCN和控制文件中记录的数据文件的StopSCN,如果一致。这表示所有的已经被修改的数据块已经反映到了数据文件中。在是正常关闭数据库的情况。数据库可以正常OPEN,无需作实例恢复,当数据库打开后,控制文件中的StopSCN会变为NULL。SQLalterdatabaseopen;数据库已更改。SQLselectname,checkpoint_change#,last_change#fromv$datafilewherenamelike'%USER%';NAMECHECKPOINT_CHANGE#HANGE#--------------------------------------------------------------------------------D:\DATAFILE\USERS01.DBF2.7988E+12数据库在打开时,对每个数据文件要进行两个比对:A、控制文件中记录的数据文件的CheckpointSCN和数据文件头部所记录的StartSCN是否相等;B、然后检查:控制文件中记录数据文件的StopSCN和数据文件头部所记录的StartSCN是否相等;3、实例Crash后的有关检查点记录信息SQLcreatetabletest(anumber)tablespacetest;TablecreatedSQLinsertintotestvalues(1);1rowinsertedSQLshutdownabortORACLE例程已经关闭。SQLstartupmountORACLE例程已经启动。TotalSystemGlobalArea135338868bytesFixedSize453492bytesVariableSize109051904bytesDatabaseBuffers25165824bytesRedoBuffers667648bytes数据库装载完毕。SQLselectcheckpoint_change#fromv$database;CHECKPOINT_CHANGE#------------------2.7988E+12SQLselectname,checkpoint_change#,last_change#fromv$datafilewherenamelike'%TEST%';NAMECHECKPOINT_CHANGE#LAS
本文标题:数据库恢复的内在机制
链接地址:https://www.777doc.com/doc-2332918 .html