在实际生产环境中,数据库的高可用性和数据安全性是架构设计的核心考量。达梦数据库提供了多种主备同步模式,其中异步主备适用于对数据实时性要求不严格、但需要分担主库读压力或做异地容灾的场景
异步主备通过定时器触发机制,主库将 Redo 日志写入本地归档后,定时器按照设定的时间间隔(最小 1 分钟)将归档日志批量发送到备库,备库接收并重演日志
与实时主备的关键区别在于:
若无特别说明,以下操作均使用 dmdba 用户执行
由于之前的2节点集群已经准备好了相同文件,本次操作在之前的基础上进行
即,/data/dmdata1/DAMENG/ 和 /data/dmdata2/DAMENG/ 目录下包含 SYSTEM.DBF、MAIN.DBF、dm.ini 等数据库文件。
主库需要启用定时器功能,才能触发异步归档发送
vi /data/dmdata1/DAMENG/dm.ini
找到 TIMER_INI 参数,将其修改为:
TIMER_INI = 1
说明:TIMER_INI=1 表示启用定时器,这是异步同步的核心开关
先备份原文件,再修改归档配置:
cp /data/dmdata1/DAMENG/dmarch.ini /data/dmdata1/DAMENG/dmarch.ini.bak vi /data/dmdata1/DAMENG/dmarch.ini
内容如下:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmarch1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
[ARCHIVE_ASYNC]
ARCH_TYPE = ASYNC # 异步归档类型
ARCH_DEST = GRP1_RT_02 # 异步备库实例名
ARCH_TIMER_NAME = RT_TIMER # 定时器名称,与 dmtimer.ini 一致
ARCH_TYPE = ASYNC 表示异步归档
ARCH_DEST 必须与备库 dm.ini 中的 INSTANCE_NAME 完全一致
ARCH_TIMER_NAME 与 dmtimer.ini 中的定时器名称必须匹配
dmtimer.ini 用于配置定时器,控制异步归档的触发频率
vi /data/dmdata1/DAMENG/dmtimer.ini
内容如下:
[RT_TIMER] # 定时器名称,与 dmarch.ini 中的 ARCH_TIMER_NAME 一致
TYPE = 2 # 2: 按日执行[reference:16]
FREQ_MONTH_WEEK_INTERVAL = 1
FREQ_SUB_INTERVAL = 0
FREQ_MINUTE_INTERVAL = 1 # 同步间隔 1 分钟(最小间隔)[reference:17]
START_TIME = 00:00:00
END_TIME = 23:59:59
DURING_START_DATE = 2026-07-14 10:00:00
DURING_END_DATE = 9999-12-31 23:59:59
NO_END_DATE_FLAG = 1
DESCRIBE = RT TIMER
IS_VALID = 1
FREQ_MINUTE_INTERVAL = 1 表示每 1 分钟触发一次同步
TYPE = 2 表示按日执行的定时器
必须包含 FREQ_MONTH_WEEK_INTERVAL 和 FREQ_SUB_INTERVAL 字段,否则启动时会报 -832 [Invalid month or week interval] 错误
一主一异步备库场景下,备库守护进程需要配置为 LOCAL 类型
vi /data/dmdata2/DAMENG/dmwatcher.ini
将 DW_TYPE 从 GLOBAL 改为 LOCAL:
DW_TYPE = LOCAL
说明:LOCAL 守护类型直接 Open 数据库实例;GLOBAL 守护类型需要与其他守护进程协调信息,自动切换实例状态
grep INSTANCE_NAME /data/dmdata2/DAMENG/dm.ini
输出应为: INSTANCE_NAME = GRP1_RT_02
由于之前的系统服务可能已被卸载,本次采用直接启动 dmserver 的方式
终端 1——启动主库:
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmserver /data/dmdata1/DAMENG/dm.ini
终端 2——启动备库:
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmserver /data/dmdata2/DAMENG/dm.ini
预期输出:两个终端均显示 SYSTEM IS READY.,表示数据库已成功启动。
启动后数据库默认处于 MOUNT 状态,需要切换为 OPEN 才能执行 DDL/DML 操作
主库操作:
disql SYSDBA/Admin2026@localhost:5236
执行:
ALTER SYSTEM SET 'ALTER_MODE_STATUS' = 1 BOTH;
ALTER DATABASE OPEN FORCE;
备库操作:
disql SYSDBA/Admin2026@localhost:5237
ALTER SYSTEM SET 'ALTER_MODE_STATUS' = 1 BOTH;
ALTER DATABASE OPEN FORCE;
主库插入测试数据:
disql SYSDBA/Admin2026@localhost:5236
CREATE TABLE TEST_ASYNC (ID INT, NAME VARCHAR(30));
INSERT INTO TEST_ASYNC VALUES (1, '异步测试数据');
COMMIT;
等待约 1 分钟(定时器间隔),然后备库查询
disql SYSDBA/Admin2026@localhost:5237
SELECT * FROM TEST_ASYNC;
预期结果:备库能够查询到主库插入的数据,证明异步同步成功。
结果如图所示:
可以看到相差一分钟是可以查询到插入的信息的
dmserver startup failed, code = -832 [Invalid month or week interval]
原因:dmtimer.ini 文件缺少 FREQ_MONTH_WEEK_INTERVAL 或 FREQ_SUB_INTERVAL 字段。
解决方案:确保 dmtimer.ini 包含完整字段:
[RT_TIMER]
TYPE = 2
FREQ_MONTH_WEEK_INTERVAL = 1
FREQ_SUB_INTERVAL = 0
FREQ_MINUTE_INTERVAL = 1
...
[-720]: Dmwatcher is active, or current configuration(ALTER_MODE_STATUS) not allowed to alter database.
原因:守护进程处于活动状态时,不允许通过 SQL 修改数据库模式。
解决方案:使用 ALTER DATABASE OPEN FORCE 强制切换:
ALTER SYSTEM SET 'ALTER_MODE_STATUS' = 1 BOTH;
ALTER DATABASE OPEN FORCE;
现象:启动后 state is mount,无法执行建表操作。
原因:
解决方案:
| 对比维度 | 实时主备 | 异步主备(本次搭建) |
|---|---|---|
| 同步方式 | 事务提交时实时发送 Redo 日志到备库 | 定时器触发,批量发送归档日志 |
| 数据延迟 | 毫秒级,业务层几乎无感知 | 分钟级(最小 1 分钟),存在可感知延迟 |
| 对主库性能影响 | 需等待备库确认,有一定性能开销 | 几乎无影响,主库提交无需等待备库 |
| 守护进程类型 | GLOBAL(支持自动协调切换) |
LOCAL(仅本地管理) |
| 是否需要定时器 | 不需要 | 必须配置 dmtimer.ini |
| 归档类型 | ARCH_TYPE = REALTIME |
ARCH_TYPE = ASYNC |
| 故障切换 | 支持自动故障切换(配合监视器) | 仅支持手动接管 |
| 适用场景 | 网络稳定、需强一致性的场景(如金融交易) | 允许短时数据不一致、异地容灾或分担读压力的场景 |
文章
阅读量
获赞
