一、 引言:为什么需要数据库主备集群?
在当今企业级应用中,数据库的高可用性(High Availability)和数据可靠性是业务连续性的基石。单点故障可能导致服务中断、数据丢失,进而造成巨大的经济损失和声誉损害。达梦数据库(DM8)作为国产数据库的佼佼者,其数据守护(Data Watch)技术提供了成熟的主备集群解决方案,能够在主库故障时实现秒级自动切换,保障业务不中断。
本文将以单台Linux服务器为环境,手把手带你完成达梦DM8双实例主备集群的搭建。你将学到从规划、配置、部署到验证切换的完整流程,理解其背后的核心原理,并掌握关键的排错技巧。
二、集群规划
数据库实例A | 数据库实例B | |
业务 IP | 192.168.200.115 | 192.168.200.115 |
心跳IP | 192.168.200.115 | 192.168.200.115 |
实例名 | GRP1_RT_01 | GRP1_RT_02 |
实例端口 | 5236 | 5237 |
MAL 端口 | 5336 | 5337 |
MAL守护进程端口 | 5436 | 5437 |
守护进程端口 | 5536 | 5537 |
OGUID | 45331 | 45331 |
守护组 | GRP1 | GRP2 |
安装目录 | /home/dmdba/dmdbms | /home/dmdba/dmdbms |
实例目录 | /home/dmdba/dmdbms/data | /home/dmdba/dmdbms/data |
归档上限 | 51200 | 51200 |
三 、数据库实例配置
实例A配置
初始化实例
如果在此之前没有创建DM数据库管理用户, 需要使用root权限创建一个专属的dmdba管理用户
# 1. 创建达梦专属用户组 dinstall groupadd dinstall 2. 创建 dmdba 用户,归属 dinstall 组,自动生成家目录 /home/dmdba useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba 3. 设置 dmdba 用户登录密码(执行后手动输入密码) passwd dmdba将实例对象GRP1_RT_01存放在/home/dmdba/dmdbms/DAMENG文件目录下:
[dmdba@~]$ /home/dmdba/dmdbms/bin/dminit PATH=/home/dmdba/dmdbms/data/ INSTANCE_NAME=GRP1_RT_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=设置你的密码 SYSAUDITOR_PWD=设置你的密码2.启动服务
/home/dadba/dmdbms/bin/dmserver /home/dmdba/dmdbms/data/DAMENG/dm.iniSTART(启动实例): 读取dm.ini-->申请共享内存-->启动后台线程-->初始化缓存-->启动日志线程à启动事务线程-->实例运行
MOUNT(装载数据): 找到控制文件(有数据文件,redo日志, 表空间,数据库ID,归档信息,角色)à数据库信息
Recovery(恢复):数据库异常断开 -> 读取Redo日志 ->回 访事务 ->恢复一致性
Open状态: 主库正常运行,应用访问.(数据文件,redo日志,undo,系统表)全部打开- > 启动监听,事务,锁管理,SQL执行,缓存
3.修改配置文件
打开SQL进行语句修改
/home/dmdba/dmdbms/bin/disql SYSDBA/你的密码@127.0.0.1:5236写SQL语句,修改dm.ini配置文件:
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236); SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); #阈值设置 SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0); #禁止修改 SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2); SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1); #开启集群通信模块 SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);修改dmarch.ini配置文件
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmarch.ini配置文件内容:
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /home/dmdba/dmdbms/data/DAMENG/arch/ #本地归档存放路径 ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = GRP1_RT_02 #实时归档目标实例名创建dmmal.ini文件:
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmmal.ini配置参数如下:
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间 MAL_TEMP_PATH = /home/dmdbs/dmdbms/data/malpath/ #临时文件目录 MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩 [MAL_INST1] MAL_INST_NAME = GRP1_RT_01 #实例名和 dm.ini的INSTANCE_NAME 一致 MAL_HOST = 127.0.0.1 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 127.0.0.1 #实例的对外服务 IP 地址 MAL_INST_PORT 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = GRP1_RT_02 MAL_HOST = 192.0.0.1 MAL_PORT = 5337 MAL_INST_HOST = 127.0.0.1 MAL_INST_PORT = 5237 MAL_DW_PORT = 5437 MAL_INST_DW_PORT = 5537创建dmwatcher.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini具体配置参数:
[GRP1] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 20 INST_ERROR_TIME = 20 INST_RECOVER_TIME= 60 INST_OGUID = 45331 INST_INI = /home/dmdba/dmdbms/data/DAMENG/dm.ini INST_AUTO_RESTART= 1 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD= 03.进行文件备份
拷贝前切换到root权限先给目标实例创建 bak 文件夹,创建备份文件夹,并提供文件夹读写权限
# 1.创建文件夹 mkdir -p /home/dmdba/dmdbms/data/DAMENG2/bak #2.给权限 chown dmdba:dinstall /home/dmdba/dmdbms/data/DAMENG2/bak拷贝主库备份集到备份文件夹DAMENG2
scp -r /home/dmdba/dmdbms/data/DAMENG/bak/BACKUP_FILE dmdba@127.0.0.1:/home/dmdba/dmdbms/data/DAMENG2/bak4. 注册服务
实例主库注册(以root权限注册)
/home/dmdba/dmdbms/script/root/dm_service_installer.sh - t dmserver -p GRP1_RT_01 -dm_ini /home/dmdba/dmdbms/data/DAMENG/dm.ini -m mount创建服务完成,表明注册后生成系统服务:DmServiceGRP1_RT_01
守护进程服务注册,注册完成后生成守护系统服务: DmWatcherServiceWatcher
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t d mwatcher -p Watcher -watcher_ini /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini到这里实例A配置完成了
实例B配置
1.实例创建,以dmdba身份创建
/home/dmdba/dmdbms/bin/dminit PATH=/home/dmdba/dmdbms/data INSTANCE_NAME=GRP1_RT_02 DB_NAME=DAMENG2 SYSDBA_PWD=Dm@123456 SYSAUDITOR_PWD=Audit@1234562.备库数据恢复
启动DMAP
# 1.启动DMAP su - dmdba cd /dm8/bin # nohup后台挂起,日志输出到nohup.out nohup ./dmap & #2.查看dmap是否启动 ps -ef | grep dmap可以看到的结果
# 递归修改实例目录归属 chown -R dmdba:dinstall /home/dmdba/dmdbms/data/DAMENG2 # 同步修改备份目录权限 chown -R dmdba:dinstall /home/dmdba/dmdbms/data/DAMENG2/bak # 赋予读写权限 chmod -R 755 /home/dmdba/dmdbms/data/DAMENG2进行数据恢复数据: RESTORE → RECOVER(归档) → UPDATE DB_MAGIC
# 1.还原所有数据文件、控制文件、重做日志文件 /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdbms/data/DAMENG2/dm.ini' FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG2/bak/BACKUP_FILE'" 2.归档日志: /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG2/dm.ini' FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG2/bak/BACKUP_FILE'" #归档日志 3. 修改数据库魔数, 否则主备不能同时启动 /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG2/dm.ini' UPDATE DB_MAGIC" #魔数4.配置文件参数
替换 dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /opt/dmdbms/data/DAMENG2/arch/ #本地归档存放路径 ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = GRP1_RT_01 #实时归档目标实例名对配置文件中的文件夹手动创建并授权:
mkdir -p /home/dmdba/dmdbms/data/DAMENG2/arch chown -R dmdba:dinstall /home/dmdba/dmdbms/data/DAMENG2/arch/ chmod 755 /home/dmdba/dmdbms/data/DAMENG2/arch配置 dmmal.ini 和 dmwatcher.ini
5.注册服务
# 1.切换权限 su -root 运行成功表明 创建服务(DmServiceGRP1_RT_02)完成 /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_02 -dm_ini /home/dmdba/dmdbms/data/DAMENG2/dm.ini -m mount 创建守护DmWatcherServiceWatcher2 /home/dmdba//dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher2 -watcher_ini /home/dmdba/dmdbms/data/DAMENG2/dmwatcher.ini启动服务及查看信息
1.DmServiceGRP1_RT_01启动服务并查看状态
# 1.启动服务 /home/dmdba/dmdbms/bin/DmServiceGRP1_RT_01 start 2. 查看是否启动 /home/dmdba/dmdbms/bin/DmServiceGRP1_RT_01 status 3. 使用SQL进行权限修改 /home/dmdba/dmdbms/bin/disql SYSDBA/你的密码@127.0.0.1:52362.开启修改权限,将达梦数据库实例GRP1_RT_01转成主备架构的PRIMARY 主库
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID(45331); SQL> ALTER DATABASE PRIMARY; SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);3.DmServiceGRP1_RT_02启动服务,同样的将其修改为备库
# 1.启动服务 /home/dmdba/dmdbms/bin/DmServiceGRP1_RT_02 start 2. 查看是否启动,启动成功后将输出running状态 /home/dmdba/dmdbms/bin/DmServiceGRP1_RT_02 status 3. 使用SQL进行权限修改 /home/dmdba/dmdbms/bin/disql SYSDBA/你的密码@127.0.0.1:5237开启修改权限,将达梦数据库实例GRP1_RT_01转成主备架构的PRIMARY 主库
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID(45331); SQL> ALTER DATABASE STANDBY; SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);4.启动守护进程1和守护进程2
1. 启动守护1进程 /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start 2.查看守护1进程状态 /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher status 3.启动守护2进程 /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher2 start 4.查看守护2进程状态 /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher2 status如果这里守护进程没有启动,可能是配置文件dm.ini中两个参数ARCH_INI=0,MAL_INI=0.需要自己去设置为1.
可以先查看一下这连个参数是否设置为0了,我这里查到的是为0,默认关闭了归档,不能进行主备同步
# 打开配置文件, 找到这两个参数,进行参数更改 vi /home/dmdba/dmdbms/data/DAMENG2/dm.ini配置监视器
1.首先创建监视器
# 创建dmmonitor.ini vi /home/dmdba/dmdbms/bin/dmmonitor.ini进行参数配置:
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = /home/dmdba/dmdbms/bin/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值 MON_DW_IP = 192.168.200.115:5436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 192.168.200.115:54372.注册监视器(使用root权限)
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini3.配置非监视器(可选)
vi /home/dmdba/dmdbms/bin/dmmonitor_manual.ini参数配置和上面一样
4.启动监视器
# 启动监视器 /home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start #查看监视器状态 /home/dmdba/dmdbms/bin/DmMonitorServiceMonitor status5.查看监听端口
ss -lntp | grep dm可以看到相关服务的端口号
6.启动监视器
##后台启动 /home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start ##前台启动 (这里测试最好是前台启动) /home/dmdba/dmdbms/bin/dmmonitor /home/dmdba/dmdbms/bin/dmmonitor.ini进入前台启动后,输入login进行登录,输入SYSDBA账号和密码
输入 :showe 可以查看具体的信息,里面有主库与备库的相关信息
输入switchover GRP1_RT_02,可以主备切换
这是可以看到主库已经换成了GRP1_RT_02
四、总结与关键要点
通过本文的详细步骤,我们成功在单台 Linux 服务器上完成了达梦 DM8 双实例主备集群的搭建。整个过程涵盖了从规划、配置、部署到验证切换的完整流程,以下是整个搭建过程的核心总结:
4.1 搭建流程回顾
- 环境规划:明确主备实例的网络规划、端口分配、实例命名和目录结构,这是后续所有配置的基础。
- 实例 A 配置:
- 创建专用用户和实例初始化
- 启动服务并理解实例启动的四个阶段(START、MOUNT、Recovery、Open)
- 配置关键参数文件(dm.ini、dmarch.ini、dmmal.ini、dmwatcher.ini)
- 创建备份并注册主库服务
- 实例 B 配置:
- 创建备库实例
- 通过 DMAP 进行数据恢复(RESTORE → RECOVER → UPDATE DB_MAGIC)
- 同步配置文件并注册备库服务
- 服务启动与角色转换:
- 分别启动主备实例服务
- 通过 SQL 命令将实例转换为 PRIMARY(主库)和 STANDBY(备库)角色
- 启动守护进程并验证状态
- 监视器配置与验证:
- 创建和配置监视器
- 启动监视器并登录验证
- 执行主备切换测试,验证集群高可用性
4.2 关键配置要点
- 网络配置:确保 MAL 端口、守护进程端口等网络配置正确且无冲突
- 归档配置:dmarch.ini 中的归档路径和类型必须正确配置,否则无法同步数据
- MAL 配置:dmmal.ini 中的实例名、IP 地址和端口必须与实际情况一致
- 守护进程配置:dmwatcher.ini 中的 OGUID 必须一致,确保主备属于同一守护组
- 参数调整:特别注意 ARCH_INI 和 MAL_INI 参数必须设置为 1 才能启用归档和集群通信
4.3 常见问题与排查
- 守护进程无法启动:检查 dm.ini 中的 ARCH_INI 和 MAL_INI 参数是否已设置为 1
- 主备同步失败:验证网络连通性、归档配置和 MAL 链路配置
- 服务注册失败:确保使用 root 权限执行注册脚本,检查路径和参数是否正确
- 切换失败:通过监视器查看实例状态,确认主备角色是否正确配置
4.4 最佳实践建议
- 测试环境先行:在生产环境部署前,务必在测试环境完整演练整个流程
- 文档记录:详细记录所有配置参数和操作步骤,便于后续维护和故障排查
- 定期验证:定期进行主备切换测试,确保故障切换机制始终有效
- 监控告警:配置完善的监控系统,实时监控集群状态和性能指标
- 备份策略:除了主备同步,仍需建立定期物理备份和逻辑备份机制
达梦数据库的主备集群方案为企业级应用提供了可靠的高可用保障。通过本文的实践,您不仅掌握了具体的搭建步骤,更重要的是理解了每个配置项的作用和整个架构的工作原理。在实际生产环境中,建议根据业务需求和硬件资源进行适当的调优,并建立完善的监控和维护流程。
希望本文能为您在达梦数据库高可用架构的实践中提供有价值的参考。如果在实施过程中遇到问题,欢迎查阅达梦官方文档或寻求专业技术支持。