解决oracle控制文件丢失造成实例无法启动的问题

Scroll Down

背景

初始问题:一次数据写入,使磁盘被写满,造成oracle无法操作,无法连接。

在解决该问题时,往外备份并删除了部分表空间文件和redo日志文件,但df -h发现磁盘占用并没有变化(事后想想,可能是已经变化,但是系统没发现?)。且在oracle虚机使用sqlplus依旧无法连接。于是进行了reboot(没什么事是重启解决不了的!)。由此引出了接下来的问题。。。

重启后,lsnrctl start启动监听,sqlplus / as sysdba进入连接,startup启动实例,一气呵成。但真没成,startup失败了!提示读取控制文件时有错误。
image.png

试着执行一些sql,也无法执行,实例没启动成功。

尝试解决问题

1.寻找alert文件
报错中提示检查alert日志查看详细信息。由于不知道alert日志在哪,使用find查询了alert

#在/home目录下查询名称为alert的文件或文件夹
find /home -name alert

找到一些alert目录,找到oracle目录下的几个进去看了一下,都是xml格式的日志,其中都是一些执行信息,发现有这么一个错误,无法打开控制文件。
image.png

2.寻找控制文件
到该目录下,发现什么都没有,这应该就是问题所在了,控制文件丢失,至于为什么,我也不知道。

3.恢复控制文件
查询资料,有文章说控制文件丢失,可以关闭数据库,通过复制其余几个控制文件并改名来进行恢复。很不幸,我这所有控制文件都丢失了~

还有文章说,可以使用rman进行恢复,于是开始尝试。
进入rman

rman target /
startup nomount;
#到下面这一步已开始报错
restore controlfile from autobackup;

image.png

抱着试试看的心理,继续往下执行,一步一个错。。。

recover database;

image.png

alter database open resetlogs;

image.png

startup nomount;

一路错到了底,无路可走,exit退出!
image.png

这时,看到一篇文章中有个sql,可以查看控制文件。登录sqlplus,执行,居然可以执行,且在数据中惊喜发现在另一个文件夹下还有一个控制文件control01.ctl。

show parameter control_file;

image.png

于是结合多篇文章中的方法,尝试利用这个控制文件来恢复flash_recovery_area文件夹下的控制文件。
首先进入sqlplus,关闭数据库,并以nomount方式启动

shutdown immediate
startup nomount

生成控制文件

alter database backup controlfile to trace as '/home/oracle/app/oradata/orcl11g/control01.ctl';

恢复服务

recover datebase;
alter database mount;
alter database open;

4.监听问题
此时,控制文件的问题已解决,但还有个问题,tns监听没有注册,实例启动失败。执行以下sql,注册监听。

alter system register;

5.表空间文件错误
注册完监听,又出现了一个新问题,表空间文件错误,提示中表名了具体是哪个文件。

查看这个表空间文件,dbf后多了几个不可见字符,很诡异。随手mv,把文件改成了原来的模样。可重启服务,open数据库时还是报表空间文件错误。ORA-01157: cannot identify/lock data file 5

查询资料得知,表空间文件损坏,可以通过屏蔽该文件,来保证服务正常启动。首先尝试这种方法。

根据提示,是data file 5出现问题,我们进入sqlplus,使其offline drop

alter database datafile 5 offline drop;

成功后,打开数据库,打开成功,服务成功启动。

alter database open

此时数据库可用,但该表空间还是有问题的,反正要清理空间,干脆把表空间删了重建,重新生成正确的表空间文件。

查询表空间和表空间文件

select username,default_tablespace from dba_users;

删除表空间、文件及其关联内容

drop tablespace YSP including contents and datafiles CASCADE CONSTRAINTS;

此时,报了个错,cdc变化表,无法用该命令删除。
image.png

又找到一篇文章,里面有一部分提到了如何删除变化表。

查看变化表

select change_table_name,CHANGE_TABLE_SCHEMA from CHANGE_TABLES;

image.png

删除变化表(省略了几句sql)

exec dbms_cdc_publish.drop_change_table('YSP','SXT41ADF7AB','Y');
exec dbms_cdc_publish.drop_change_table('YSP','SXTDAB454ED','Y');
exec dbms_cdc_publish.drop_change_table('YSP','SXT6D1174A9','Y');
exec dbms_cdc_publish.drop_change_table('YSP','SXT2BADBD15','Y');
exec dbms_cdc_publish.drop_change_table('YSP','SXT8D21E2D8','Y');
exec dbms_cdc_publish.drop_change_table('YSP','SXT55526596100','Y');

删除表空间

drop tablespace YSP including contents and datafiles CASCADE CONSTRAINTS;

重建表空间

create tablespace YSP datafile '/home/oracle/app/oradata/orcl11g/ysp.dbf' size 500M AUTOEXTEND ON NEXT 1G MAXSIZE 15G;

所有问题解决!

部分参考链接

oracle-控制文件的备份和恢复
使用rman恢复控制文件
控制文件丢失-恢复引起的一系列错误的解决
Oracle的控制文件的恢复与重建
oracle控制文件(controlfile)丢失恢复方法列举
oracle 的 startup,startup mount,startup nomount之间的区别
undo表空间数据表空间的数据文件同时丢失的恢复
oracle报ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
oracle磁盘空间满了解决办法
百度经验:oracle数据库控制文件错误或者丢失解决办法