love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

关于写丢失导致的ORA-00742问题分析

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 关于写丢失导致的ORA-00742问题分析

近期某客户环境不定期出现写丢失报错,到账数据库无法进行归档。

类似上述错误,Oracle在进行归档时发现redo log有写丢失的情况,即数据不一致(会进行校验),则抛出上诉错误。

ORA-00742错误不太好模拟,这里简单模拟一下ORA-00312.

首先创建测试表,并进行相关update操作,在进行update的同时,通过strace lgwr进程定位相关偏移量。

接下来我们看下lgwr trace的相关情况:

定位到偏移量之后,这里我们可以借助bbed小工具来进行修改redo,以实现模拟写丢失的情况:

如上是我需要进行修改的数据并进行了16进制dump,下面来修改一下:

修改完成之后,我们来尝试切换一下redo log,看此时Oracle数据库是否能够进行正常归档。

从上述alert log来看,此时数据库已经报redo log corruption了,无法进行正常归档。我们进一步来看下归档进程的堆栈信息:

从上面的堆栈信息来看,与客户环境的报错相关堆栈是基本匹配的(客户环境是AIX平台,我这里是Linux)。由于我前面测试环境中,redo log组只有一个member成员,如果是每个redo log组有2个member,那么其中一个出现写丢失或者损坏,那么会影响归档吗? 带着这个疑问,我再次进行了测试。

首先我这里先处理一下故障环境,然后增加了log member成员:

接下来我们继续重复上述的测试过程:

同时打开strace跟踪,方便定位redo的读写偏移量:

从上面跟踪信息来看,偏移量在25600位置,写了2个block,那么偏移量则为52. 接下来通过bbed定位到52 号block,进行修改:

完成redo 修改之后,我们这里在进行redo 切换,看看是否能够正常归档或者是像前面一样报错呢?

可以看到此时数据库是正常运行的,redo归档不受任何影响,这也是符合预期的。

 

 

Leave a Reply

You must be logged in to post a comment.