达梦数据库定时备份及数据还原(踩坑记录)
设置定时备份可参考 DM8:达梦数据库定时自动全库备份与删除备份,我这里是新建了一个全量备份的任务,每天零点执行。
下面主要介绍还原过程中遇到的问题。想看结果直接到还原步骤总结。
首先,从服务器拷贝出备份得到的文件夹,比如DB_DAMENG_FULL_2025_04_24_00_00_37,其中有.bak和.meta结尾的文件。
然后参考达梦数据库备份、恢复指南,先停止测试还原用的达梦服务(使用 dmdba 用户,下面一样):
cd $DM_HOME/bin
./DmServiceDAMENG stop
其中DmServiceDAMENG是实例服务名,根据实际情况调整。
然后使用 dmrman 工具进行还原:
cd $DM_HOME/bin
./dmrman
restore database '/path/to/instance/dm.ini' from backupset '/path/to/backup';
其中/path/to/instance/dm.ini是达梦实例配置文件可以用find / -name dm.ini查找其路径,/path/to/backup是备份文件夹路径,比如DB_DAMENG_FULL_2025_04_24_00_00_37文件夹的全路径。
遇到问题,提示[-7170]:Bakres failed to connect DMAP,因为 DmAPServive 服务未启动,执行如下命令启动服务后问题解决:
cd $DM_HOME/bin
./DmAPService start
还有一次报错[-7169]:bakres与DMAP消息通信失败.,且发现DmAPService已经启动,重启后问题解决:
cd $DM_HOME/bin
./DmAPService restart
遇到问题,提示[-8381]:备份集子版本不匹配,最终通过安装原服务器上相同版本的达梦解决,安装方法参考数据库安装。
然而,报错DM-523:磁盘空间不足,先删掉部分文件,然后重新执行命令,报错文件已存在,估计是因为上一次恢复时恢复了部分文件,再次执行命令时发现文件存在,所以报错。所以加上overwrite指明覆盖:
restore database '/path/to/instance/dm.ini' overwrite from backupset '/path/to/backup';
结果报错DM-124: SYSTEM.DBF文件不存在,估计还是因为上次执行失败导致的,删除数据库实例后重新创建,再次执行命令,还是磁盘不够,最后换了一台磁盘更大的虚拟机。
再次执行命令,报错DMAP-8024:数据文件读写出错,发现是用的root用户执行命令,换成dmdba执行就不会有这个问题。
上面的命令执行成功后,以为已经可以启动了,执行DmServiceDAMENG start尝试启动,报错:
Instance DBSERVER startup failed, execute 'recover database ... update db_magic' in dmrman.
既然它提示要执行这个命令,那就先执行看看:
recover database '/path/to/instance/dm.ini' update db_magic;
报错RMAN-8308:需要先执行RECOVER DATABASE操作,再执行RECOVER DATABASE UPDATE DB_MAGIC操作。
发现教程中也有说需要执行该命令:
recover database '/path/to/instance/dm.ini' with archivedir '/path/to/backup';
然而执行上面的命令报错RMAN611:恢复操作未完成,谁知道这是什么意思?而且这个命令为什么后面是with archivedir,难道需要归档格式的备份文件?顺便说一句,达梦针对备份还原就有一个接近三百页的 PDF 说明文档,反正我是没怎么看懂。
问题出在哪?
最终发现应该要执行如下命令:
recover database '/path/to/instance/dm.ini' from backupset '/path/to/backup';
谁能想到呢,我所看到的网上的文档中全部是with archivedir,而实际上是from backupset。这条命令是 DeepSeek 给出的。
然后,又出现了新的错误DM-8363:从备份集生成临时日志文件失败。
切换到达梦数据库日志文件夹:
cd $DM_HOME/log/
[root@localhost log]# ll -t
总用量 972
-rw-rw-r--. 1 dmdba dmdba 162416 5 月 7 15:28 dm_BAKRES_202505.log
-rw-rw-r--. 1 dmdba dmdba 131314 5 月 7 15:28 dm_dmrman_202505.log
-rw-r--r--. 1 dmdba dmdba 25042 5 月 7 15:28 dm_dmap_br_202505.log
-rw-r--r--. 1 dmdba dmdba 789 5 月 7 15:28 DmAPService_err.log
-rw-r--r--. 1 dmdba dmdba 6591 5 月 7 15:28 dm_dmap_202505.log
-rw-r--r--. 1 dmdba dmdba 768 5 月 7 11:55 dmsvc_sh.log
-rw-rw-r--. 1 dmdba dmdba 218730 5 月 7 11:55 dm_DBSERVER_202505.log
-rw-rw-r--. 1 dmdba dmdba 590 5 月 7 11:55 DmServiceDMTEST_err.log
-rw-rw-r--. 1 dmdba dmdba 847 5 月 7 11:55 dm_unknown_202505.log
-rw-rw-r--. 1 dmdba dmdba 0 5 月 7 11:50 DmServiceDMTEST.log
-rw-r--r--. 1 dmdba dmdba 0 5 月 7 11:41 DmAPService.log
-rwxr-xr-x. 1 dmdba dmdba 480 5 月 7 11:41 install.log
-rw-rw-r--. 1 dmdba dmdba 415219 5 月 7 11:41 install_ant.log
先查看 dm_BAKRES_202505.log 没有发现什么有用的日志,再查看 dm_dmrman_202505.log 发现,dmdba 用户尝试在/path/to/backup创建文件时失败,报错没有权限。使用 touch 命令验证确实没有权限。
所以更改权限:
chown -R dmdba:dinstall /path/to/backup
chmod -R 755 /path/to/backup
使用 touch 命令验证确认可以新建文件后。再次执行 recover 命令,终于成功。最后继续执行如下命令:
recover database '/path/to/instance/dm.ini' update db_magic;
然后启动实例:
./DmServiceDAMENG start
连接数据库后检查数据,确认已还原。顺便说一句,要使用原库的用户名及密码登录,因为本地已经完全还原为原库了,包括用户信息。
还原步骤总结
上传备份文件夹,使用 root 用户赋予 dmdba 权限:
chown -R dmdba:dinstall /path/to/backup
chmod -R 755 /path/to/backup
切换到 dmdba 用户。停掉数据库实例:
cd $DM_HOME/bin
./DmServiceDAMENG stop
确保 DmAPService 已启动:
./DmAPService start
DmAPService (pid 101899) is running.
然后再执行下面的命令还原(确保磁盘空间充足):
cd $DM_HOME/bin
./dmrman
restore database '/path/to/instance/dm.ini' from backupset '/path/to/backup';
recover database '/path/to/instance/dm.ini' from backupset '/path/to/backup';
recover database '/path/to/instance/dm.ini' update db_magic;
参考:
浙公网安备 33010602011771号