在达梦数据库DSC(Data Sharing Cluster)高可用架构中,备库根据日志同步方式的不同,分为实时备库和异步备库两种类型:
| 类型 | 同步方式 | 数据延迟 | 性能影响 | 适用场景 |
|---|---|---|---|---|
| 实时备库 | 实时同步 | 毫秒级 | 较大 | 对数据一致性要求高的核心业务 |
| 异步备库 | 定时同步 | 分钟/小时级 | 较小 | 容灾备份、报表分析、网络带宽受限场景 |
在实际运维中,业务需求可能会发生变化,例如:
传统做法需要重建备库,耗时耗力。本文介绍如何在不重建集群的前提下,动态完成两种角色的平滑切换。
达梦DSC集群通过归档日志(Archivelog)实现主备之间的数据同步。归档配置定义在 dmarch.ini 文件中,每条归档记录包含:
dest:目标实例typ:归档类型(realtime 实时 / async 异步)arch_timer_name:异步定时器名称(仅异步归档需要)守护进程(DW Daemon)负责:
守护进程类型(DW_TYPE):
GLOBAL:全局守护进程,适用于实时备库LOCAL:本地守护进程,适用于异步备库角色切换的本质是修改归档配置和守护进程类型,使主备之间的日志同步行为发生改变。
OPEN 状态备份异步归档 → 归档删除异步归档 → 停止异步守护进程 → 修改DW_TYPE → 增加实时归档 → 加入集群 → 重启守护进程 → 验证
通过监视器查看当前集群架构,确认:
分别连接到主库和实时备库,执行删除命令:
-- 主库 SDNXDSC0
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
-- 主库 SDNXDSC1
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
-- 实时备库 SDNXDSC00
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
-- 实时备库 SDNXDSC11
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
⚠️ 注意:必须四个实例都执行,否则会导致归档配置不一致。
在异步备库所在服务器上执行:
# 停止守护进程(具体命令根据部署方式调整)
DmWatcherDSC000 stop
编辑 dm.ini 文件(或守护进程配置文件),修改:
DW_TYPE = GLOBAL # 从 LOCAL 改为 GLOBAL
连接到异步备库,增加指向主库和实时备库的实时归档:
-- 添加指向主库的实时归档
alter database add archivelog 'dest=SDNXDSC0/SDNXDSC1, typ=realtime, arch_failover=1';
-- 添加指向实时备库的实时归档
alter database add archivelog 'dest=SDNXDSC00/SDNXDSC11, typ=realtime, arch_failover=1';
参数说明:
dest:目标实例组,支持逗号分隔多个实例typ=realtime:实时归档模式arch_failover=1:启用故障切换,当目标实例不可用时自动切换到其他实例DmWatcherDSC000 start
分别连接到主库和实时备库,添加指向原异步备库的实时归档:
-- 主库 SDNXDSC0
alter database add archivelog 'dest=SDNXDSC000/SDNXDSC111, typ=realtime, arch_failover=1';
-- 主库 SDNXDSC1
alter database add archivelog 'dest=SDNXDSC000/SDNXDSC111, typ=realtime, arch_failover=1';
-- 实时备库 SDNXDSC00
alter database add archivelog 'dest=SDNXDSC000/SDNXDSC111, typ=realtime, arch_failover=1';
-- 实时备库 SDNXDSC11
alter database add archivelog 'dest=SDNXDSC000/SDNXDSC111, typ=realtime, arch_failover=1';
依次重启所有实例的守护进程(顺序不限):
# 重启主库守护进程
DmWatcherDSC0 restart
DmWatcherDSC1 restart
# 重启实时备库守护进程
DmWatcherDSC00 restart
DmWatcherDSC11 restart
通过监视器查看集群状态:
dmmonitor path=/dm/dmmonitor/dmmonitor.ini
在监视器中执行:
show database GRP1;
确认原异步备库的状态:
DW_TYPE 变为 GLOBALrealtimeSUSPEND 状态,这是正常的恢复过程,几秒后会自动恢复。dmarch.ini 文件。分离备库 → 删除实时归档 → 停止守护进程 → 修改DW_TYPE → 删除自身归档 → 添加异步归档 → 重启守护进程 → 验证
通过监视器确认当前集群中所有实例的角色和状态。
# 登录监视器
dmmonitor path=/dm/dmmonitor/dmmonitor.ini
# 执行分离命令
detach database GRP1.SDNXDSC000
⚠️ 分离后,该备库暂时脱离集群,不再接收日志。
分别连接到主库和其他实时备库,删除指向待转换备库的实时归档:
-- 主库 SDNXDSC0
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
-- 主库 SDNXDSC1
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
-- 实时备库 SDNXDSC00
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
-- 实时备库 SDNXDSC11
alter database delete archivelog 'dest=SDNXDSC000/SDNXDSC111';
DmWatcherDSC000 stop
编辑配置文件,修改:
DW_TYPE = LOCAL # 从 GLOBAL 改为 LOCAL
连接到待转换的备库,删除指向主库和其他实时备库的归档:
-- 删除指向主库的归档
alter database delete archivelog 'dest=SDNXDSC0/SDNXDSC1';
-- 删除指向实时备库的归档
alter database delete archivelog 'dest=SDNXDSC00/SDNXDSC11';
DmWatcherDSC000 start
分别连接到主库和其他实时备库,添加异步归档配置:
alter database add archivelog 'dest=SDNXDSC000/SDNXDSC111, type=ASYNC, arch_timer_name=RT_TIMER';
参数说明:
type=ASYNC:异步归档模式arch_timer_name:指定定时器名称,用于控制同步频率重启主库、实时备库、以及刚转换的异步备库的守护进程。
通过监视器确认:
DW_TYPE 变为 LOCALasyncarch_timer_name 对应的定时器配置决定,需提前在 dmarch.ini 中配置好。现象:操作未完成时,原主库宕机或发生自动切换。
影响:老主库认为异步备库已变为实时备库,而新主库仍认为它是异步备库,导致配置不一致。
解决:
问题:级联异步备库(源库是另一个异步备库)转换为实时备库后,可能被提升为主库,此时需要向原源库同步数据。
要求:转换前必须确保该备库上配置了定时器(arch_timer_name)。
现象:异步备库收到多个不同源库发送的日志包,导致连续性校验失败。
原因:切换前该备库的 dmarch.ini 中存在多个异步归档配置未被清理。
解决:
dmarch.ini,只保留一个源库的异步归档原因:主库写入压力大,或网络带宽不足。
解决:
dmarch.ini、dm.ini)dmarch.ini 是否与预期一致通过本文介绍的动态切换方法,可以在不重建集群、不停业务的前提下,灵活调整DSC环境中的备库角色。
| 切换方向 | 核心操作 | 耗时 |
|---|---|---|
| 异步 → 实时 | 修改DW_TYPE + 增加实时归档 | 约 5-10 分钟 |
| 实时 → 异步 | 分离备库 + 修改DW_TYPE + 增加异步归档 | 约 5-10 分钟 |
掌握这些技巧,可以大幅提升DSC集群的运维效率和灵活性。
| 操作 | 命令 |
|---|---|
| 删除归档 | alter database delete archivelog 'dest=实例名' |
| 添加实时归档 | alter database add archivelog 'dest=实例名, typ=realtime, arch_failover=1' |
| 添加异步归档 | alter database add archivelog 'dest=实例名, type=ASYNC, arch_timer_name=定时器名' |
| 分离备库 | detach database 集群名.实例名 |
| 查看集群状态 | show database 集群名 |
📌 本文基于达梦DSC实际运维经验总结,不同版本命令可能有细微差异,请以官方文档为准。
文章
阅读量
获赞
