如果所有控制文件在永久性介质故障中丢失,但所有在线redo日志成员保持完好无损的,那么你可以在创建新的控制文件之后恢复数据库。在恢复之后你不需要使用RESETLOGS选项打开数据库。
取决于控制文件备份的存在和当前性,你有下表中列出的选项来生成CREATE CONTROLFILE语句的文件。对数据库的更改记录在alert_SID.log中,因此当决定选择哪个选项时检查log。
如果… | 那么… |
---|---|
在对数据库做最后的结构性更改之后执行了ALTER DATABASE BACKUP CONTROLFILE TO TRACE NORESETLOGS和已经保存了SQL命令跟踪输出 | 使用来自跟踪输出的CREATE CONTROLFILE语句不予改变 |
在对数据库做结构性更改之前,执行最近的ALTER DATABASE BACKUP CONTROLFILE TO TRACE | 编辑ALTER DATABASE BACKUP CONTROLFILE TO TRACE来反映更改。例如,如果你近来增加了数据文件到数据库,那么增加这个数据文件到CREATE CONTROLFILE语句的DATAFILE子语句。 |
使用ALTER DATABASE BACKUP CONTROLFILE TO filename语句(不包括TO TRACE选项备份控制文件 | 使用控制文件副本来获取SQL输出。创建临时的数据库实例,挂载备份控制文件,然后运行ALTER DATABASE BACKUP CONTROLFILE TO TRACE NORESETLOGS。如果控制文件副本早于近来的结构性更改,那么编辑跟踪选项来反映更改。 |
没有在TO TRACE格式或TO filename格式的控制文件备份 | 手动执行CREATE CONTROLFILE语句 |
注:如果字符集不是缺省的US7ASCII,那么你必须作为CREATE CONTROLFILE语句的一个参数指定字符集。数据库字符集在启动时会写到alert日志。字符集信息也记录在BACKUP CONTROLFILE TO TRACE输出中。
创建控制文件和恢复数据库:
1)启动数据库到NOMOUNT模式。
STARTUP NOMOUNT
2)使用CREATE CONTROLFILE语句创建控制文件,指定NORESETLOGS选项(查看上表寻找选项)。下例假设字符集是缺省的US7ASCII:
CREATE CONTROLFILE REUSE DATABASE SALES NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 32
MAXINSTANCES 16
MAXLOGHISTORY 1600
LOGFILE
GROUP 1 ( ‘/diska/prod/sales/db/log1t1.dbf’, ‘/diskb/prod/sales/db/log1t2.dbf’) SIZE 100K,
GROUP 2 ( ‘/diska/prod/sales/db/log2t1.dbf’, ‘/diskb/prod/sales/db/log2t2.dbf’) SIZE 100K
DATAFILE
‘/diska/prod/sales/db/database1.dbf’,‘/diskb/prod/sales/db/filea.dbf’;
在创建控制文件之后,实例挂载数据库。
3)像平常一样恢复数据库(不指定USING BACKUP CONTROLFILE子语句):
RECOVER DATABASE
4)在恢复完成之后打开数据库(不需要RESETLOGS选项):
ALTER DATABASE OPEN;
5)立即备份控制文件。
ALTER DATABASE BACKUP CONTROLFILE TO ‘/backup/control01.dbf’ REUSE;
1.使用创建的控制文件恢复通过RESETLOGS
你可以恢复备份通过一个OPEN RESETLOGS操作只要:
1)你有当前,备份,或创建的控制文件可以检测到先前的转生。
2)你有所有可用的归档redo日志。
如果你必须重建控制文件,那么ALTER DATABASE BACKUP CONTROLFILE TO TRACE生成的跟踪文件包含必要的命令来重建完整的转生历史。视图V$DATABASE_INCARNATION显示控制文件的RESETLOGS历史,视图V$LOG_HISOTRY显示归档日志历史。
在重建的控制文件中转生历史有可能是不完整的。例如,必要的用于恢复的归档日志可能缺失。在这种情况中,使用ALTER DATABASE REGISTER LOGFILE语句明确创建转生记录是可能的。
在下例中,注册4个必要的用于恢复但没有记录在重建的控制文件中的日志,然后恢复数据库:
ALTER DATABASE REGISTER LOGFILE ‘/disk1/oradata/trgt/arch/arcr_1_1_42343523.arc’;
ALTER DATABASE REGISTER LOGFILE ‘/disk1/oradata/trgt/arch/arcr_1_1_34546466.arc’;
ALTER DATABASE REGISTER LOGFILE ‘/disk1/oradata/trgt/arch/arcr_1_1_23435466.arc’;
ALTER DATABASE REGISTER LOGFILE ‘/disk1/oradata/trgt/arch/arcr_1_1_12343533.arc’;
RECOVER AUTOMATIC DATABASE;
2.使用重建的控制文件恢复只读文件
如果当前或备份控制文件不可用于恢复,那么你可以执行CREATE CONTROLFILE语句。不要在CREATE CONTROLFILE中列出只读文件,因此恢复可以跳过它们。只读数据文件不需要恢复除非你还原当数据文件是读写时这些文件的备份。
在创建控制文件之后和尝试挂载和打开数据库,数据库对列在控制文件中的文件执行数据字典检查。对于每个没有列在CREATE CONTROLFILE语句中但在数据字典中存在的文件,会为它们在控制文件中创建一个条目。这些文件被命名为MISSINGnnnnn,其中nnnnn是从0开始的5位数。
在数据库打开之后,通过执行ALTER DATABASE RENAME FILE语句为所有使用MISSING为前缀的文件重命名到它们正确的文件名称。
准备你可能必须重建控制文件的场景:
当数据库在挂载或打开时运行以下语句来获取CREATE CONTROLFILE语法:
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
上面的SQL语句生成一个跟踪文件,你可以编辑它和作为脚本来重建控制文件。你可以指定RESETLOGS或NORESETLOGS(缺省)关键词来生成CREATE CONTROLFILE … RESETLOGS或CREATE CONTROLFILE … NORESETLOGS版本的脚本。
在CREATE CONTROLFILE语句中所有与只读文件相关的限制也应用到正常脱机的表空间,除了你必须在数据库打开之后将表空间联机。忽略CREATE CONTROLFILE语句中的临时文件和在打开数据库之后增加它们。
来源:《Oracle Database Backup and Recovery User’s Guide,19c》