DM 数据守护(Data Watch,运维中也常简称 DMWATCH)通过 Redo 日志传输和备库重演构建主备数据库,并由 dmwatcher、dmmonitor 完成状态监控、主备切换和故障接管。本文以 Linux 7 x86_64、DM7、1 主 1 备为例,搭建一套使用实时归档、支持自动故障切换的数据守护环境。
- DM8 不同补丁版本的数据守护配置和监视器命令可能有差异,最终以本机
$DM_HOME/doc中与数据库版本配套的手册为准。- 自动切换需要独立的确认监视器。本文虽然是 1 主 1 备,但实际使用三台主机:两台数据库服务器和一台监视器服务器。
+---------------------------+
| 独立确认监视器 dmmonitor |
| MON_DW_CONFIRM = 1 |
+------------+--------------+
|
状态确认、切换命令、故障仲裁
+------------+-------------+
| |
+----------------------v----+ +-------v-------------------+
| 主库节点 | REALTIME | 备库节点 |
| GRP1_RT_01 | Redo/MAL | GRP1_RT_02 |
| PRIMARY + OPEN +-----------> | STANDBY + OPEN |
| dmserver + dmwatcher | | dmserver + dmwatcher |
+---------------------------+ +---------------------------+
| 组件 | 部署位置 | 主要作用 |
|---|---|---|
| 主库 | 数据库节点 A | 接收业务读写,生成 Redo,并通过 MAL 向实时备库发送日志 |
| 备库 | 数据库节点 B | 接收主库 Redo,写入日志并重演;通常提供只读能力,也可在切换后成为主库 |
dmwatcher |
每个数据库节点 | 监控本地实例、交换主备状态、执行监视器命令、参与故障处理和故障重加入 |
dmmonitor |
建议独立第三台主机 | 汇总守护状态,提供 show、switchover、takeover 等管理命令;确认监视器参与自动接管决策 |
| MAL | 主备数据库之间 | 基于 TCP 的内部通信系统,用于 Redo 传输、实例与守护进程通信、守护进程之间通信 |
| 本地归档 | 主库和备库本地磁盘 | 保存归档日志,为恢复、追日志和备库重建提供基础 |
| 实时归档 | 当前 PRIMARY → STANDBY | 主库在 Redo 写入本地联机日志前发送给备库,是实时主备的基础 |
同一守护组内的数据库、dmwatcher 和 dmmonitor 必须使用相同的 OGUID;实例名 INSTANCE_NAME 须唯一。
dmwatcher 是数据库实例和监视器之间的控制桥梁。数据库实例定期向本地守护进程上报进程 ID、实例模式、实例状态、LSN、MAL 链路和归档状态。
监视器不直接连接数据库实例执行管理动作,而是连接 dmwatcher,由守护进程解析并转发命令。
常用show来查看全部守护组和实例状态
实时归档默认采用高性能模式,即 ARCH_WAIT_APPLY=0:
sequenceDiagram
participant C as 客户端
participant P as 主库
participant S as 备库
C->>P: COMMIT
P->>S: 发送 RLOG_PKG
S-->>P: 已收到日志包
P->>P: 写入本地联机 Redo
P-->>C: COMMIT 成功
S->>S: 异步加入重演任务并应用
当 ARCH_WAIT_APPLY=0 时,主库等待备库确认“已经收到日志”,但不等待备库完成重演。因此备库查询可能存在很短的延迟。
当 ARCH_WAIT_APPLY=1 时,备库完成重演后才响应主库,主库再响应客户端提交。事务一致性更强,但网络时延和备库重演速度会直接增加提交耗时。
flowchart TD
A[环境与端口规划] --> B[两节点安装相同版本 DM8]
B --> C[初始化并启动主库]
C --> D[开启本地归档并执行全库备份]
D --> E[初始化备库并通过备份集还原]
E --> F[配置 dm.ini / dmmal.ini / dmarch.ini]
F --> G[配置 dmwatcher.ini 与共同 OGUID]
G --> H[主库设为 PRIMARY]
H --> I[备库设为 STANDBY]
I --> J[启动两端 dmwatcher]
J --> K[启动独立 dmmonitor]
K --> L[验证角色、归档、LSN 与业务数据]
L --> M[正常切换与故障演练]
| 阶段 | 做什么 | 为什么 |
|---|---|---|
| 环境准备 | 统一 OS、CPU、DM8 版本、时钟、用户、路径和端口 | 减少版本、权限和网络差异导致的故障 |
| 主库初始化 | 固化页大小、字符集、大小写等不可随意变更的属性 | 主备物理结构必须兼容 |
| 主库备份 | 生成一致的全库备份集 | 备库必须从主库同一数据基线创建 |
| 备库还原 | RESTORE、RECOVER、UPDATE DB_MAGIC |
还原数据并为备库生成新的数据库魔数 |
| 配置通信和归档 | 建立 MAL 通信及双向实时归档配置 | 当前主库发送日志,切换后新主库仍能反向发送 |
| 配置守护 | 配置一致的组名、OGUID 和故障模式 | 让两个守护进程属于同一逻辑系统 |
| 启动和验证 | 以 MOUNT 启动、设置角色、启动守护和监视器 | 由守护系统安全打开并管理主备库 |
| 项目 | 主库节点 | 备库节点 |
|---|---|---|
| 主机名 | dm-primary |
dm-standby |
| 业务 IP | 192.168.252.17 |
192.168.252.18 |
| 数据库名 | DAMENG |
DAMENG |
| 实例名 | PRI |
STA |
| OGUID | 45331 |
45331 |
| 守护组 | GRP1 |
GRP1 |
| 软件目录 | /home/dmdba/dm/dmdbms/ |
/home/dmdba/dm/dmdbms/ |
| 实例目录 | /dbdata/dmdata/DAMENG |
/dbdata/dmdata/DAMENG |
| 端口 | 配置项 | 监听方 | 用途 |
|---|---|---|---|
5236/tcp |
PORT_NUM、MAL_INST_PORT |
两个数据库实例 | 客户端和数据库服务端口 |
5336/tcp |
MAL_PORT |
两个数据库实例 | 主备数据库 MAL 数据通信和 Redo 传输 |
5436/tcp |
MAL_DW_PORT |
两个 dmwatcher |
守护进程间以及监视器到守护进程的通信 |
5536/tcp |
MAL_INST_DW_PORT |
两个数据库实例 | 本地实例与本地守护进程通信 |
同一端口可以在不同主机上重复使用。端口必须未被占用:
ss -lntp | egrep ':5236|:5336|:5436|:5536'
以下命令在三台主机上执行,只做检查:
cat /etc/redhat-release uname -m uname -r free -h df -h getenforce
要求两台数据库服务器使用相同 CPU 架构、相近的 Linux 7 内核环境和完全一致的 DM8 版本/补丁。生产环境应使用独立、低时延的心跳网络,并对磁盘 IO 做压测。
参考官网文档安装软件并初始化
https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html#1.3%20%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%9E%E4%BE%8B
备份主库数据
[dmdba@bin]$ ./disql sysdba/SYSDBA
SQL> BACKUP DATABASE BACKUPSET '/dbbak/dmbak/BACKUP_FILE';
SQL>exit
dm.inivi /home/dmdba/dm/dmdbms/bin/dm.ini
#将如下参数加入文件结尾处新增或者找到对应参数修改对应的数值
INSTANCE_NAME = GRP1_RT_01
DW_INACTIVE_INTERVAL=60
ALTER_MODE_STATUS=0
ENABLE_OFFLINE_TS=2
MAL_INI=1
RLOG_SEND_APPLY_MON=64
DW_ARCH_SPACE_CHECK=1
DW_ARCH_HANG_CHECK=1
dmmal.inidmmal.ini 在主、备节点必须保持一致,并且同时列出两个实例:
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.252.17 #根据实际IP 地址配置
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.252.17 #根据实际IP 地址配置
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.252.18 #根据实际IP 地址配置
MAL_PORT = 61142
MAL_INST_HOST =192.168.252.18 #根据实际IP 地址配置
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
dmarch.inivi /dbdata/dmdata/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbarch/dmarch
ARCH_FILE_SIZE = 2048 #单个归档大小
ARCH_SPACE_LIMIT = 4096 #根据dbarch目录存储上限的80%设置归档存储上限
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_02 #实时归档目标实例名
主库实时归档目标是备库实例名 GRP1_RT_02。ARCH_DEST 不是 IP,也不是主机名,必须与远端 dm.ini 的 INSTANCE_NAME 完全一致。
dmwatcher.inivi /dbdata/dmdata/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD =/home/dmdba/dm/dmdbms/bin/dmserverd start #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
DW_RECONNECT = 2
DW_FAILOVER_FORCE = 1
INST_SERVICE_IP_CHECK = 1
#窗口1
[dmdba@ bin]$ ./dmserver dm.ini mount
#启动后见“SYSTEM IS READY.”。新开一个窗口
#窗口2
[dmdba@rhel6 bin]$ ./disql sysdba/SYSDBA
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> sp_set_oguid(453331);
SQL> alter database primary;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL>exit
#窗口1
#回到窗口1,停前台数据库
输入exit 回车
[dmdba@bin]$cd /dbbak/dmbak/
[dmdba@dmbak]$ scp -rp BACKUP_FILE/ root@192.168.1.20:/dbbak/dmbak
[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$cp ./service_template/DmWatcherService ./dmwatcherd
[dmdba@ bin]$vi dmwatcherd
修改如下内容
INI_PATH=%INI_PATH%
#修改为
INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini
:wq
授予执行权限
[dmdba@ bin]$ chmod +x dmwatcherd
参考官网文档安装软件并初始化
https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html#1.3%20%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%9E%E4%BE%8B
[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$ ./dmrman
RMAN> restore database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE';
RMAN> recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE';
RMAN> recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' update db_magic;
RMAN>exit
dm.ini#将如下参数加入文件结尾处新增或者找到对应参数修改对应的数值
INSTANCE_NAME = GRP1_RT_02
DW_INACTIVE_INTERVAL=60
ALTER_MODE_STATUS=0
ENABLE_OFFLINE_TS=2
MAL_INI=1
RLOG_SEND_APPLY_MON=64
DW_ARCH_SPACE_CHECK=1
DW_ARCH_HANG_CHECK=1
dmmal.ini备库的 dmmal.ini 与主库完全一致:
vi /dbdata/dmdata/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.252.17 #根据实际IP 地址配置
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.252.17 #根据实际IP 地址配置
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.252.18 #根据实际IP 地址配置
MAL_PORT = 61142
MAL_INST_HOST =192.168.252.18 #根据实际IP 地址配置
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
dmarch.inivi /dbdata/dmdata/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbarch/dmarch
ARCH_FILE_SIZE = 2048 #单个归档大小
ARCH_SPACE_LIMIT = 4096 #根据dbarch目录存储上限的80%设置归档存储上限
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_01 #实时归档目标实例名
dmwatcher.inivi /dbdata/dmdata/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD =/home/dmdba/dm/dmdbms/bin/dmserverd start #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
DW_RECONNECT = 2
DW_FAILOVER_FORCE = 1
INST_SERVICE_IP_CHECK = 1
#窗口1
[dmdba@ bin]$ ./dmserver dm.ini mount
#启动后见“SYSTEM IS READY.”。新开一个窗口
#窗口2
[dmdba@rhel6 bin]$ ./disql sysdba/SYSDBA
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> sp_set_oguid(453331);
SQL> alter database standby;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL>exit
#窗口1
#回到窗口1,停前台数据库
输入exit 回车
[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$cp ./service_template/DmWatcherService ./dmwatcherd
[dmdba@ bin]$vi dmwatcherd
修改如下内容
INI_PATH=%INI_PATH%
#修改为
INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini
:wq
授予执行权限
[dmdba@ bin]$ chmod +x dmwatcherd
为了方便,这里在1号节点上创建
cd /home/dmdba/dm/dmdbms/bin
vim dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dm/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.252.17:52141
MON_DW_IP = 192.168.252.18:52142
#执行下面的开启
./dmmonitor /home/dmdba/dm/dmdbms/bin/dmmonitor.ini
## 执行show查看信息
#主库服务器
[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$./dmwatcherd start
#备库服务器
[dmdba@ bin]$cd /home/dmdba/dm/dmdbms/bin
[dmdba@ bin]$./dmwatcherd start
分别登录主、备库:
SELECT INSTANCE_NAME, STATUS$, MODE$, OGUID FROM V$INSTANCE;
预期:
| 实例 | STATUS$ |
MODE$ |
OGUID |
|---|---|---|---|
GRP1_RT_01 |
OPEN |
PRIMARY |
45331 |
GRP1_RT_02 |
OPEN |
STANDBY |
45331 |
在主库执行:
CREATE TABLE SYSDBA.DW_SYNC_TEST
(
ID INT PRIMARY KEY,
NOTE VARCHAR(100),
CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO SYSDBA.DW_SYNC_TEST(ID, NOTE)
VALUES (1, 'DMWATCH REALTIME TEST');
COMMIT;
SELECT * FROM SYSDBA.DW_SYNC_TEST;
在备库只读查询:
SELECT * FROM SYSDBA.DW_SYNC_TEST;
以下链接均指向达梦官方文档中心,页面内容会随产品版本更新:
文章
阅读量
获赞
