Oracle控制文件损坏处理

复制代码
文件说明:控制文件记录数据库文件的信息和日志的信息等
查看控制文件
SQL> show parameter control_files

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/orclte
                                                 st/control01.ctl
模拟故障:将该文件清空
echo ‘’ > /u01/app/oracle/oradata/orcltest/control01.ctl

现象:前台正常的增删改查不受影响,但一旦出现切换日志或产生检查点时数据库宕机
SQL> alter system switch logfile;

alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 3433
Session ID: 1 Serial number: 5
数据库alert日志

Tue Mar 17 17:39:06 2020
Errors in file /u01/app/oracle/diag/rdbms/orcltest/orcltest/trace/orcltest_ckpt_3415.trc:
ORA-00202: control file: '/u01/app/oracle/oradata/orcltest/control01.ctl'
ORA-27072: File I/O error
...
LGWR (ospid: 3413): terminating the instance due to error 227
Tue Mar 17 17:40:37 2020
System state dump requested by (instance=1, osid=3413 (LGWR)), summary=[abnormal instance termination].
System State dumped to trace file /u01/app/oracle/diag/rdbms/orcltest/orcltest/trace/orcltest_diag_3403_20200317174037.trc
Dumping diagnostic data in directory=[cdmp_20200317174037], requested by (instance=1, osid=3413 (LGWR)), summary=[abnormal instance termination].
Instance terminated by LGWR, pid = 3413
可以看到ckpt这个进程最先发现控制文件损坏了,实例之后被lgwr进程杀掉。可能大家在做实验的时候发现实例是被ckpt杀掉,这也是有可能的,反正可以肯定的一点是,实例最后肯定会挂掉

修复:使用rman还原控制文件
rman target /
RMAN> startup nomount
RMAN> restore controlfile from/home/oracle/backupdir/c-2750922031-20200317-00’;
RMAN> alter database mount;
RMAN> recover database; // 这一步其实是使用archivedlog + redolog对控制文件进行恢复
RMAN> alter database open resetlogs;

说明:a. 不要使用删控制文件的方式去模拟该实验,这是由于ckpt、lgwr进程已经打开了控制文件,内存中已经有了这个控制文件的镜像,而rm命令并不能把这些进程已经打开的控制文件的句柄删掉。所以你会发现实例并没有挂掉。
b. 对数据库resetlogs之后,之前的备份就作废了,所以应该第一时间对数据库做一个全备。
c. 可能大家也注意到了,该实验中只有一个controlfile,当controlfile被破坏了之后,实例就挂了。如果是controlfile的多路复用,其中一个controlfile坏了数据库又是什么影响?我这里先说下我的结论:controlfile只要有一个坏了,实例就会奔溃,同时在alert日志中会提示具体是哪个controlfile损坏,解决办法就是复制一份好的controlfile去替换损坏的controlfile,重新启库即可。实验就留给大家自己做吧。附一段我实验的alert日志(ORA-00227: corrupt block detected in control file: (block 1, # blocks 1)
ORA-00202: control file: ‘/u01/app/oracle/oradata/orcltest/control02.ctl’)

总结:1. 控制文件恢复不会丢失任何事务,但会要求数据库resetlogs,这将会导致之前的备份片无效,所以恢复控制文件后最好做一个全库备份。
2. 对控制文件最好设置两个,一个坏了还能利用另一个恢复,对数据库的影响和恢复的时间都是最小的。
复制代码

 

posted on   数据派  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2024-01-27 MySQL联合索引面试题详解?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示