首页 > 数据库 > Oracle > Oracle重建控制文件技术总结
控制文件(Control File)是 Oracle 数据库中最关键的核心文件之一,
它在整个数据库生命周期中扮演着数据库元信息中心(Metadata Center)的角色。
控制文件中保存着如下关键信息:
换句话说, 数据库没有控制文件就失去了自身的结构认知,即便数据文件完好,也无法启动数据库。
| 原因类型 | 示例说明 |
|---|---|
| 物理损坏 | 文件系统损坏、磁盘故障、误删除 |
| 逻辑不一致 | 恢复中使用不匹配的控制文件 |
| 异步写入中断 | 实例崩溃导致控制文件更新不完整 |
| 管理错误 | 手动删除控制文件、误替换控制文件副本 |
ORA-00205: error in identifying control file, check alert log for more info ORA-00210: cannot open the specified control file ORA-00202: control file: '/u01/app/oracle/oradata/ORCL/control01.ctl'
此时数据库无法启动到 MOUNT 状态。
Oracle 在创建数据库时,会在 CONTROL_FILES 参数中指定多个副本路径:
SQL> show parameter control_files; control_files ------------------------------------------------------------ /u01/app/oracle/oradata/ORCL/control01.ctl, /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl
这些副本在运行期间是同步更新的。当任意一个副本可用时,数据库仍可正常启动。
但若 全部副本丢失,则必须通过 CREATE CONTROLFILE 重建。
可通过两种方式:
-- 二进制备份(RMAN或物理拷贝) ALTER DATABASE BACKUP CONTROLFILE TO '/tmp/controlfile.bak'; -- 生成可编辑脚本(文本方式) ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/create_ctl.sql';
第二种方式非常重要,它生成的 SQL 文件就是 重建控制文件的模板。
| 项目 | 说明 |
|---|---|
| 数据库版本 | Oracle Database 19c (19.3.0.0) |
| 操作系统 | Oracle Linux 8.2 |
| 实验模式 | 手动删除控制文件并重建 |
| 归档模式 | ARCHIVELOG |
| 日志文件 | 三组联机重做日志,每组 200M |
| 数据文件 | SYSTEM、SYSAUX、UNDO、USERS 表空间 |
$ sqlplus / as sysdba SQL> shutdown immediate; SQL> exit; $ rm -f /u01/app/oracle/oradata/ORCL/control01.ctl $ rm -f /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl
验证结果:
$ sqlplus / as sysdba SQL> startup; ORA-00205: error in identifying control file, check alert log for more info
SQL> startup nomount; ORACLE instance started.
说明内存结构已建立(SGA、PGA),但数据库尚未读取控制文件。
我们使用事先生成的 create_ctl.sql 文件:
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/ORCL/redo01.log' SIZE 200M, GROUP 2 '/u01/app/oracle/oradata/ORCL/redo02.log' SIZE 200M, GROUP 3 '/u01/app/oracle/oradata/ORCL/redo03.log' SIZE 200M DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf', '/u01/app/oracle/oradata/ORCL/sysaux01.dbf', '/u01/app/oracle/oradata/ORCL/undotbs01.dbf', '/u01/app/oracle/oradata/ORCL/users01.dbf' CHARACTER SET AL32UTF8;
执行:
SQL> @/tmp/create_ctl.sql Control file created.
SQL> recover database; Media recovery complete. SQL> alter database open; Database altered.
SQL> recover database using backup controlfile; SQL> alter database open resetlogs;
| 项目 | NORESETLOGS | RESETLOGS |
|---|---|---|
| 日志序列 | 保留原序列号 | 从1重新计数 |
| 是否新 incarnation | 否 | 是 |
| 适用场景 | 数据文件、日志文件完全一致 | 控制文件为备份或不一致 |
| 归档日志恢复 | 可直接使用旧归档日志 | 旧归档日志失效 |
| 恢复后是否必须备份 | 建议 | 必须 |
当执行 ALTER DATABASE OPEN RESETLOGS 时,Oracle 会:
因此,RESETLOGS 操作本质上意味着 一次新的数据库生命阶段。
旧日志、旧备份都无法再用于恢复。
SQL> select checkpoint_change# from v$database; SQL> select file#, checkpoint_change# from v$datafile_header; SQL> select min(checkpoint_change#), max(checkpoint_change#) from v$datafile_header;
若两者结果一致,说明控制文件与数据文件同步。
否则需执行介质恢复。
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
通过本次实验,我们验证了以下要点:
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/ORCL/redo01.log' SIZE 200M, GROUP 2 '/u01/app/oracle/oradata/ORCL/redo02.log' SIZE 200M, GROUP 3 '/u01/app/oracle/oradata/ORCL/redo03.log' SIZE 200M DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf', '/u01/app/oracle/oradata/ORCL/sysaux01.dbf', '/u01/app/oracle/oradata/ORCL/undotbs01.dbf', '/u01/app/oracle/oradata/ORCL/users01.dbf' CHARACTER SET AL32UTF8;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23825935/viewspace-3107216/ ,如需转载,请注明出处,否则将追究法律责任。