环境:DM8、Linux(CentOS 7 ),三台服务器。
本文记录从零搭一套"一主一备一监视" 式的主备集群,纯手工操作,不依赖图形化工具。


一、环境规划

1.1 IP规划

角色 主机名 业务IP 心跳IP 实例名
主库(Primary) dw01 192.168.6.100 192.168.100.100 DMDB01
备库(Standby) dw02 192.168.1.101 192.168.100.101 DMDB02
监视器(monitor) dwmon 192.168.1.102 192.168.100.102 /

1.2 端口规划

实例名 MAL_INST_PORT MAL_INST_DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT
DMDB01(Primary) 5236 5536 192.168.6.101 5336 5436
DMDB02(Standby) 5236 5536 192.168.6.102 5336 5436

约定

  • 安装目录:/dm
  • 数据目录:/dmata
  • 归档目录:/dmarch

二、前置准备

2.1 关闭防火墙(两台机器都做)

# 关闭防火墙(生产环境改为放行 5236 端口)
systemctl stop firewalld
systemctl disable firewalld

2.3 创建 dmdba 用户和目录

groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
echo 'dmdba:DM@123456' | chpasswd

2.4 主备库上安装dm8软件

./DMInstall.bin -i

在这里插入图片描述


三、初始化主备库

切换到 dmdba 用户:

su - dmdba

3.1 初始化实例

# 主库初始化
/dm/bin/dminit PATH=/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=1024 CASE_SENSITIVE=0 CHARSET=1  INSTANCE_NAME=dmdb01 PORT_NUM=5236 SYSDBA_PWD=Dameng123# SYSAUDITOR_PWD=Dameng123#

# 备库初始化
/dm/bin/dminit PATH=/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=1024 CASE_SENSITIVE=0 CHARSET=1  INSTANCE_NAME=dmdb02 PORT_NUM=5236 SYSDBA_PWD=Dameng123# SYSAUDITOR_PWD=Dameng123#

charset=1 表示UTF-8 则填 。
log_size 单位 MB,生产环境的日志文件建议 2G 以上,主备环境尤其要大。

初始化成功后数据文件位于 /dmdata/DAMENG

3.2 注册主库服务

# root 用户执行
/dm/script/root/dm_service_installer.sh -t dmserver -p dmdb01 -dm_ini /dmdata/DAMENG/dm.ini -m mount

四、配置主库归档和参数

主备同步依赖归档日志(Redo Log Archive),必须先开启。

4.1 修改 dm.ini

编辑 /dmdata/DAMENG/dm.ini,添加或修改以下参数:

## 归档相关
ARCH_INI            = 1              # 启用归档配置文件

## 主备角色(主库填 1)
ALTER_MODE_STATUS   = 0              # 允许切换模式
ENABLE_OFFLINE_TS   = 2

## MAL 链路(主备通信总线)
MAL_INI             = 1

4.2 配置归档文件 dmarch.ini

新建 /dmdata/DAMENG/dmarch.ini

#DaMeng Database Archive Configuration file
#this is comments

        ARCH_WAIT_APPLY      = 0        

[ARCHIVE_LOCAL1]
        ARCH_TYPE            = LOCAL        
        ARCH_DEST            = /dmarch        
        ARCH_FILE_SIZE       = 1024        
        ARCH_SPACE_LIMIT     = 51200        
        ARCH_FLUSH_BUF_SIZE  = 2        
        ARCH_HANG_FLAG       = 1        

[ARCHIVE_REALTIME1]
ARCH_TYPE                = REALTIME  #实时归档类型
ARCH_DEST                = dmdb01  #实时归档目标实例名

ARCH_DEST 中的 dmdb02 是下面 dmmal.ini 里定义的备库 MAL 节点名。

4.3 配置 MAL(主备通信) dmmal.ini

新建 /dmdata/DAMENG/dmmal.ini

MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
 MAL_INST_NAME = dmdb01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
 MAL_HOST = 192.168.100.100 #MAL 系统监听 TCP 连接的 IP 地址
 MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
 MAL_INST_HOST = 192.168.6.100 #实例的对外服务 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 = dmdb02
 MAL_HOST = 192.168.100.101
 MAL_PORT = 5336
 MAL_INST_HOST = 192.168.6.101
 MAL_INST_PORT = 5236
 MAL_DW_PORT = 5436
 MAL_INST_DW_PORT = 5536

MAL_PORT 是 MAL 通信端口(默认 61141),MAL_DW_PORT 是守护进程端口(默认 52141)。

4.4 配置守护进程 dmwatcher.ini

新建 /dmdata/DAMENG/dmwatcher.ini

[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 30
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 941027
INST_INI = /dmdata/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm/bin/DmServiceDAMENG start
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0

4.5 启动主库使配置生效

./dmserver /dmdata/DAMENG/dm.ini

登录确认归档已开启:

SELECT ARCH_STATUS FROM V$DATABASE;
SELECT * FROM V$ARCH_STATUS;

五、备份主库,准备备库数据

5.1 对主库做全量备份

关闭主库,进行脱机备份

./dmrman CTLSTMT="BACKUP DATABASE '/dmdata/DAMENG/dm.ini' BACKUPSET '/home/dmdba/full_bak'"

5.2 将备份传到备库

scp -r /home/dmdba/full_bak dmdba@192.168.6.101:/home/dmdba/

六、初始化备库

切换到 dm-standby 机器:

6.1 恢复数据到备库

su - dmdba

# 备库已初始化好一个空实例(参数和主库保持一致,尤其是 page_size、charset)

# 用主库备份恢复(覆盖空实例数据文件)
./dmrman CTLSTMT="restore database '/dmdata/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak'"
./dmrman CTLSTMT="recover database '/dmdata/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak'"
./dmrman CTLSTMT="recover database '/dmdata/DAMENG/dm.ini' update db_magic"

最后一步 UPDATE DB_MAGIC 是将备库数据库标记为可接收主库日志的状态,不能省略。

6.2 将主库的配置文件复制到备库

scp dmdba@192.168.6.100:/dmdata/DAMENG/dmarch.ini  /dmdata/DAMENG/
scp dmdba@192.168.6.100:/dmdata/DAMENG/dmmal.ini   /dmdata/DAMENG/

6.3 修改备库的 dm.ini

编辑 /dm8/data/DMSERVER/dm.ini,和主库相同,添加:

ARCH_INI            = 1
ALTER_MODE_STATUS   = 0
MAL_INI             = 1

6.4 修改备库的 dmarch.ini

备库的 dmarch.ini 与主库一致,仅需修改ARCH_DEST :

ARCH_WAIT_APPLY = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch/DAMENG
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10244
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_DW_01

6.5 配置备库的 dmwatcher.ini

新建 /dmdata/DAMENG/dmwatcher.ini

[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 30
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 941027
INST_INI = /dmdata/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm/bin/DmServiceDAMENG start
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0

与主库的配置一致。

6.6 注册并以 Mount 模式启动备库

# root 执行
/dm/script/root/dm_service_installer.sh -t dmserver -p dmdb02 -dm_ini /dmdata/DAMENG/dm.ini -m mount

# 先以 Mount 模式启动(备库不能直接 Open)
systemctl start DmServiceDMSERVER

备库启动后处于 MOUNT 状态,不接受普通业务连接,只接收主库日志。


七、启动守护进程(dmwatcher)

守护进程负责主备心跳检测和自动切换,两台机器都要启动

7.1 注册 dmwatcher 服务

# root 执行(主库机器)
/dm/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini

# root 执行(备库机器,同上命令)
/dm/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini

7.2 启动顺序

必须先启主库 watcher,再启备库 watcher,否则主备握手会失败。

# 主库机器
systemctl start DmWatcherServiceGRP1

# 备库机器
systemctl start DmWatcherServiceGRP1

查看日志确认握手成功:

tail -f dm_dmwatcher_GRP1_DW_01_202605.log

八、验证主备同步

8.1 在主库写入数据

-- 主库
CREATE TABLE TEST_SYNC (ID INT, NAME VARCHAR(100));
INSERT INTO TEST_SYNC VALUES (1, 'hello standby');
COMMIT;

在这里插入图片描述

8.2 在备库查询(只读)

-- 备库(以只读方式连接)
SELECT * FROM TEST_SYNC;
-- 能查到说明同步正常

在这里插入图片描述

8.3 查看主备状态

-- 配置一个普通监视器
MON_DW_CONFIRM = 0  #普通监视器
MON_LOG_PATH = /dm/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 2048
[GRP1]
MON_INST_OGUID = 941027
MON_DW_IP = 192.168.100.100:5436
MON_DW_IP = 192.168.100.101:5436

在这里插入图片描述


九、测试主备切换

测试主备切换前先了解一下达梦datawatch集群的启停顺序
关闭顺序
停监视器 → 停备库守护 → 停主库守护 → 停主库实例 → 停备库实例
启动顺序
启守护:先备后主 → 启数据库:先备后主 → 最后启监视器

9.1 手动切换主备库

查看dwmon服务器上的确认监视器是否正常运行

ps -ef|grep dmm

在这里插入图片描述
查看dw01服务器上的数据库服务和守护进程

ps -ef|grep dms
ps -ef|grep dmw

在这里插入图片描述
查看dw02服务器上的数据库服务和守护进程

ps -ef|grep dms
ps -ef|grep dmw

在这里插入图片描述
登录普通监视器
在这里插入图片描述
dw02从备机切换为主机
在这里插入图片描述

9.2 将主库的内网网卡down掉

在这里插入图片描述
备库dw01自动takeover,升为主节点
在这里插入图片描述
旧的主库dw02状态变为suspend
在这里插入图片描述
恢复dw02的网络后,会自动拉起dw02,切换为备机加入集群
在这里插入图片描述

9.2 模拟主库断电

虚拟机→ 电源 → 关机
monitor检测到主节点异常开始切换
在这里插入图片描述
原来的备节点提升为主节点
在这里插入图片描述

原主库恢复后不能直接重新加入,需要:

  1. 用新主库的当前备份恢复数据(重走一遍第六节)
  2. 修改角色为 STANDBY
  3. 启动后守护进程自动同步

十、配置文件速查汇总

文件 位置 作用
dm.ini /dmdata/DAMENG/ 实例核心参数
dmarch.ini /dmdata/DAMENG/ 归档策略配置
dmmal.ini /dmdata/DAMENG/ 主备 MAL 通信配置
dmwatcher.ini /dmdata/DAMENG/ 守护进程配置

小结

整个搭建流程核心就四步:

  1. 初始化主库 → 开归档 → 配 MAL 和 watcher
  2. 备份主库 → 传到备库 → 恢复(带 UPDATE DB_MAGIC)
  3. 备库配置 → 复制 MAL 文件 → 改角色为 STANDBY → Mount 启动
  4. 两端启动 dmwatcher → 等待握手成功 → 验证同步

达梦的主备机制和 Oracle Data Guard 思路基本一致,熟悉 DG 的同学上手很快。日常运维重点是监控 V$RAPPLY_STAT 里的日志延迟,以及定期测试 failover 演练。


达梦社区地址:https://eco.dameng.com

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐