前言数据库损坏是DBA日常工作中不可避免的事情。遇到这样的情况,可以找到适合自己的恢复方法,提高工作效率。数据块损坏的恢复当数据文件中只有少量数据块发生介质损坏时,我们可以使用RMAN在数据块级别进行恢复。数据块级别的部分恢复可以大大缩短恢复时间,甚至是其他恢复方式的千分之几。另外,在恢复损坏数据块的过程中,系统可以处于运行状态,这个数据文件也可以处于在线应用状态,而不需要将其设置为离线来保持应用运行状态。(1)连接RMAN环境,以SYSDBA(SYSOPER)身份连接数据库:$rmantarget/(2)执行如下数据块修复命令修复数据块:rman>blockrecoverdatafile3block2,150,152;现在数据块已经恢复,系统继续运行。恢复损坏的数据文件第一步:将损坏的数据文件设置为离线SQL>alterdatabasedatafile4offline;第二步:通过RMAN加载数据文件RMAN>restoredatafile4;第三步:恢复损坏的数据文件RMAN>recoverdatafile4;第四步:设置恢复的数据文件在线RMAN>sql"alterdatabasedatafile4online";第五步:检查数据文件是否可用SQL>selectname,enabled,statusfromv$datafile;至此,一个非系统表空间的数据文件的恢复过程就完成了。表空间损坏的恢复当然,数据库恢复的方法不止一种,管理员也可以根据表空间恢复的方法进行恢复操作。还是上面的情况,如果出现故障,按照表空间损坏情况下的恢复方式进行恢复。下面的备份用于恢复表空间users中的所有数据文件:第一步:使表空间离线SQL>altertablespaceusersoffline;第二步:加载表空间RMAN>restoretablespaceusers;第三步:恢复表空间RMAN>recovertablespaceusers;第4步:使表空间联机RMAN>sql"altertablespaceusersonline";第五步:检查数据文件是否可用SQL>selectname,enabled,statusfromv$datafile;如果系统表空间的恢复是恢复表空间或者系统表空间损坏,那么数据库系统就不能运行,数据库一定不能处于打开状态。在RMAN环境中连接到Oracle。注意此时连接的不是已经打开的数据库,而是处于loading状态的数据库:Step1:ConnecttoRMAN$rmantarget/Step2:LoadtablespaceRMAN>restoretablespacesystem;第三步:恢复表空间RMAN>recovertablespacesystem;第四步:打开数据库SQL>alterdatabaseopen;数据库的崩溃恢复是一种完整的数据库恢复方法,使用由于数据库完全崩溃,数据库的部分恢复是不可能的。这种方法很简单——为恢复操作载回数据库的完整备份集。方法虽然简单,但代价巨大——时间可能会很长!首先你需要启动数据库实例。如果控制文件完好,引导到挂载状态是没有问题的。如果控制文件损坏,则只能引导到nomount状态。本例中,数据库可以启动到挂载状态:第一步:启动实例SQL>startupmount第二步:进入RMAN环境:$rmantarget/第三步:加载数据库备份RMAN>restoredatabase;第4步:执行以下命令以完全恢复数据库:RMAN>recoverdatabase;第五步:打开数据库RMAN>alterdatabaseopen;控制文件损坏的恢复由于某些原因,例如介质损坏,当所有的控制文件都不可用时,管理员可以使用RMAN自动备份控制文件,恢复控制文件。为了描述方便,这里我们假设在一个运行在归档模式下的数据库中,由于介质损坏,所有的控制文件都不可用。其他数据库文件,包括数据文件、参数文件(SPFILE)、归档日志文件、联机重做日志文件等都完好无损。我们可以按照以下步骤进行恢复。数据库此时只能离线,因为数据库控制文件已损坏。第一步:启动数据库到nomount状态:SQL>startupnomount第二步:在RMAN环境下,注册数据库ID(DBID)$rmantarget/rman>setDBID=1195474494第三步:从数据库备份集中加载控制文件到backupRMAN>restorecontrolfilefromautobackup第四步:打开数据库到mount状态:RMAN>alterdatabasemount第五步:使用RMAN备份恢复数据库RMAN>recoverdatabase;第六步:打开数据库实例,但需要重置日志(resetlogs):RMAN>alterdatabaseopenresetlogs;由于数据库是以resetlogs方式打开的,虽然系统数据没有丢失,但是由于所有的日志文件都被重置了,所以需要进行一次完整的数据库备份。如果控制文件损坏,并伴有其他数据文件损坏等,可以通过本节介绍的恢复控制文件,加上数据库的崩溃恢复,实现数据库的完全恢复(或不完全恢复)。损坏日志文件的恢复由于数据库日志可以采用多成员机制,这种方法保证了系统在单个日志文件损坏的情况下的连续运行。即使一个日志组的所有成员都损坏了,如果是当前日志组,数据丢失和数据库恢复不完全也是必然的选择。如果不是当前日志组,可能根本不需要修复,删除日志组,新建日志组即可。第一步:执行数据库的不完全恢复SQL>recoverdatabaseuntilcancel;第二步:按照resetlog方法打开数据库SQL>alterdatabaseopenresetlogs;数据库未完全恢复。当然,上述过程也可以在RMAN中完成。RestoreRMANfromthespecifiedbackupset>run{setuntilscn=1645604;--performincompleterecoveryrestoredatabasefromtag='TAG20110702T231137';--指定备份集的tag值,recoverdatabase;sql'alterdatabaseopenresetlogs';}可以在listbackupofdatabase中找到
