学习目标 确定是否需要执行恢复 访问不同的界面(如Enterprise Manager和命令行) 描述并使用可用的方案,如Recovery Manager(RMAN)和数据恢复指导 对以下文件执行恢复 -控制文件 -重做日志文件 -数据文件 打开数据库 要打开数据库,必须满足以下条件 -所有控制文件都必须存在且已同步 -所有联机数据文件都必须存在且已同步 -每个重做日志组必须至少有一个成员存在 数据库从关闭阶段转为完全打开的几个阶段 NOMOUNT:读取初始化参数文件。实例进入NOMOUNT状态时,不会检查任何数据库文件。 MOUNT:实例进入MOUNT时,会检查初始化参数文件中列出的所有控制文件是否都存在且已同步。即使有一个控制文件缺失或损坏,实例会返回错误并保持NOMOUNT状态。 OPEN:实例从MOUNT状态转为OPEN状态时,它会执行以下操作 -检查控制文件已知的所有重做日志是否至少有一个成员存在,任何缺失的成员会记录在预警日志中。 -验证控制文件已知的所有数据文件是否存在,但不验证脱机文件。当实例发现缺失文件时,错误消息只显示导致问题的第一个文件,可以查询v$recover_file动态性能视图来获取需要恢复的文件列表。 -验证所有未脱机数据文件或只读数据文件是否与控制文件同步。必要时实例会自动执行恢复。如果某个文件不同步,导致无法通过使用联机重做日志组进行恢复,DBA必须执行介质恢复。v$recover_file视图会列出完整的需恢复列表。 使数据库保持在打开状态 打开数据库后,如果有以下项丢失,数据库会失败 -任何控制文件 -属于系统表空间(SYSTEM)或还原表空间(UNDOTBS1)的数据文件 -整个重做日志组 (只要组中至少有一个成员可用,实例就会保持打开状态) Data Recovery Advisor(数据恢复指导) 快速检测、分析和修复故障 停机和运行时的故障 将对用户的干扰降到最低 用户界面 -Enterprise Manager GUI -RMAN命令行 支持的数据库配置 -单实例 -非RAC -支持故障转移到备用数据库,但不支持分析和修复备用数据库 丢失控制文件 如果控制文件丢失或损坏,则实例通常会中止。 使用ASM存储,并且至少还有一个控制文件副本,可以使用Enterprise Manager执行指导式恢复,或者使用RMAN执行手动恢复 1.将数据库置于NOMOUNT模式 2.连接到RMAN执行restore controlfile命令来从现有的控制文件恢复损坏或丢失的控制文件 restore controlfile from ‘+DATA/orcl/controlfile/current.260.696209463’; 3.成功恢复控制文件后,打开数据库。 如果使用常规文件系统则: 1.关闭数据库 2.复制现有的控制文件来替代丢失或损坏的控制文件 3.成功恢复控制文件后,打开数据库。 如果所有的控制文件丢失或损坏,可以重建控制文件来修复: ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS ‘/u01/backup_control.trc’; 注意‘NORESETLOGS FORCE ’和‘RESETLOGS FORCE ’的区别,RESETLOGS FORCE 会重置重做日志序号,有导致数据丢失的风险。
CREATE CONTROLFILE REUSE DATABASE “<database_name>” NORESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 400 MAXINSTANCES 8 MAXLOGHISTORY 4672 LOGFILE GROUP 1 ( ‘/u01/redo/redo01_1.log’, ‘/u01/redo/redo01_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 2 ( ‘/u01/redo/redo02_1.log’, ‘/u01/redo/redo02_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 3 ( ‘/u01/redo/redo03_1.log’, ‘/u01/redo/redo03_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 4 ( ‘/u01/redo/redo04_1.log’, ‘/u01/redo/redo04_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 5 ( ‘/u01/redo/redo05_1.log’, ‘/u01/redo/redo05_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 6 ( ‘/u01/redo/redo06_1.log’, ‘/u01/redo/redo06_2.log’ ) SIZE 100M BLOCKSIZE 512 — STANDBY LOGFILE DATAFILE ‘/u01/app/oracle/oradata/<database_name>/system01.dbf’, …. ‘/u01/app/oracle/oradata/<database_name>/undotbs01.dbf’, CHARACTER SET AL32UTF8 ; CREATE CONTROLFILE REUSE DATABASE “<database_name>”
RESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 400 MAXINSTANCES 8 MAXLOGHISTORY 4672 LOGFILE GROUP 1 ( ‘/u01/redo/redo01_1.log’, ‘/u01/redo/redo01_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 2 ( ‘/u01/redo/redo02_1.log’, ‘/u01/redo/redo02_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 3 ( ‘/u01/redo/redo03_1.log’, ‘/u01/redo/redo03_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 4 ( ‘/u01/redo/redo04_1.log’, ‘/u01/redo/redo04_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 5 ( ‘/u01/redo/redo05_1.log’, ‘/u01/redo/redo05_2.log’ ) SIZE 100M BLOCKSIZE 512, GROUP 6 ( ‘/u01/redo/redo06_1.log’, ‘/u01/redo/redo06_2.log’ ) SIZE 100M BLOCKSIZE 512 — STANDBY LOGFILE DATAFILE ‘/u01/app/oracle/oradata/<database_name>/system01.dbf’, …. ‘/u01/app/oracle/oradata/<database_name>/undotbs01.dbf’, CHARACTER SET AL32UTF8 ;
丢失重做日志文件 丢失了重做日志文件组中的某个成员,并且组中至少还有一个成员: -不会影响实例的正常操作。 -预警日志中会收到一条信息,通知您无法找到某个成员 -可以通过删除丢失的重做日志成员并添加新成员来恢复丢失的日志文件 -如果包含丢失日志文件的组已归档,您可以清除日志组来重新创建丢失的文件 恢复步骤: 1.确定是否有缺失的日志文件 2.恢复丢失的文件时,先删除丢失的重做日志成员 ALTER DATABASE DROP LOGFILE MEMBER ‘+DATA/orcl/onlinelog/group_1.261.691672257’; 3.然后添加新成员来替代丢失的日志成员 ALTER DATABASE ADD LOGFILE MEMBER ‘+DATA’ TO GROUP 2; 4.如果介质故障是由于磁盘或控制器缺失而造成的,需重命名丢失文件。 5.如果重做日志组已归档,或者处于NOARCHIVELOG模式下,则可选择在清除日志组后重新创建缺失来解决问题, ALTER DATABASE CLEAR LOGFILE GROUP n; 注意:清除未归档的日志组,应立即对整个数据库执行完全备份,否则,在发生其它故障的情况下,会导致数据丢失。 ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP #;
NOARCHIVELOG模式下丢失了数据文件 数据库处于NOARCHIVELOG模式时,如果丢失任何数据文件,执行以下步骤 1.如果实例尚未关闭,请关闭实例 2.从备份还原整个数据库,包括所有数据文件和控制文件 3.打开数据库 4.让用户重新输入自上次备份以来所做的所有更改 ARCHIVELOG模式下丢失了非关键性数据文件(SYSTEM,UNDO除外) 仅仅恢复当前数据文件不用整库恢复,不需要停机 1.数据文件离线 2.restore数据文件,介质恢复 3.recover事务 4.数据文件联机 ARCHIVELOG模式下丢失了关键性数据文件(SYSTEM,UNDO…) 数据库关键性数据文件丢失,需要停机恢复 1.实例可能会也可能不会自动关闭。如果未自动关闭,请使用SHUTDOWN ABORT关闭实例 2.装载数据库,MOUNT 3.还原并恢复缺失的数据文件,restore datafile/database 4.recover datafile/database 5.打开数据库 数据故障:示例 组件无法访问:缺少操作系统级别的数据文件、访问权限不正确、表空间脱机 物理损坏:块校验和错误、块头字段值无效 逻辑损坏:目录不一致;行片段、索引条目或事务处理损坏 不一致:控制文件早于或晚于数据文件和连接重做日志 I/O故障:超出打开文件数限制、通道无法访问、网络或I/O错误 数据恢复指导 1.评估数据故障 2.按严重程度列出故障 3.提供修复建议 4.选择并执行恢复 5.执行预先检查 RMAN> list failure; RMAN> advise failure; RMAN> repair failure; 数据恢复指导视图 V$IR_FAILURE:列出所有故障,其中包括已关闭的故障(LIST FAILURE命令的结果) V$IR_MANUAL_CHECKLIST:列出手动建议(ADVISE FAILURE命令的结果) V$IR_REPAIR:列出修复(REPAIR FAILURE命令的结果) V$IR_FAILURE_SET:交叉引用故障和建议标识符
SQL> select * from v$ir_failure; no rows selected SQL> select * from v$ir_manual_checklist; no rows selected SQL> select * from v$ir_repair; no rows selected SQL> select * from v$ir_failure_set; no rows selected
总结: 数据库保存OPEN状态的条件:所有控制文件存在、关键数据文件存在、重做日志组成员存在并且文件之间同步正常 数据库从shutdown到open的几个阶段:SHUTDOWN ->NOMOUNT->MOUNT->OPEN Data Recover Advisor工具适用环境及使用:Enterprise Manager 和RMAN命令行,单实例可进行指导,RAC环境不可以。支持Standby故障转移,但不能执行分析和修复 丢失了控制文件、重做日志文件、非归档模式下数据文件、归档模式下非关键数据文件、归档模式下关键数据文件的修复 数据恢复指导视图