Skip to content

达梦数据库的联机备份与脱机还原

官方文档:https://eco.dameng.com/document/dm/zh-cn/ops/physical-backup-restore.html

阅读说明

本文基于 docker 安装的达梦数据库作为示例操作,非 docker 环境只需掠过 docker 操作即可。

联机配置归档

shell
# 在服务器上创建本地归档目录,并授权给 dmdba
# root 用户进入容器
docker exec -it dm8 /bin/bash

cd /home
mkdir /home/dm_arch
chown -R dmdba:dinstall dm_arch
shell
# 查询是否开启归档 Y表示已开启归档,N表示未开启归档
sql> select name, status$, arch_mode from v$database;

# 修改数据库为 Mount 状态
sql> ALTER DATABASE MOUNT;

# 开启归档模式
sql> ALTER DATABASE ARCHIVELOG;

# 配置本地归档
sql> ALTER DATABASE ADD ARCHIVELOG 'DEST = /home/dm_arch, TYPE = local,FILE_SIZE = 1024, SPACE_LIMIT = 2048';

# 修改数据库为 Open 状态
sql> ALTER DATABASE OPEN;

# 重启数据库或重启服务
# 重启数据容器
[root@localhost ~]# docker restart dm8

# 或者重启服务(stop 和 start 需要一点时间,不是卡住了,请耐心等待)
[root@localhost ~]# docker exec -it dm8 /bin/bash

cd /opt/dmdbms/bin
./DmService stop
./DmService start

联机全备

shell
# 在服务器上创建备份目录,并授权给 dmdba
# root 用户进入容器
docker exec -it dm8 /bin/bash

cd /home
rm -rf /home/dm_full_bak
mkdir /home/dm_full_bak
chown -R dmdba:dinstall dm_full_bak
shell
# 如果服务器上已经存在 /home/dm_full_bak 文件夹,就删掉或换一个目录才行。
# 全量备份
sql> BACKUP DATABASE FULL BACKUPSET '/home/dm_full_bak';

# 复制备份文件到宿主机。复制到宿主机目录:/home/dm_full_bak
[root@localhost ~]# docker cp dm8:/home/dm_full_bak /home/

到这里就备份完成了。然后 U 盘复制备份文件到目标主机的 /home/dm_full_bak

移动宿主机上备份文件夹 /home/dm_full_bak 目录到要还原的达梦主机上

shell
# 登录目标主机
# 把备份文件,移动到目标主机中 docker 容器的 /home/dm_full_bak 目录
[root@localhost ~]# docker cp /home/dm_full_bak dm8:/home/
# Windows 下复制:cd /d D: && docker cp dm_full_bak dm8:/home/

[root@localhost ~]# docker exec -it dm8 /bin/bash
# 容器中查看
ls -l /home/dm_full_bak
# 递归修改该文件夹及子文件/文件夹的拥有者及用户组。以便后面还原时 dmdba 用户有权限读取
# 否则后面还原数据库时,会出现这个问题 [-8024]:Fail to read write data file
cd /home
chown -R dmdba:dinstall dm_full_bak

# 退出,后面切换 dmdba 用户进入容器
exit

脱机还原(dmrman)

shell
# 切换 dmdba 用户进入容器
[root@localhost ~]# docker exec -it --user dmdba dm8 /bin/bash

# 检查 dm.ini 父级目录,即数据库的实例名
ls -l /opt/dmdbms/data
# 其中,DAMENG 就是数据库的实例名
ls -l /opt/dmdbms/data/DAMENG


# 停止达梦服务
cd /opt/dmdbms/bin
# 否则会出现这个问题:[-137]:DM server is running or exist other process which is operating the same database
./DmService stop

# 一般都有 DAMENG 库实例了,所以不需要这一步。
#准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始化一个新库。如下所示:
# ./dminit path=/opt/dmdbms/data db_name=DAMENG

# 方便复制:/opt/dmdbms/bin/dmrman
./dmrman

# 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN> CHECK BACKUPSET '/home/dm_full_bak';

# 以下命令中:需要现在达梦的安装目录找到 dm.ini 文件的位置。并且路径中的【DAMENG】为数据库实例(名字根据安装时写的),如果有多个,则需要选择需要还原的数据库实例。
# 如果出现这个问题 [-8024]:Fail to read write data file。则是前面没有执行 chown -R dmdba:dinstall dm_bak,导致 dmdba 用户没有权限读取备份文件。
# 还原数据库(恢复数据文件)。启动 DMRMAN,输入以下命令:
RMAN> RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/home/dm_full_bak';

# 执行还原数据库的命令之后,可以直接执行恢复数据库的命令(进行数据库一致性修复),如下:
RMAN> RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM  BACKUPSET '/home/dm_full_bak';

# 数据库更新
# 指更新数据库的 DB_MAGIC,并将数据库调整为可正常工作状态,与数据库恢复一样使用 RECOVER 命令完成。数据库更新发生在重做 REDO 日志恢复数据库后。
RMAN> RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;

# 退出 dmrman
RMAN> exit

# 启动停止的达梦服务
./DmService start

# 还原完成