背景
初始问题:一次数据写入,使磁盘被写满,造成oracle无法操作,无法连接。
在解决该问题时,往外备份并删除了部分表空间文件和redo日志文件,但df -h发现磁盘占用并没有变化(事后想想,可能是已经变化,但是系统没发现?)。且在oracle虚机使用sqlplus依旧无法连接。于是进行了reboot(没什么事是重启解决不了的!)。由此引出了接下来的问题。。。
重启后,lsnrctl start启动监听,sqlplus / as sysdba进入连接,startup启动实例,一气呵成。但真没成,startup失败了!提示读取控制文件时有错误。
试着执行一些sql,也无法执行,实例没启动成功。
尝试解决问题
1.寻找alert文件
报错中提示检查alert日志查看详细信息。由于不知道alert日志在哪,使用find查询了alert
#在/home目录下查询名称为alert的文件或文件夹
find /home -name alert
找到一些alert目录,找到oracle目录下的几个进去看了一下,都是xml格式的日志,其中都是一些执行信息,发现有这么一个错误,无法打开控制文件。
2.寻找控制文件
到该目录下,发现什么都没有,这应该就是问题所在了,控制文件丢失,至于为什么,我也不知道。
3.恢复控制文件
查询资料,有文章说控制文件丢失,可以关闭数据库,通过复制其余几个控制文件并改名来进行恢复。很不幸,我这所有控制文件都丢失了~
还有文章说,可以使用rman进行恢复,于是开始尝试。
进入rman
rman target /
startup nomount;
#到下面这一步已开始报错
restore controlfile from autobackup;
抱着试试看的心理,继续往下执行,一步一个错。。。
recover database;
alter database open resetlogs;
startup nomount;
一路错到了底,无路可走,exit退出!
这时,看到一篇文章中有个sql,可以查看控制文件。登录sqlplus,执行,居然可以执行,且在数据中惊喜发现在另一个文件夹下还有一个控制文件control01.ctl。
show parameter control_file;
于是结合多篇文章中的方法,尝试利用这个控制文件来恢复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变化表,无法用该命令删除。
又找到一篇文章,里面有一部分提到了如何删除变化表。
查看变化表
select change_table_name,CHANGE_TABLE_SCHEMA from CHANGE_TABLES;
删除变化表(省略了几句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数据库控制文件错误或者丢失解决办法