Oracle 控制文件的恢复
1 控制文件的备份方式
1 | 1. 脱机冷备 的控制文件 |
1.1 脱机冷备说明 (不建议这样备份)
如何脱机备份
冷备份发生在数据库已经正常关闭的情况下
拷贝文件,假如数据库文件都在目录A,拷贝这些数据库文件到其他目录比如目录B,如果要恢复,则也是在数据库 shutdown 的状态下,把这些文件从目录 B 拷回目录 A,再 startup 数据库
查看文件信息
1 | --找出所有的控制文件 |
恢复时的问题
用户管理的备份与恢复也称 OS 物理备份,是指通过数据库命令设置数据库为备份状态,然后用操作系统命令,拷贝需要备份或恢复的文件。生产环境中使用的场景并不多,主要见于 archivelog 模式下,在表空间或数据文件级的备份。如果是 no archivelog ,一旦日志被覆盖,有备份文件也恢复不了。因为恢复的时候,要用到备份开始时刻之后的日志。
1.2 使用 SQL 语句进行控制文件备份
SQL 中操作
1 | alter database backup controlfile to '/home/oracle/notrace.ctl'; |
RMAN 中 操作
1 | backup controlfile to 'XX' 此XX和实际的控制文件格式一样,二进制文件,vi打开乱码 |
1.3 手动重建控制文件
官方文档:https://docs.oracle.com/database/121/SQLRF/statements_5004.htm#SQLRF01203
所有控制文件都丢失的情况下,手工创建控制文件前提是要知道 redo log 和 datafile 路径和数据库的字符集
重建控制文件实验步骤
1.3.1 删除控制文件
1 | SQL> select name from v$controlfile; |
1.3.2 手工重建控制文件
1 | CREATE CONTROLFILE REUSE DATABASE "OCP" NORESETLOGS NOARCHIVELOG |
1.3.3 查看控制文件
1 | SQL> ! ls /u01/app/oracle/oradata/OCP/ |grep control |
1.3.4 打开数据库
1 | SQL> alter database open; |
1.4 使用备份的控制文件(二进制文件)进行恢复
使用控制文件恢复数据库
1 | SQL>recover database using backup controlfile; |
会自动带出 Specify log: {=suggested | filename | AUTO | CANCEL} 信息
--filename 表示 recover 需要使用到的归档日志或在线日志
--AUTO 表示自动使用数据库推荐的归档日志或在线日志
--输入了错误归档日志或在线日志会报错,但是不影响继续恢复,可以继续输入 recover database using backup controlfile;继续选择正确的日志进行恢复
打开数据库
1 | SQL> alter database open RESETLOGS; |
因为,控制文件不是最新的,打开到 mount 状态后,这时可以查寻 select * from v$log,但是v$log.status 和 v$log.SEQUENCE# 不一定是准确的(控制文件中当前在线日志序列号还是陈旧的,是当初备份时的,而控制文件备份后 online redo log 可能进行了多次切换),若按常规方式打开,会报错,所以只要是控制文件是恢复或重建过来的,oracle 一律采用 RESETLOGS 重设日志功能,日志序列号从 1 重新开。原因:mount 状态不能修改