注册
DM备份还原过程中遇到的问题以及解决方法
专栏/技术分享/ 文章详情 /

DM备份还原过程中遇到的问题以及解决方法

anon 2025/08/08 158 0 0
摘要

在达梦数据库的日常运维中,备份与还原是保障数据安全的关键操作。然而,在本人实际操作过程中,往往会遇到各种问题,影响备份还原的顺利进行。本文将详细介绍达梦备份还原过程中常见的问题,并提供相应的解决方法。

单表数据被删除,如何在不影响其他表的情况下,恢复该表

在之前遇到该场景时,我的想法是对整个库进行全量备份和增量备份,然后直接对该库进行全量和增量恢复。但是这里就犯了一个错误,就是如果有A和B两张表,A正常写入数据往前推进了,B表数据被误删,等你发现B数据被删除之后,A已经正常写入了很多数据。如果在这时使用之前的思路,会导致A表在B表被删除之后写入的数据全部丢失。这就造成了更严重的后果。

所以我们一个改变思路。就是创建一个临时库,然后将备份还原到临时库中,再从临时库中单独导出B表的数据,将数据导入到原始库中,这样子B表的数据恢复了,A表正常写入的数据也不会受影响。

所以我们接下来改进操作:

1.准备工作

在这里,我准备两张表EMPLOYEE和表STUDENT。

两张表初始数据如下:

EMPLOYEE表:

STUDENT表:

首先我们需要先为该数据库创建一个全量备份。使用命令:

BACKUP DATABASE FULL TO full_backup_20250728 BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728';·

为数据库创建一份全量备份。

再为这两张表分别添加几条记录:
image.png

再通过一下命令对其进行增量备份:

BACKUP DATABASE INCREMENT CUMULATIVE  BASE ON BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728' BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/incr_backup/incr_backup_2025072917' ;

image.png

2.模拟误删场景

此时我们删除掉表EMPLOYEE中dept_id为10的数据DELETE FROM DLJ.EMPLOYEE WHERE DEPT_ID = '10';:

image.png

此时EMPLOYEE中的数据为:
image.png

此时我们继续再STUDENT表中添加数据:

image.png

image.png

3. 数据恢复

首先我们提前初始化好了一台临时实例tmp。基础配置均已配好。

执行命令对临时库进行全量恢复:

RESTORE DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' FROM BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728';

RECOVER DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' FROM BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728';

RECOVER DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' UPDATE DB_MAGIC; 

此时全量恢复已经完成,此时我们启动实例,查看实例中的数据。

image.png

发现数据正是全量备份时的数据。

然后我们再进行增量数据恢复:

执行命令对临时库进行增量数据恢复:

RESTORE DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' FROM BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/incr_backup/incr_backup_2025072917' with backupdir '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728';
RECOVER DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' FROM BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/incr_backup/incr_backup_2025072917';
RECOVER DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' UPDATE DB_MAGIC; 

image.png

此时增量恢复已经全部完成,我们查看示例中的数据:

image.png

image.png

两张表中的数据均是增量备份前的数据。但此时我们不能将整个实例数据全部导入到原来的库,因为表STUDENT中的数据在EMPLOYEE数据被删除后还添加了数据,发现这时候的表中是没有这些数据的,我们不能将STUDENT表中新增的数据给覆盖掉。所以正确的做法是将EMPLOYEE表单独导出,然后导入到原始表中,只还原表EMPLOYEE。

4.临时表数据导入原始表

我们通过dexp工具来到处表EMPLOYEE的数据。我们首先运行实例,然后在bin目录下使用以下命令:

./dexp USERID=SYSDBA@localhost:1108 FILE=employee.dmp LOG=employee.log TABLES=DLJ.EMPLOYEE DIRECTORY=/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/expdmp

参数解析:

USERID: 数据库的连接信息,必选。

FILE: 明确指定导出文件名称。

LOG: 明确指定日志文件名称。

DIRECTORY: 导出文件所在目录。

TABLES: 表名列表,导出一个或多个指定的表或表分区。

以下即表示导出成功。

image.png

到完成后,首先我们把原始表中的EMPLOYEE表数据删除,删除之后使用命令:

./dimp SYSDBA@localhost:1110 FILE=employee.dmp LOG=employee.log TABLES=DLJ.EMPLOYEE DIRECTORY=/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/expdmp

来导入数据,参数与到处数据参数相同。出现以下即表示导入成功。

image.png

我们通过可视化工具查看EMPLOYEE表中的数据:

image.png

发现数据已经成功恢复到了被误删除之前的记录,单表的误删恢复成功。

[-7169]:bakres与DMAP消息通信失败

在执行数据库进行全量联机备份时出现了下列错误:

[-7169]:bakres与DMAP消息通信失败.

image.png

看到这个报错消息,我的第一反应是查看DMAP服务有无启动。于是首先前往bin目录下尝试启动DMAP服务。

image.png

但发现DMAP服务已经启动。此时我们尝试重启数据库和DMAP服务:

image.png

再次在disql中执行全量备份,发现仍然报错:

image.png

因为这个数据库安装后运行这多个实例,多个实例共享使用同一个DMAP服务,我在想会不会是端口设置错误,于是我们先排查这台服务器中的DMAP服务运行端口,通过命令:

./DmAPService status #查看dmap服务运行pid
ss -tnlp | grep "pid=2107430" #通过pid查看运行端口

image.png

发现dmap服务运行的端口为1109端口,我们再排查实例设置的dmap监听端口,通过查看实例下的dm.ini文件中的EXTERNAL_AP_PORT 参数即可查看:
image.png

发现这里配置的为默认配置4326,与1109没有对上,我们修改此端口号为1109,再次重新启动实例,再次进行全量联机备份,发现备份成功:

image.png

image.png

[-8036]:无基备份或无匹配基备份

在临时库进行增量备份恢复时,出现了下述错误:

RESTORE DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' FROM BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728';

image.png

通过查询产品文档发现:
image.png

即做增量备份还原需要扫描全量备份,如果全量备份和增量备份在不同目录,当用 base on 指定某个增备备份集作为基备份时会扫描不到需要使用到的全备,所以会报错“无基备份或无匹配基备份”。

我们可以通过with backupdir来指定基备份搜索目录来指定基备份。:

RESTORE DATABASE '/data/test6/dljDmTest/dmdbms/dmdbms/data/tmp/dm.ini' FROM BACKUPSET '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728' with backupdir '/data/test6/dljDmTest/dmdbms/dmdbms/data/dljDmTest/backup/full_backup/full_backup_20250728'

使用上述命令后,再次执行增量恢复操作,即可成功
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服