当所有当前的控制文件丢失时,必须还原备份的控制文件。
如果当前控制文件的所有副本丢失或损坏,那么必须还原和挂载备份的控制文件。然后必须运行RECOVER命令,即使没有还原任何数据文件,再使用RESETLOGS选项打开数据库。
在恢复过程中,RMAN自动搜索没有在RMAN仓库中记录的在线和归档日志,登记找到的任何日志。RMAN在任何当前归档目的地中使用当前的日志格式尝试找到有效的的归档redo日志。当前格式在用来启动实例(或Oracle RAC配置中的所有实例)的初始化参数文件中指定。类似地,RMAN通过使用列在控制文件中的文件名称尝试找到在线redo日志。
如果在恢复过程中更改归档目的地或格式,或在控制文件备份之后增加了新的在线日志成员,那么RMAN可能不会自动登记需要的在线或归档日志。无论何时RMAN找不到在线redo日志和你没有指定UNTIL时间,RMAN报告类似以下的错误:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 08/29/2013 14:23:09
RMAN-06054: media recovery requesting unknown log: thread 1 scn 86945
在这种情况中,你必须使用CATALOG命令手动增加需要的redo日志到仓库以便恢复可以继续。
注:如果当前控制文件的某些副本不能使用,可以按照“响应当前控制文件的子集丢失”章节的步骤处理,避免恢复和RESETLOGS选项。
当还原控制文件时,缺省目的地是定义在CONTROL_FILES初始化参数中的所有位置。如果没有设置CONTROL_FILES初始化参数,那么数据库使用与没有设置CONTROL_FILES参数时创建控制文件的相同的规则来确认还原的控制文件的位置。
还原控制文件到一个或多个新位置的方法是更改初始化参数CONTROL_FILES,然后使用不带参数的RESTORE CONTROLFILE命令来还原控制文件到缺省位置。例如,如果你在导致某些但不是所有CONTROL_FILES位置不可用的磁盘故障之后还原控制文件,可以更改CONTROL_FILES替换指向故障磁盘的路径名称为新的磁盘路径,然后运行不带参数的RESTORE CONTROLFILE命令。
可以通过使用RESTORE CONTROLFILE TO 'filename’还原控制文件到任何你选择的位置而不是CONTROL_FILES位置:
RESTORE CONTROLFILE TO ‘/tmp/my_controlfile’;
可以在数据库处于NOMOUNT,MOUNT或OPEN状态时执行这个操作,因为你不会覆盖任何当前在使用的控制文件。任何存在的名为’filename’的文件都会被覆盖。在还原控制文件到新的位置之后,可以更新CONTROL_FILES初始化参数来包含新的位置。
还原控制文件的过程取决于是否使用了恢复目录。
当RMAN连接到恢复目录时,使用备份控制文件的恢复步骤与使用当前控制文件的恢复步骤相同。备份控制文件中缺失的RMAN元数据可从恢复目录中获得。
唯一的例外是如果数据库名称在目录中不是唯一的,那么在还原控制文件之前必须使用SET DBID命令。
如果没有使用恢复目录,那么必须从自动备份中还原控制文件。从自动备份中还原控制文件,数据库必须处于NOMOUNT状态。首先设置数据库的DBID,然后使用RESTORE CONTROLFILE FROM AUTOBACKUP命令。
在这个示例中,RMAN使用自动备份格式和DBID来确认从哪里寻找控制文件自动备份。如果找到了,RMAN还原控制文件到CONTROL_FILES初始化参数列出的所有控制文件位置。
SET DBID 320066378;
RUN
{
SET CONTROLFILE AUTOBACKUP FORMAT
FOR DEVICE TYPE DISK TO ‘autobackup_format’;
RESTORE CONTROLFILE FROM AUTOBACKUP;
}
不管数据库是否使用快速恢复区域,还原控制文件的命令是相同的。
如果数据库使用快速恢复区域,那么RMAN通过交叉检查记录在控制文件中的所有基于磁盘的备份和映像副本来更新从备份中还原的控制文件。RMAN登记在恢复区域中没有记录的任何备份。因此,还原的控制文件有在恢复区域中所有备份和备份时的控制文件已知的其它备份的完整和准确的记录。
RMAN在还原控制文件之后不会自动交叉检查磁带备份。如果使用磁带备份,那么可以还原和挂载控制文件,执行以下命令交叉检查磁带上的备份:
CROSSCHECK BACKUP DEVICE TYPE sbt;
当没有使用恢复目录时使用备份控制文件恢复数据库要求从自动备份中还原控制文件。
本节假设你有控制文件的RMAN备份,但没有使用恢复目录。它也假设你为目标数据库启用了控制文件的自动备份特性和可以还原控制文件的自动备份。
由于自动备份使用众所周知的格式,RMAN可以还原它即使它没有可用的仓库列出可用的备份。可以还原自动备份到缺省或新的位置。RMAN自动复制控制文件到所有CONTROL_FILES位置。
注:如果你知道包含控制文件的备份片的名称(例如,从介质管理器或由于备份片在磁盘上),那么可以使用RESTORE CONTROLFILE FROM 'filename’命令指定备份片名称。数据库记录每个自动备份的位置在alert日志中,如下所示:
2022-01-13T20:17:04.353665+08:00
Control autobackup written to DISK device
handle '+RECO/ORCL/AUTOBACKUP/2022_01_13/s_1093897021.305.1093897023'
因为你没有连接到恢复目录,RMAN仓库只包含关于控制文件备份时的可用的备份的信息。如果你知道其它可用的备份集或映像副本的位置,那么使用CATALOG命令增加它们到控制文件RMAN仓库。
使用NOCATALOG模式中的控制文件自动备份恢复数据库:
1)启动RMAN,连接到目标数据库。
2)启动数据库实例而不挂载数据库。
STARTUP NOMOUNT;
3)使用SET DBID命令设置目标数据库的标识符。
RMAN在连接到目标数据库时会显示DBID。也可以通过检查保存的RMAN日志文件,查询目录,或查看控制文件的自动备份文件名称(不一定可以)来获取。
SET DBID 676549873;
4)编写一个RMAN命令文件来还原自动备份控制文件和执行恢复。
命令文件包括以下步骤:
a.可选地,指定RMAN可以使用的最近的备份时间戳来搜索控制文件的自动备份。
b.如果知道在创建控制文件自动备份时生效的是不同的控制文件自动备份格式,那么为控制文件的还原指定非缺省格式。
c.如果使用SBT通道创建了控制文件自动备份,那么分配一个或多个SBT通道。因为没有恢复目录可用,不能使用预配置的通道。
d.还原控制文件的自动备份,可选地设置RMAN可以向后搜索的最大天数和它用来搜索第一天的初始序列号。
e.如果你知道控制文件包含的关于配置的通道的信息在还原过程的其余部分有用,那么可以退出RMAN手动清除步骤4.c中分配的通道。
如果重启RMAN客户端和挂载数据库,那么这些配置的通道对你可用。如果你不在意使用控制文件中的通道,那么你可以仅仅挂载数据库。
f.这个步骤取决于在线redo日志是否可用。在使用备份的控制文件恢复之后,总是需要选项OPEN RESETLOGS,不管日志是否可用。
如果在线redo日志可用,那么RMAN找到和应用这些日志。按照“执行完全数据库恢复”章节描述的步骤执行完全还原和恢复。
如果在线redo日志不可用,那么照“执行数据库时间点恢复”章节描述的步骤执行DBPITR。需要使用UNTIL子语句为恢复指定在线redo日志的第一个SCN之前的目标时间,SCN或日志序列号(否则,RMAN报错RMAN-6054)。
当使用备份控制文件执行DBPITR时,在使用RESETLOGS打开数据库之前,可以使用SQL*Plus以只读方式打开数据库,运行需要的查询来验证逻辑损坏已经被逆转的效果。如果对结果满意,那么可以使用RESETLOGS打开数据库。
注:当指定日志序列时,如果最后创建的归档redo日志有序列n,那么指定UNTIL SEQUENCE n+1以便RMAN应用n,然后停止。
在以下示例中,在线redo日志已经丢失,最近的归档redo日志序列号是13243。这个示例显示如何还原控制文件自动备份和恢复通过最近的日志。
RUN
{
# Optionally, set upper limit for eligible time stamps of control filebackups
# SET UNTIL TIME ‘09/10/2017 13:45:00’;
# Specify a nondefault autobackup format only if required
# SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK
# TO ‘?/oradata/%F.bck’;
ALLOCATE CHANNEL c1 DEVICE TYPE sbt PARMS ‘…’; # allocate manually
RESTORE CONTROLFILE FROM AUTOBACKUP
MAXSEQ 100 # start at sequence 100 and count down
MAXDAYS 180; # start at UNTIL TIME and search back 6 months
ALTER DATABASE MOUNT;
}
# Now use automatic channels configured in restored control file
RESTORE DATABASE UNTIL SEQUENCE 13244;
RECOVER DATABASE UNTIL SEQUENCE 13244;
5)如果恢复成功,打开数据库和重置在线日志。
ALTER DATABASE OPEN RESETLOGS;
来源:《Oracle Database Backup and Recovery User’s Guide,19c》