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

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

达梦数据库学习笔记之 — 当current redo和undo都损坏(无备份),只有歇菜

之前测试了达梦数据库的几种恢复场景,比如redo丢失,undo丢失都没问题;其中redo丢失后,进行了简单构造,竟然能恢复成功也不丢失;

当时怀疑难道达梦不会进行脏数据落盘嘛?这里进行了简单测试:

将该表所在数据文件的一个extent block全部进行dd dump:

可以看到,很容易找到我们这个测试表的几条数据;接下来手工插入一下数据,并触发checkpoint:

我们可以看到,脏数据已经在数据文件中了;虽然事务没有提交。

下面我们继续测试当current redo丢失,同时undo文件也损坏或者丢失的情况下,达梦数据库有办法能够打开吗?

同时删除current redo和undo后,此时去启动数据库会报什么错误呢?

直接提示我们的回滚段文件不存在,无法启动数据库。ok!既然如此,那么我们接下来重建一下控制文件,将回滚段文件从控制文件中删除:

接下来我们继续构造丢失的redo文件:

最后我们来尝试启动数据库,看看效果:

此时数据库日志信息如下:

最后我们参考达梦数据库官方文档建议,将如下参数修改为0:

关于该参数的说明如下:

PSEG_RECV 参数释意:
系统故障重启时,对活动事务和已提交事务的处理方式。
0:跳过回滚活动事务和 PURGE 已经提交事务的步骤。
1:回滚活动事务并 PURGE 已经提交事务;
2:延迟 PURGE 已提交事务,延迟回滚活动事务;
3:回滚活动事务,延迟 PURGE 已提交事务

简单的讲,参数修改为0之后,达梦数据库能够跳过未提交的活动事务;类似Oracle 跳过未提交事务的方式。

不过不幸的是,我尝试了多次启动;发现均不行:

从达梦数据库产生的core文件来看,跟之前的信息类似:

由此可见,似乎设置参数之后,达梦数据库仍然没有去跳过事务检查,再检查过程中仍然发现了未交提交的活动事务;最后出现导致无法启动。

这里我尝试通过gdb 设置断点的方式,试着去打开数据库,均以失败告终!

如果是Oracle数据库的话,类似这样的场景,我们处理起来是相对容易的,最起码我们还可以bbed修改block。

不幸的是,达梦数据库提供的dmmdf工具,功能非常有限,对于system文件而言,仅能修改3个属性;相对来讲,对于redo的修改支持更多一点。

对于这里测试的极端场景,如果没有备份,估计是没什么办法了。(因为达梦还没有数据抽取工具)。

Leave a Reply

You must be logged in to post a comment.