当我们使用一个数据库时总希望数据库的内容是可靠的正确的但由于计算机系统的故障(硬件故障软件故障网络故障进程故障和系统故障)影响数据库系统的操作影响数据库中数据的正确性甚至破坏数据库使数据库中全部或部分数据丢失因此当发生上述故障后希望能重新建立一个完整的数据库该处理称为数据库恢复恢复子系统是数据库管理系统的一个重要组成部分恢复处理随所发生的故障类型所影响的结构而变化
()恢复数据库所使用的结构
ORACLE数据库使用几种结构对可能故障来保护数据数据库后备日志回滚段和控制文件
数据库后备是由构成Oracle数据库的物理文件的操作系统后备所组成当介质故障时进行数据库恢复利用后备文件恢复毁坏的数据文件或控制文件
日志每一个Oracle数据库实例都提供记录数据库中所作的全部修改一个实例的日志至少由两个日志文件组成当实例故障或介质故障时进行数据库部分恢复利用数据库日志中的改变应用于数据文件修改数据库数据到故障出现的时刻数据库日志由两部分组成在线日志和归档日志
每一个运行的Oracle数据库实例相应地有一个在线日志它与Oracle后台进程LGWR一起工作立即记录该实例所作的全部修改在线日志由两个或多个预期分配的文件组成以循环方式使用
归档日志是可选择的一个Oracle数据库实例一旦在线日志填满后可形成在线日志的归档文件归档的在线日志文件被唯一标识并合成归档日志
回滚段用于存储正在进行的事务(为未提交的事务)所修改值的老值该信息在数据库恢复过程中用于撤消任何非提交的修改
控制文件一般用于存储数据库的物理结构的状态控制文件中某些状态信息在实例恢复和介质恢复期间用于引导Oracle
()在线日志
一个Oracle数据库的每一实例有一个相关联的在线日志一个在线日志由多个在线日志文件组成在线日志文件填入日志项日志项记录的数据用于重构对数据库所作的全部修改后台进程LGWR以循环方式写入在线日志文件当当前的在线日志文件写满后LGWR写入到下一可用在线日志文件当最后一个可用的在线日志文件的检查点已完成时即可使用如果归档不实施一个已填满的在线日志文件一当包含该在线日志文件的检查点完成该文件已被归档后即可使用在任何时候仅有一个在线日志文件被写入存储日志项它被称为活动的或当前在线日志文件其它的在线日志文件为不活动的在线日志文件
Oracle结束写入一在线日志文件并开始写入到另一个在线日志文件的点称为日志开关日志开关在当前在线日志文件完全填满必须继续写入到下一个在线日志文件时总出现也可由DBA强制日志开关每一日志开关出现时每一在线日志文件赋给一个新的日志序列号如果在线日志文件被归档在归档日志文件中包含有它的日志序列号
Oracle后台进程DBWR(数据库写)将SGA中所有被修改的数据库缓沖区(包含提交和未提交的)写入到数据文件这样的事件称为出现一个检查点因下列原因实现检查点
◆检查点确保将内存中经常改变的数据段块每隔一定时间写入到数据文件由于DBWR使用最近最少使用算法经常修改的数据段块从不会作为最近最少使用块如果检查点不出现它从不会写入磁盘
◆由于直至检查点时所有的数据库修改已记录到数据文件先于检查点的日志项在实例恢复时不再需要应用于数据文件所以检查点可加快实例恢复
虽然检查点有一些开销但Oracle既不停止活动又不影响当前事务由于DBWR不断地将数据库缓沖区写入到磁盘所以一个检查点一次不必写许多数据块一个检查点保证自前一个检查点以来的全部修改数据块写入到磁盘检查点不管填满的在线日志文件是否正在归档它总是出现如果实施归档在LGWR重用在线日志文件之前检查点必须完成并且所填满的在线日志文件必须被归档
检查点可对数据库的全部数据文件出现(称为数据库检查点)也可对指定的数据文件出现下面说明一下什么时候出现检查点及出现什么情况
◆在每一个日志开关处自动地出现一数据库检查点如果前一个数据库检查点正在处理由日志开关实施的检查点优于当前检查点
◆初始化参数据LOGCHECKPOINTINTERVAL设置所实施的数据库检查点当预定的日志块数被填满后(自最后一个数据库检查点以来)实施一数据库检查点另一个参数LOGCHECKPOINTTIMEOUT可设置自上一个数据库检查点开始之后指定秒数后实施一数据库检查点这种选择对使用非常大的日志文件时有用它在日志开头之间增加检查点由初始化参数所启动的数据库检查点只有在前一个检查点完成后才能启动
◆当一在线表空间开始后备时仅对构成该空间的数据文件实施一检查点该检查点压倒仍在进行中的任何检查点
◆当DBA使一表空间离线时仅对构成该表空间的在线文件实施一检查点
◆当DBA以正常或立即方式关闭一实例时Oracle在实例关闭之前实施一数据库检查点该检查点压倒任何运行检查点
◆DBA可要求实施一数据库检查点该检查点压倒任何运行检查点
检查点机制当检查点出现时检查点后台进程记住写入在线文件的下一日志行的位置并通知数据库写后台进程将SGA中修改的数据库缓沖区写入到磁盘上的数据文件然后由CKPT修改全部控制文件和数据文件的标头反映该最后检查点当检查点不发生DBWR当需要时仅将最近最少使用的数据库缓沖区写入磁盘为新数据准备缓沖区
镜象在线日志文件为了安全将实例的在线日志文件镜象到它的在线日志文件ORACLE提供镜象功能当具有镜象在线日志文件时LGWR同时将同一日志信息写入到多个同样的在线日志文件日志文件分成组每个组中的日志文件称为成员每个组中的全部成员同时活动由LGWR赋给相同的日志序列号如果使用镜象在线日志则可建立在线日志文件组在组中的每一成员要求是同一大小
镜象在线日志的机制LGWR总是寻找组的全部成员对一组的全部成员并行地写然后转换到下一组的全部成员并行地写
每个数据库实例有自己的在线日志组这些在线日志组可以是镜象的或不是称为实例的在线日志线索在典型配置中一个数据库实例存取一个ORACLE数据库于是仅一个线索存在然而在运行ORACLE并行服务器中两个或多个实例并行地存取单个数据库在这种情况下每个实例有自己的线索
()归档日志
Oracle要将填满的在线日志文件组归档时则要建立归档日志或称离线日志其对数据库后备和恢复有下列用处
◆数据库后备以及在线和归档日志文件在操作系统或磁盘故障中可保证全部提交的事务可被恢复
◆在数据库打开时和正常系统使用下如果归档日志是永久保持在线后备可以进行和使用
如果用户数据库要求在任何磁盘故障的事件中不丢失任何数据那么归档日志必须要存在归档已填满的在线日志文件可能需要DBA执行额外的管理操作
归档机制决定于归档设置归档已填满的在线日志组的机制可由Oracle后台进程ARCH自动归档或由用户进程发出语句手工地归档当日志组变为不活动日志开关指向下一组已完成时ARCH可归档一组可存取该组的任何或全部成员完成归档组在线日志文件归档之后才可为LGWR重用当使用归档时必须指定归档目标指向一存储设备它不同于个有数据文件在线日志文件和控制文件的设备理想的是将归档日志文件永久地移到离线存储设备如磁带
数据库可运行在两种不同方式下NOARCHIVELOG方式或ARCHIVELOG方式数据库在NOARCHIVELOG方式下使用时不能进行在线日志的归档在该数据库控制文件指明填满的组不需要归档所以一当填满的组成为活动在日志开关的检查点完成该组即可被LGWR重用在该方式下仅能保护数据库实例故障不能保护介质(磁盘)故障利用存储在在线日志中的信息可实现实例故障恢复
如果数据库在ARCHIVELOG方式下可实施在线日志的归档在控制文件中指明填满的日志文件组在归档之前不能重用一旦组成为不活动执行归档的进程立即可使用该组
在实例起动时通过参数LOGARCHIVESTART设置可启动ARCH进程否则ARCH进程在实例启动时不能被启动然而DBA在凭借时候可交互地启动或停止自动归档 一旦在线日志文件组变为不活动时ARCH进程自动对它归档
如果数据库在ARCHIVELOG方式下运行DBA可手工归档填满的不活动的日志文件组不管自动归档是可以还是不可以
()数据库后备
不管为ORACLE数据库设计成什么样的后备或恢复模式数据库数据文件日志文件和控制文件的操作系统后备是绝对需要的它是保护介质故障的策略部分操作系统后备有完全后备和部分后备
◆完全后备一个完全后备将构成ORACLE数据库的全部数据库文件在线日志文件和控制文件的一个操作系统后备一个完全后备在数据库正常关闭之后进行不能在实例故障后进行在此时所有构成数据库的全部文件是关闭的并与当前点相一致在数据库打开时不能进行完全后备由完全后备得到的数据文件在任何类型的介质恢复模式中是有用的
◆部分后备
部分后备为除完全后备外的任何操作系统后备可在数据库打开或关闭下进行如单个表空间中全部数据文件后备单个数据文件后备和控制文件后备部分后备仅对在ARCHIVELOG方式下运行数据库有用因为存在的归档日志数据文件可由部分后备恢复在恢复过程中与数据库其它部分一致
()数据库恢复
◆实例故障的恢复
当实例意外地(如掉电后台进程故障等)或预料地(发出SHUTDOUM ABORT语句)中止时出现实例故障此时需要实例恢复实例恢复将数据库恢复一故障之前的事务一致状态如果在在线后备发现实例故障则需介质恢复在其它情况Oracle在下次数据库起动时(对新实例装配和打开)自动地执行实例恢复如果需要从装配状态变为打开状态自动地激发实例恢复由下列处理
()为了解恢复数据文件中没有记录的数据进行向前滚该数据记录在在线日志包括对回滚段的内容恢复
()回滚未提交的事务按步重新生成回滚段所指定的操作
()释放在故障时正在处理事务所持有的资源
()解决在故障时正经历一阶段提交的任何悬而未决的分布事务
◆介质故障的恢复
介质故障是当一个文件一个文件的部分或一磁盘不能读或不能写时出现的故障介质故障的恢复有两种形式决定于数据库运行的归档方式
◆如果数据库是可运行的以致它的在线日志仅可重用但不能归档此时介质恢复为使用最新的完全后备的简单恢复在完全后备执行的工作必须手工地重作
◆如果数据库可运行其在线日志是被归档的该介质故障的恢复是一个实际恢复过程重构受损的数据库恢复到介质故障前的一个指定事务一致状态
不管哪种形式介质故障的恢复总是将整个数据库恢复到故障之前的一个事务一致状态如果数据库是在ARCHIVELOG方式运行可有不同类型的介质恢复完全介质恢复和不完全介质恢复
完全介质恢复可恢复全部丢失的修改仅当所有必要的日志可用时才可能有不同类型的完全介质恢复可使用其决定于毁坏文件和数据库的可用性例
◆关闭数据库的恢复当数据库可被装配却是关闭的完全不能正常使用此时可进行全部的或单个毁坏数据文件的完全介质恢复
◆打开数据库的离线表空间的恢复当数据库是打开的完全介质恢复可以处理未损的数据库表空间是在线的可以使用而受损耗捕空间是离线的其所有数据文件作为恢复的单位
◆打开数据库的离线表间的单个数据文件的恢复当数据库是打开的完全介质恢复可以处理未损的数据库表空间是在线的可以使用而所损的表空间是离线的该表空间的指定所损的数据文件可被恢复
◆使用后备的控制文件的完全介质恢复当控制文件所有拷贝由于磁盘故障而受损时可进行介质恢复而不丢失数据
不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复重构受损的数据库使其恢复介质故障前或用户出错之前的一个事务一致性状态不完全介质恢复有不同类型的使用决定于需要不完全介质恢复的情况有下列类型基于撤消基于时间和基于修改的不完全恢复
基于撤消恢复在某种情况不完全介质恢复必须被控制DBA可撤消在指定点的操作基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏不能用于恢复过程时使用所以介质恢复必须控制以致在使用最近的未损的日志组于数据文件后中止恢复操作
基于时间和基于修改的恢复如果DBA希望恢复到过去的某个指定点不完全介质恢复地理想的可在下列情况下使用
◆当用户意外地删除一表并注意到错误提交的估计时间DBA可立即关闭数据库恢复它到用户错误之前时刻
◆由于系统故障一个在线日志文件的部分被破坏所以活动的日志文件突然不可使用实例被中止此时需要介质恢复在恢复中可使用当前在线日志文件的未损部分DBA利用基于时间的恢复一旦有将效的在线日志已应用于数据文件后停止恢复过程
在这两种情况下不完全介质恢复的终点可由时间点或系统修改号(SCN)来指定