作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等)
公众号:老苏畅谈运维
欢迎关注本人公众号,更多精彩与您分享。
在系统断电或数据库异常宕机后,数据库启动过程中可能出现ORA-01113 ORA-01110 这些错误,而你又没有备份,未开归档或者归档已经被删除了,那要怎么办呢?
启动报错如下:
SQL> startup;
Fixed Size 1248600 bytes
Variable Size 100663976 bytes
Database Buffers 184549376 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
第 1 行出现错误:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: '/u01/app/oracle/oradata/system01.dbf'
一、问题原因
从报错信息可以看出,数据文件system01.dbf需要介质恢复,表明该数据文件已经受损。
二、解决问题
再做下面一些操作前,先给数据库做一个冷备份,给自己一个回退的机会:关闭数据库情况下,备份相应的数据文件、控制文件、redo文件及参数文件等。备份完了,你就可以放心大胆使用下面的“六脉神剑”来开库,绝对好使。
1、尝试恢复数据文件
--启动到mount状态
startup mount;
alter database recover datafile '/u01/app/oracle/oradata/system01.dbf'
若不成功,则继续以下步骤。
2、修改隐含参数启动数据库
alter system "set _allow_resetlogs_corruption"=true scope=spfile;
alter system "_allow_error_simulation"=true scope=spfile;
alter database open;
若不成功,则继续以下步骤。
3、重建控制文件
--先生成控制文件
alter database backup controlfile to trace;
select * from v$diag_info where name='Default Trace File';
打开trace文件,找到resetlogs方式重建控制文件那部分内容,如:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M BLOCKSIZE 512,
GROUP 4 '/u01/app/oracle/oradata/redo04.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
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 ZHS16GBK
;
执行完重建控制文件,做一个不完全恢复:
RECOVER DATABASE USING BACKUP CONTROLFILE;
做完不完全恢复,不着急打开,我们先推进数据库的SCN。
4、推进数据库的SCN
如何推进数据库的SCN,不同数据库版本有不同的方法,可以参考之前的文章:
史上最全,呕心沥血总结oracle推进SCN方法(一)
史上最全,呕心沥血总结oracle推进SCN方法(二)
史上最全,呕心沥血总结oracle推进SCN方法(三)
史上最全,呕心沥血总结oracle推进SCN方法(四)
史上最全,呕心沥血总结oracle推进SCN方法(五)
史上最全,呕心沥血总结oracle推进SCN方法(六)
史上最全,呕心沥血总结oracle推进SCN方法(七)
史上最全,呕心沥血总结oracle推进SCN方法(八)
这么多种方法,总有一种适合你的。
推进完SCN,就可以使用 alter database open resetlogs 打开数据库
5、增加数据库参数,防止事务恢复
强制打开后,如果碰到ORA-00607错误,可以加以下参数,临时禁止禁用smon事务恢复:
alter system set event=‘10513 trace name context forever,level 2 : 10512 trace name context forever,level 1: 10511 trace name context forever,level 2: 10510 trace name context forever,level 1’ scope=spfile;
6、调整数据库undo管理方式,创建新的undo
后续还可能碰到undo相关的报错,可以通过重建该表空间解决:
create undo tablespace undotbs2 datafile '/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 10G;
alter system set undo_management=MANUAL scope=spfile;
alter system set undo_tablespace= 'undotbs2' scope=spfile;
7、善后处理工作
我们在处理过程中,添加了一些使数据库不一致的不安全的参数,记得数据库正常后,要去掉,如:
alter system "set _allow_resetlogs_corruption"=false scope=spfile;
alter system "_allow_error_simulation"=false scope=spfile;
另外数据库打开后,我们最好是做一次备份,数据导出。
好了,我已经将如何开库的“六脉神剑”传授给你了,如果你还有疑惑,欢迎关注。