其他分享
首页 > 其他分享> > 达梦误删除roll数据文件处理

达梦误删除roll数据文件处理

作者:互联网

roll表空间存储存放事务的undo信息,本文对roll表空间中数据文件的误删除或者数据页损坏进行模拟测试,了解在误删除或者损坏的情况下,如何进行修复,以便于在处理生产问题时,提供充足的操作方法。

首先了解一下此表空间数据文件的作用,我这里总结大概有三种:

1.用来记录事务的回滚信息

如一个执行一个增删改的操作,在redo中记录重做信息之外,同时也会在roll表空间中记录回滚信息,如果此事务提交,则根据表空间大小以及事务的undo时长(参数UNDO_RETENTION)共同决定记录什么时候可以被覆盖,如果事务一直未提交,则一直保留,直到事务提交或回退,在事务一直未提交,且实例故障重启的情况下,因为事务会因实例的终止而回滚,这时也会利用roll里记录的信息,对整个数据库的事务做一致性的前滚操作,以保证事务的一致性。

2.事务的闪回查询

由于误操作带来的事务丢失,可以使用达梦数据库的闪回查询,查询到删除之前的事务信息(结合原表数据+roll里的事务信息,查询到当时整个表的完整记录,当然得同时满足UNDO_RETENTION和roll空间的大小),快速的查询到误操作之前的数据。

roll表空间的误删除分类

目前主流的达梦服务器平台,基本都是linux,所以这里也以linux下的情况做模拟,分为如下三种情况:

1.实例处于正常关闭状态

2.实例处于异常关闭状态

3.实例处于运行状态

接下来就以上三种情况进行分别模拟,出现相应的问题时,查看如何进行恢复

 

实例处于正常关闭状态下的操作

使用备份操作进行恢复属于常规操作,这里不做描述,尝试新建数据库,然后拷贝数据文件的方式进行恢复,先查看一下控制文件中是否记录数据文件的大小,这一步操作也是想解决可能忘记roll数据文件大小的情况下,能否进行恢复:

控制文件中未记录roll数据文件的大小,那记录此文件大小的就是在数据文件本身的头部信息中。

先查看原来数据库的db_magic值是多少,再将新建数据库的值也修改为此值

新建数据库,并且给roll数据文件大小指定一个和原库大小不一致的值,再修改新数据库的db_magic,修改方法即为dmmdf命令(这里不描述,直接dmmdf help即可查看帮助手册)

同时利用dmmdf修改两个重做日志的db_magic,这里不做描述。

修改后,拷贝新库的文件到数据文件目录,启动数据库,还是不能启动,查看错误信息:

后经过多次尝试,依然不能启动数据库,那这样就只能是使用备份进行恢复才能解决此问题了。从备份中进行还原后续会以专题形式进行展示,这里不进行模拟测试。

从以上的操作过程可以得出:数据库备份是异常情况下,数据找回以及状态恢复的重要手段,也是DBA最重要的职责,任何时候,都需要针对系统做完善的备份机制,确保在出现任意文件损坏的情况下,都能找回数据。

 

实例处于异常关闭状态

此过程经过验证,和正常关闭一样,这里不进行描述。

 

实例处于运行状态

对于windows平台,如果实例处于运行状态,OS持有文件,此时不能进行数据文件的删除,所以不存在这种情况,linux可以删除,但是可能通过持有的句柄文件找回,这里进行测试。

使用OS命令删除文件,查看dmserver的进程:

ls -l /proc/5605/fd/

查看结果:

此时显示文件已经被删除,假设此时还有一些事务在运行,查看事务的运行状态以及数据库状态:

 

此时可以进行正常的表创建以及事务操作,数据库也没有任何报错信息。

使用缓存文件进行ROLL.DBF的恢复

cp /proc/5605/fd/9 /dbdata/dmdata/mesdb/ROLL.DBF

然后再进行一次事务操作,查看是否需要对拷贝回来的文件进行恢复,执行事务后,重启数据库

经过验证,可以直接启动实例,查看后台日志也无任何事务操作相关描述。

从以上验证过程中,可以得出,对于Linux平台来说,如果要实现对被误删除的文件,直接从缓存中拷贝文件即可进行恢复。

结论:

1.备份重于一切,是数据找回以及保证实例可用的最关键手段,任何时候都有设计合理的备份方案

2.对于实例运行状态中的数据丢失,一定不能进行操作系统和实例的重启,还可以从缓存中找回数据。

标签:误删除,事务,数据文件,数据库,实例,roll,达梦,进行
来源: https://www.cnblogs.com/ly-nye/p/16477848.html