达梦数据库实战:备份恢复与数据迁移全攻略(实例初始化、服务注册、路径迁移)
在达梦数据库(DM8)的生产运维中,备份恢复 是数据安全的最后一道防线,数据迁移是实例扩容、路径调整的核心操作。本文结合实战场景,从零开始讲解达梦数据库实例初始化、服务注册、归档开启、全量 / 增量 / 指定 LSN 备份恢复,以及实例路径迁移的完整流程,覆盖大小写不敏感、UTF-8 字符集等生产常用配置。
一、环境前置说明
本文基于DM8 数据库,操作系统为 Linux,所有操作均使用数据库安装用户(dmdba)和 root 用户执行,核心路径约定:
- 数据库安装目录:
/dm/dmdbms - 数据实例初始路径:
/dm/data - 备份文件路径:
/dm/backup - 归档日志路径:
/dm/backup/dmarch
二、初始化达梦数据库实例
生产环境中,实例初始化需严格指定字符集、大小写敏感、页大小、日志大小 等参数,本文初始化一个大小写不敏感、UTF-8 字符集的生产级实例。
1. 初始化命令(dminit 工具)
切换到数据库安装用户(dmdba),执行以下命令:
bash
# 进入达梦bin目录
cd /dm/dmdbms/bin
# 初始化实例:大小写不敏感、UTF-8字符集、端口5236
./dminit \
PATH=/dm/data \ # 实例存放根路径
DB_NAME=EXAMDB2 \ # 数据库名
INSTANCE_NAME=EXAMSVR \ # 实例名
PORT_NUM=5236 \ # 数据库端口
SYSDBA_PWD=Dameng123 \ # SYSDBA密码
SYSAUDITOR_PWD=Dameng123 \ # 审计用户密码
PAGE_SIZE=16 \ # 页大小(16K,生产推荐)
EXTENT_SIZE=32 \ # 簇大小(32页)
CHARSET=0 \ # 字符集:0=UTF-8
CASE_SENSITIVE=0 \ # 大小写不敏感(0=不敏感,1=敏感)
LOG_SIZE=256 # 日志文件大小(256M)
2. 关键参数解释
CHARSET=0:指定数据库字符集为 UTF-8,兼容中文及特殊字符;CASE_SENSITIVE=0:大小写不敏感,符合 MySQL/Oracle 迁移后的使用习惯;PAGE_SIZE=16:生产环境推荐 16K/32K,提升大数据量读写性能。
三、开启数据库归档(必做!)
达梦数据库在线备份必须开启归档模式,否则无法执行热备份,通过 SQL 语句开启:
sql
-- 切换到MOUNT状态
ALTER DATABASE MOUNT;
-- 开启归档模式
ALTER DATABASE ARCHIVELOG;
-- 添加归档日志配置:路径、类型、单文件大小、空间限制
ALTER DATABASE ADD ARCHIVELOG 'DEST=/dm/backup/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=10240';
-- 切换到OPEN状态
ALTER DATABASE OPEN;
四、达梦数据库备份实战
达梦支持全量备份、增量备份、指定 LSN 备份,覆盖不同数据恢复场景,本文逐一演示。
1. 全量备份(基础备份)
全量备份是所有备份的基础,包含数据库所有数据文件,在线执行即可:
sql
-- 登录数据库后执行全量备份:压缩级别5、4线程并行
backup database full
to "DB_EXAMDB_FULL_2026_06_10_13_24_41"
backupset '/dm/backup/dmbak'
device type disk
compressed level 5
task thread 4;
compressed level 5:压缩级别(1-9,级别越高压缩比越高,耗时越长);task thread 4:并行线程数,提升备份速度;backupset:备份集存放路径。
备份完成后,查询备份历史:
sql
select * from SYS.V$BACKUP_HISTORY;
2. 增量备份(基于全量)
增量备份仅备份自上一次全量 / 增量备份后变化的数据,节省空间和时间,必须基于全量备份执行。
步骤 1:模拟数据变化(删除表 / 插入数据)
sql
-- 示例:删除测试表(模拟数据变更)
DROP TABLE TEST_TABLE;
步骤 2:执行增量备份
sql
-- 增量备份:基于之前的全量备份集
backup database increment
base on backupset '/dm/backup/dmbak'
to "DB_EXAMDB_INCRE_2026_06_10_13_42_35"
backupset '/dm/backup/dmbak/DB_EXAMDB_INCRE_2026_06_10_13_42_35'
compressed level 5
parallel 8;
3. 指定 LSN 备份(主备库异常同步场景)
适用场景:主备库数据不同步、日志断层,无法通过常规全量 + 增量恢复时,使用指定 LSN 备份快速修复,无需全量备份。
步骤 1:备库查询当前 LSN
sql
-- 备库执行,获取需要恢复的起始LSN
SELECT N_EP, APPLY_LSN_ARR FROM V$RAPPLY_LSN_INFO;
步骤 2:主库基于 LSN 执行增量备份
bash
-- 替换为实际查询到的LSN号
BACKUP DATABASE INCREMENT FROM LSN 41461 BACKUPSET 'bak_inc_lsn';
五、达梦数据库恢复实战
备份的核心价值是恢复,达梦恢复需使用dmrman 工具,分全量恢复、增量恢复、指定 LSN 恢复。
1. 全量恢复
bash
# 进入达梦bin目录,启动dmrman
cd /dm/dmdbms/bin
./dmrman
bash
-- 1. 还原数据文件
RESTORE DATABASE '/dm/data/EXAMDB2/dm.ini' FROM BACKUPSET '/dm/backup/dmbak';
-- 2. 恢复数据(应用日志)
RECOVER DATABASE '/dm/data/EXAMDB2/dm.ini' FROM BACKUPSET '/dm/backup/dmbak';
-- 3. 更新数据库魔法值(必须执行,否则无法启动)
RECOVER DATABASE '/dm/data/EXAMDB2/dm.ini' UPDATE DB_MAGIC;
2. 增量恢复
增量恢复必须先恢复全量备份,再恢复增量备份,本文直接基于增量备份集执行:
bash
./dmrman
sql
-- 还原增量备份
RESTORE DATABASE '/dm/data/EXAMDB2/dm.ini' FROM BACKUPSET '/dm/backup/dmbak/DB_EXAMDB_INCRE_2026_06_10_13_42_35';
-- 恢复增量数据
RECOVER DATABASE '/dm/data/EXAMDB2/dm.ini' FROM BACKUPSET '/dm/backup/dmbak/DB_EXAMDB_INCRE_2026_06_10_13_42_35';
-- 更新DB_MAGIC
RECOVER DATABASE '/dm/data/EXAMDB2/dm.ini' UPDATE DB_MAGIC;
3. 指定 LSN 备份恢复(主备库修复)
sql
--在备库查lsn
SELECT N_EP, APPLY_LSN_ARR FROM V$RAPPLY_LSN_INFO;
BACKUP DATABASE INCREMENT FROM LSN 41461 BACKUPSET 'bak_inc_lsn';
bash
./dmrman
sql
-- 合并备份集
MERGE DATABASE '/opt/dmdbms/db_standby/dm.ini' FROM BACKUPSET '/opt/dmdbms/bak/bak_inc_lsn';
-- 恢复数据
RECOVER DATABASE '/opt/dmdbms/db_standby/dm.ini' FROM BACKUPSET '/opt/dmdbms/bak/bak_inc_lsn';
-- 更新DB_MAGIC
RECOVER DATABASE '/opt/dmdbms/db_standby/dm.ini' UPDATE DB_MAGIC;
恢复完成后,启动数据库服务验证数据:
bash
systemctl start DmServiceDAMENG2
六、数据库实例路径迁移(修改存放位置)
生产中常需迁移实例路径(如磁盘扩容、目录调整),核心步骤:复制实例目录→修改配置文件→修改控制文件→更新服务。
1. 复制实例目录到新路径
假设原路径:/dm/data/EXAMDB2,新路径:/new/data/EXAMDB2
bash
# 整体复制实例目录
cp -r /dm/data/EXAMDB2 /new/data/
2. 修改 dm.ini 配置文件
替换 dm.ini 中所有旧路径为新路径:
bash
sed -i "s#/dm/data/EXAMDB2#/new/data/EXAMDB2#g" /new/data/EXAMDB2/dm.ini
3. 修改控制文件(核心步骤,不可直接编辑)
控制文件(dm.ctl)是二进制文件,需用dmctlcvt工具转换修改:
bash
cd /dm/dmdbms/bin
# 1. 二进制控制文件转文本文件
./dmctlcvt TYPE=1 SRC=/new/data/EXAMDB2/dm.ctl DEST=/new/data/EXAMDB2/dmctl.txt
# 2. 替换文本文件中的旧路径
sed -i "s#/dm/data/EXAMDB2#/new/data/EXAMDB2#g" /new/data/EXAMDB2/dmctl.txt
# 3. 文本文件转回二进制控制文件
./dmctlcvt TYPE=2 SRC=/new/data/EXAMDB2/dmctl.txt DEST=/new/data/EXAMDB2/dm.ctl
4. 修改关联配置文件
- 归档配置:修改
dmarch.ini中的ARCH_DEST路径; - 日志配置:修改
sqllog.ini中的FILE_PATH路径; - 备份脚本:更新定时备份中的实例路径。
5. 更新系统服务并启动
bash
# 先注销旧服务(root用户)
cd /dm/dmdbms/script/root/
./dm_service_uninstaller.sh -n DmServiceDAMENG2
# 重新注册新路径的服务
./dm_service_installer.sh -t dmserver -p DAMENG2 -dm_ini /new/data/EXAMDB2/dm.ini
# 启动新服务
systemctl start DmServiceDAMENG2
七、核心注意事项
- 在线备份必须开启归档,否则备份无效;
- 恢复操作必须关闭数据库服务,避免文件占用;
- 恢复最后一步
UPDATE DB_MAGIC是必执行语句,否则数据库无法启动; - 指定 LSN 备份仅用于主备库不同步的应急场景,常规恢复优先全量 + 增量;
- 实例路径迁移时,控制文件必须用官方工具修改,禁止手动编辑二进制文件。