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

达梦数据库(DM8)误删数据处理

原创 宋万强 2021-09-11
9143

在日常工作中使用达梦数据库的时候可能会出现误删除数据的情况,那么出现误删数据后非常希望有一种简单快捷的方式可以恢复数。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。

误删表数据

达梦数据库支持闪回查询,当系统dm.ini参数中ENABLE_FLASHBACK设置为1时,闪回功能开启,可以进行闪回查询。这个参数默认是未开启的,使用如下命令修改此参数的值:

sp_set_para_value(1,'ENABLE_FLASHBACK',1);
或
alter SYSTEM SET 'ENABLE_FLASHBACK' = 1 BOTH;

ENABLE_FLASHBACK是动态系统级参数,更改后立即生效。
闪回查询完全依赖于回滚段管理,达梦会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度,由UNDO_RETENTION参数指定。更改回滚段保留一小时的时间:

sp_set_para_value(1,'UNDO_RETENTION',3600);
或
alter SYSTEM SET 'UNDO_RETENTION' = 3600 BOTH;

单位是秒,动态系统级参数,更改后立即生效。
例1 闪回查询特定时刻的CP01表。
CP01的结果集如下图所示:

SELECT * FROM SYSDBA.CP01;

微信截图_20210910144359.png

在2021-09-10 15:01:30时刻删除CP01部分数据并提交

DELETE FROM CP01 WHERE ID >= 1003;
COMMIT;
SELECT * FROM SYSDBA.CP01;

CP01结果集如下:
image.png
使用闪回查询得到删除前的数据。

SELECT * FROM SYSDBA.CP01 WHEN TIMESTAMP '2021-09-10 15:01:20';

image.png
例2 闪回查询指定TRXID的CP01表。
进行闪回版本查询,确定TRXID

select VERSIONS_ENDTRXID,ID,NAME,ID_CARD from SYSDBA.CP01 VERSIONS BETWEEN TIMESTAMP '2021-09-10 15:00:00' AND SYSDATE;

image.png
根据VERSIONS_ENDTRXID确定版本。
VERSIONS_ENDTRXID是一个伪列,专用来支持闪回版本查询,闪回版本查询支持的伪列如下表:
image.png

SELECT * FROM SYSDBA.CP01 WHEN TRXID 5080;

根据事务号就查询到删除以前的数据
image.png
在这里只展示了DELETE表数据后的闪回查询,对于UPDATE、INSERT也是同样的道理。
注意:上述闪回功能不适用于使用DROP、TRUNCATE命令删除表的情形。

误删控制文件

达梦数据库每一个实例都有一个控制文件dm.ctl,它是一个二进制文件,记录了数据库必要的初始信息。实例在运行期间,误删控制文件或控制文件损坏,不会影响实例服务的运行(创建表空间会失败,控制文件里面记录了数据文件的位置,创建表空间会更新控制文件,所以抛错“控制文件错误”),若重启实例,则会报以下错误:
image.png
为了预防控制文件的损坏或丢失,达梦数据库设置了自动备份控制文件的策略,具体策略请查看《DM8系统管理员手册》,控制文件备份的路径一般在数据目录下的ctl_bak目录下,可以通过查看dm.ini中的CTL_BAK_PATH参数来确认控制文件备份路径
image.png
进入ctl_bak目录,确认最新的控制文件并把它拷贝到数据目录下重命名为dm.ctl,再启动数据库就可以了(以上操作推荐用dmdba用户来操作,若是使用root用户来操作的,需要将拷贝回来的dm.ctl文件的所有者和所属组更改为dmdba和dminstall,命令是chown dmdba:dinstall dm.ctl),如下图:
image.png

误删数据文件

这里说的数据文件是达梦数据库中以.DBF为扩展名的文件,数据文件是数据库中最重要的文件类型,它是真实存储数据的地方。我们来看看删除不同的数据文件,达梦数据库启动时会报什么错误呢?
删除SYSTEM.DBF文件
报错“/home/dmdba/dmdbms/data/DAMENG/SYSTEM.DBF not exist”,数据库进程直接退出
image.png
删除ROLL.DBF文件
报错“/home/dmdba/dmdbms/data/DAMENG/ROLL.DBF not exist”,数据库进程直接退出
image.png
删除MAIN.DBF
报错“/home/dmdba/dmdbms/data/DAMENG/MAIN.DBF not exist,force to be off-line
User data files missed, Force to startup MOUNT”,数据库实例只能启动到MOUNT状态
image.png
删除用户数据文件TBS01.DBF
报错“/home/dmdba/dmdbms/data/DAMENG/TBS01.DBF not exist,force to be off-line
User data files missed, Force to startup MOUNT”,数据库实例只能启动到MOUNT状态
image.png
删除TEMP.DBF
数据库服务能正常启动
image.png
从以上的结果可以看出,除了删除TEMP.DBF文件外,删除其他数据文件数据库服务启动都会出现故障。
针对数据文件被误删的处理主要分为两种情况:

  1. 数据库服务已经停止了,无法正常启动的情况
    处理方法是创建一个参数和故障实例一致的新实例,利用备份+归档的方法对数据库进行还原和恢复,从实例日志获取故障时间来确定需要恢复到的时间点。从这里我们就可以看出数据库备份和归档日志的开启是非常重要的,对于生产系统,开启归档和设置定时备份是必须要做的。若这种情况下未开启归档也没有备份文件,那么数据可能就真的无法找回来了。对于ROLL.DBF文件丢失,如果没有备份和归档,可以选择跳过ROLL.DBF启动数据库,修改dm.ini参数PSEG_RECV为0。
  2. 数据库服务还能正常提供服务
    经测试,数据文件丢失后达梦数据库服务在一段时间内还能运行,当然数据库是存在风险的,此时不要着急关闭数据库服务。应立即使用达梦数据迁移工具DTS或逻辑导出导入工具将数据迁移到一个新的实例上,当然新的实例上需要创建和故障实例一样的表空间和数据文件、用户名,为每个用户分配表空间。
    查询DBA_USERS可以获取用户名和表空间、数据文件的对应关系
SELECT USERNAME,DEFAULT_TABLESPACE,PROFILE from DBA_USERS;

image.png

误删dm_service.prikey文件

dm_service.prikey是达梦数据库密钥文件,删除后数据库无法启动
image.png
但是这个文件删除不会造成数据库数据丢失,解决办法是初始化一个新的实例,将新实例的dm_service.prikey拷贝到故障实例数据目录下,数据库就能成功启动:
image.png

误删REDO日志文件

达梦数据库REDO日志文件即重做日志文件,是数据在运行过程中正在使用的日志文件,所以又称为联机日志文件。它存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。
删除REDO日志文件,则实例无法正常启动。
image.png
误删REDO日志处理方法:

  1. 有备份文件和归档日志的情况下,使用“备份+归档”进行恢复,这是一种比较保险的恢复方式,可以达到完全恢复的效果,即数据能恢复到发生故障之前的那一刻。
  2. 没有备份和归档的情况下,可以选择替换REDO日志启动数据库,但是这种方案是不完全恢复,可能会丢失部分数据。
    在这里主要介绍一下无备份和归档的情况下替换REDO日志处理方法,步骤如下:
    1)初始化一个和故障实例参数一致的实例并正常启停一次
./dminit path=/home/dmdba/dmdbms/data page_size=32 extent_size=32 CASE_SENSITIVE=1 CHARSET=1 port_num=5238 DB_NAME=DAMENG02 INSTANCE_NAME=DAMENG02
./dmserver /home/dmdba/dmdbms/data/DAMENG02/dm.ini

2)查看故障实例的db_magic值和pemnt_magic值

./dmmdf type=1 file=/home/dmdba/dmdbms/data/DAMENG/SYSTEM.DBF

image.png
db_magic:数据库魔数 pemnt_magic:数据库永久魔数
3)修改新实例的db_magic值和pemnt_magic值

./dmmdf type=2 file=/home/dmdba/dmdbms/data/DAMENG02/DAMENG0201.log
./dmmdf type=2 file=/home/dmdba/dmdbms/data/DAMENG02/DAMENG0202.log

image.png
image.png
image.png
image.png
这里因为使用的是同一个数据库程序,pemnt_magic值是一致的,所以不用修改。
4)将修改后的REDO拷贝到负债库,并按照故障库的REDO日志命名,尝试启动数据库

cp ../data/DAMENG02/DAMENG0201.log ../data/DAMENG/DAMENG01.log
cp ../data/DAMENG02/DAMENG0202.log ../data/DAMENG/DAMENG02.log
./dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini

image.png
数据库已经启动起来了。
总结一下,误删数据在工作中是要尽量避免的,若不小心删除了数据,就会发现备份和归档对我们来说是多么重要。所以在工作中在尽量避免误删数据的同时,数据库也要做好备份并开启归档。
更多资讯请上达梦技术社区了解:https://eco.dameng.com

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论