故障恢复:从未知错误ORA-600 [3712]以猜测推理达成恢复

李真旭

Oracle ACE,云和恩墨技术专家

个人博客:www.killdb.com

在Oracle数据库的日常维护中,我们可能经常会遇到一些从未见过的错误,甚至莫名其妙的错误。很多时候,甚至通过metalink、baidu、甚至google 都无法搜索到相关内容。这不,昨天公司南区同事让帮忙恢复的的一个客户数据库;据说是归档数据库,没有备份,重启实例后就无法打开数据库了。

我也是第一次听说这种事情,看了下居然是Oracle 11.2.0.3的数据库,还有这样起码的事情,确实有点匪夷所思。首先我们来看下是报错是什么样的。

看到这个错误。我感觉有一定似曾相识的感觉,但是有又说不来具体是什么错误。不过从错误号来看,我可以大致判断跟什么内容有关系。这里我拓展一下,对于Oracle ora-00600 错误,metalink有一篇详细的文档描述,里面对600错误后面的错误编号进行了分类。对于该文档大家务必了解下。所以现在即使我从未见过的ora-00600错误,我仍然可以第一眼就能大致判断是哪方面的问题。这里列举下:

从描述来看,我们可以大致判断,该错误肯定跟redo 有关系。

我们再回头去看下alert log的信息,可以看到一行比较关键的信息:

crash recovery due to error 600.

对于Oracle 数据库的open过程,我们知道需要经过nomount–mount–open这样几个过程,如果是异常关机例如强制abort的情况,那么open数据库时,Oracle 需要进行instance recovery;实际上我查询v$Log 也可以发现current redo logfile 的next_change# 为无穷大.

首先我尝试手工进行了一次recover database,没有任何问题,然后alter database open还是报上面的3712错误。这里我发现一个问题,所有的scn都已经变化,而且更新到了一致的状态。但是为啥还是报错呢?

我们知道其实Oracle open的时候不仅仅是需要去进行实例恢复,实例恢复完成后,需要顺利open数据库。如果我们试想是否存在这样一种场景:

假设当前我们恢复的数据库scn已经到了100000,然而实例恢复完成后open时发现下一个要更新的scn比当前的要小(比如99999),会怎么样呢? 很明显这是会报错的。

很多人或许看不懂,甚至不理解我为什么会这样设想,这里主要有2个因素:

1、 基于对于数据库原理的基本理解,深入了解oracle数据库open的过程 2、细心观察上述的ORA-00600 错误.

ok,就拿这个错误来讲 [3371],[612688841],[3371],[612688840];当我们看到这一串数字的时候,我们应该认为或者试想这写数字都是什么含义 ?

根据我们的数据库理解和经验来判断,通常都是表示序列,dba地址,文件号,scn等等这些。

我想,稍微有一点常识的人可能都能看出来,这里应该是表示的SCN。或许有人说为什么这里会是表示的scn呢?

如果这样想,那说明你不了解Oracle scn的基本结构。Oracle 中的scn,分为高位和低位两部分组成。大致上如下:

scn最低值是0×0000.00000000,最高值是0xffff.ffffffff。 高位是scn wrap,即0×0000,低位是scn base,即后面的8个位。 正确的SCN应该是=scn warp * power(2,32)+scn base

能够想到这里,我想我们可以大致判断这里的3371 应该是scn wrap值,而后面的612688841应该是scn base。将scn换算一下然后和文件头的最新scn进行比较,发现完全符合。这里能够验证我们的判断。

到这里,我们可以发现一个问题,scn不对啊? 为什么不对? 因为这里出现了2个scn,分别是:

3371*power(2,32)+612688841 和 3371*power(2,32)+612688840

很明显,这2个值大小不同,我想Oracle 肯定是进行判断,发现即将产生的scn比我们当前的scn还要小,才会出现这个情况。那么后面要小的scn就是有问题的scn。而这个scn 比如来源于控制文件。

想到这里,我就知道,我应该如何去完美解决这个问题了。那么答案就是重建控制文件。

如下是恢复的基本步骤,重建控制文件的步骤就不再描述了。

产生重建控制文件的脚本后,重建控制文件,记得noresetlogs 方式去创建即可(rac环境需要修改cluster_database=false);创建完毕后直接recover一把,然后顺利open数据库,完美收工!

补充:

1、后面我查询发现这极有可能是Oracle 11.2.0.3的bug:

Bug 16432211 : ORA-00600 [KCRFNL_3], LGWR… TERMINATING THE INSTANCE, ORA-00600 [3712]

后面我查询之前的alert log和trace 发现基本上完全一致。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Web APP编程模型和IO策略

现代大型高性能网站诸如淘宝,京东,微博,FB,知乎等等,网站架构涉及很多知识。像业务分层,软件分割模块化,分布式部署,集群服务器,负载均衡等技术可以帮助架构师将...

3507
来自专栏Timhbw博客

关于网站后期速度优化的一些坑

2016-06-0109:12:42 发表评论 231℃热度 由于网站已经迁移完成,所以昨天在优化服务器和WP,加快读者们的访问速度,毕竟有强迫症的我不能忍受...

2764
来自专栏IT 指南者专栏

基于 Hexo + GitHub Pages 搭建个人博客

? 前言:我的博客写作之路 15 年刚上大学,第一次接触公众号,就萌生了创建一个公众号写点东西,但最终不了了之。 很快到了 16 年,开始接触网上各大博客网站...

36710
来自专栏FreeBuf

手机没Root?你照样可以渗透路由器

和Metasploit差不多,RouterSploit是一个强大的漏洞利用框架,用于快速识别和利用路由器中的普通漏洞,它还有个亮点,就是可以在绝大多数安卓设备上...

4224
来自专栏大魏分享(微信公众号:david-share)

一个虚拟化客户上云的需求分析&架构设计-大卫的Azure学习笔记大全

案例分析与架构设计 案例分析:大卫公司电子商务网站案例研究 大卫公司是北京的一家媒体和出版公司,拥有约2000名员工。它有一个成功的直接面向消费者的电子商务网站...

3798
来自专栏AI科技评论

干货 | 马蜂窝数据被扒光, 用 Python 爬取网页信息 4 分钟就能搞定

图片来自https://www.freestock.com/free-photos/illustration-english-window-blue-sky-c...

1243
来自专栏用户2442861的专栏

高性能网络编程5--IO复用与并发编程

对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒...

801
来自专栏嵌入式程序猿

究竟哪款适合你

随着物联网的越来越火,嵌入式工程师需要更多的网络知识,其中TCP/IP协议栈是我们经常要用到的,在公众号里曾给大家介绍过开源的Uip和LwIP协议栈,并在fre...

3357
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(十七):我要学习配置

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

1261
来自专栏数据和云

【推荐】 RAC 性能优化全攻略与经典案例剖析

ORACLE RAC凭借其卓越的容错能力和可扩展性以及对应用透明的切换能力引领了数据库高可用架构的潮流,但在实际的生产环境中,出现的性能问题非常多,对数据库的稳...

3117

扫码关注云+社区