暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

007 #Oracle#记一次DG服务器事故导致的ORA-10458 ORA-01196 ORA-01110问题

拾遗补 2021-04-16
3053

一、说在前面

DG物理备库无法Open,报错ORA-10458,ORA-01196,ORA-01110,这个情况已经不是第一次出现了。上次是由于DG物理备库所属服务器内存出现致命错误导致服务器宕机。修复服务器后,启动Oracle出现了这三个错误,当时着急恢复服务就没有深究原因。

根据当时报错分析,事故原因应该是数据库意外断电,导致CKPT进程来不及更新文件头SCN号,从而造成文件头和文件块SCN号不一致,重启时Media Recovery恢复数据库,又因为DG缺失后续日志,从而报错(后面证明还有后半段原理没有搞清楚)。

但是对为何要把归档追至与主库一致才能开启数据库的原因一知半解,本次又出现了这个问题,借此打算弄的更加明白

二、事情现场

事情是这样的,周一监控DG物理备库延迟的邮件出现异常,消息显示无此命令,备库无法远程登录数据库,同时监控系统发现备库所在服务器磁盘数量发生改变。
登录系统查看情况发现,大量系统命令无法正常执行,报错显示命令不存在。查看数据库情况,执行Sqlplus命令一直处于Hang死的状态,查询数据库进程均正常。查看磁盘挂载情况,确实少了三块存储服务器挂过来的磁盘,定位所属VG为Oracle存放归档日志文件目录。查看存储服务器,发现存储控制器出现了故障,紧急更换磁盘后,发现服务器上原VG无法识别新的磁盘,同时扫描磁盘命令无法正常执行。
基本定位到问题后,判断系统盘VG读取存在问题,问题VG存放文件可恢复,果断Kill数据库进程,重启服务器看看是否可识别出磁盘。重启后,磁盘正常读出,VG恢复。
此时启动Oracle,又出现了无法Open数据库,ORA-10458,ORA-01196,ORA-01110三个错误再次出现。

三、解决之道

关于这个问题,MOS上的相关文档已经说的很清楚了:Open Standby Database Fails due to ORA-1110/ORA-1196/ORA-10458 (文档 ID 2047793.1)如下:

文档分析成因如下:

文档提供解决方案如下:

所以需要恢复的话也很简单。

第一步,开启日志应用,确保MRP进程正常应用归档。

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

第二步,等待从库归档应用追平主库。(从库Alert log归档后出现in transit即为应用的归档为主库Redo中正在产生的)

第三步,停止从库日志应用,开启数据库,然后恢复实时应用,拉起ADG。

SQL>  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SQL>  ALTER DATABASE OPEN;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

问题解决。

四、更深层次的复盘

根据这次的问题,查看了Alert Log相关报错,通过与Oracle原理比对,得出以下结论:

ORA-10458,ORA-01196,ORA-01110问题形成的原因是由于物理备库异常关闭,导致CKPT进程来不及更新文件头的SCN号,数据库Down的时候一部分文件头的Fuzzy bit状态仍为Open。当重新启动备库至Read Only状态的时候,对比SCN号后发现数据库需要Media Recovery,但是由于归档的缺失,Media Recovery失败,文件头的Fuzzy状态无法变更为No,故无法开启数据库。

Fuzzy标记位于数据文件头块Offset 138中。可以使用bbed进行查询,0x04表示Fuzzy为Yes,0x00表示Fuzzy为No。如果Fuzzy为Yes,那么说明数据块中的SCN大于数据文件头的SCN,此时就说明数据库异常关闭或者在Open状态,执行完Recover后,Fuzzy变为No,那么说明数据库应用日志后,数据文件头部的SCN应用日志后增长,此时数据文件头部SCN大于数据块中SCN,Fuzzy为No。
以下Alter日志证实了以上观点

明白发生原理后,后面的操作的目地其实就一目了然了。开启日志应用是为了推进各文件头的SCN号,那什么时候将SCN号统一呢,结论出乎我的意料,SCN号统一状态的更改居然是停止日志应用操作触发的,如下图。

之后的Open操作触发的“SMON:enabling cache recovery”其实也很有意思。

在数据库正式Open前需要对字典缓存进行恢复,这个步骤被称为Cache Recovery,其实是Row Cache Recovery,与官方文档中描述的Cache Recovery不同,Row Cache Recovery应当是Oracle Internal的叫法。

同时实际执行Row Cache Recovery的不是SMON进程,而是启动实例的服务进程。在恢复完字典缓存后数据库即正常开启。


至此,研究结束,我满意了。


PS:在这篇文章求证阶段,借鉴了很多前辈的研究成果。一方面感叹老一辈DBA们的精益求精,一方面更加坚定了分享知识的念头,独木不成林,太阳底下无新鲜事,要努力。








文章转载自拾遗补,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论