目录 搜索

← 返回指南索引

达梦主备集群:重启与主备切换 · 交互版

DM8 数据守护(主备)· 重启 6 步 + 切换 1 步(可选)· 命令可直接复制
点击左侧步骤卡 → 右侧展开命令 依据《DM8 数据守护与读写分离集群手册》· 真实环境实测 占位符 <…> 按本机环境替换后执行
← 返回文章版《达梦主备集群:重启与切换的完整操作》

操作视频实录

真实环境下的主备集群重启与切换全流程——从查状态到 stop group / startup group / switchover;先看视频建立整体印象,再按步骤动手
视频为主备集群重启与切换操作实录。若个别环境加载较慢,属正常现象。

六步重启 · 切换可选 · 终验收尾

点击任一步骤卡片,右侧展开该步的详细命令(均可一键复制);<尖括号> 内为占位符,按你的环境替换。演示环境:主库 DB1 @192.168.16.135(PRIMARY)/ 备库 DB2 @192.168.16.136(STANDBY)/ 守护组 GRP1(OGUID 102314271)/ SQL 端口 5666 / 软件目录 /home/dmdba/dmdbms / 数据目录 /dmdata/DAMENG / 监视器配置 /dmdata/dmmon/DAMENG。
流程在第 6 步之后分叉:只重启 → 1→6 做完直接跳 第 8 步 终验;本次维护还要做主备角色互换,才走 第 7 步(可选)。
1定位监视器进程与配置
先确认它在哪台机器,再记下程序路径与 path= 配置
查看命令 →
2连上监视器
dmmonitor <配置文件>,提示符变为 [monitor]
查看命令 →
3show 确认集群健康
盯 ISTATUS / IMODE / FLSN / CLSN 四个字段
查看命令 →
4login 登录监视器
管理命令的前置,按提示输账号口令
查看命令 →
5stop group 停守护组
监视器自动先停主库再停备库
查看命令 →
6startup group 启守护组
注意:是 startup 不是 start(实测坑)
查看命令 →
7switchover 计划内切换可选
仅当本次维护要主备角色互换才做;纯重启可跳过,直接到第 8 步
查看命令 →
8show 终验收尾
只重启 → 角色不变;做过切换 → 角色已互换
查看命令 →
步骤明细 已锁定 · Esc 解除
👆
点击左侧任意步骤卡片
这里展开该步的详细命令与注意事项

命令可一键复制 | Esc 解除锁定 | 打印时全部展开

目标:先弄清监视器跑在哪一台机器上,再记下它的程序路径与加载的配置文件——后面连接、启停都靠它们。

第一步先定位服务器:ps 只看得见本机进程
监视器是跑在某台机器上的独立进程,不是主备两台各有一份。你 ssh 到主库执行 ps -ef | grep dmmonitor, 查的是主库这台;监视器实际跑在备库时这里当然是空的——不是没装、也不是没起,是你找错了机器。
# 0) 先确认"我现在在哪台机器上"(多节点环境最容易漏的一步)
hostname; hostname -I

# 1) 查本机有没有监视器进程([d] 写法能避开 grep 自己那一行)
ps -ef | grep -i '[d]mmonitor'

# 2) 本机没有?看有没有注册成系统服务(确认监视器基本都是服务常驻)
systemctl list-units --type=service | grep -i DmMonitor
# 命中示例:DmMonitorServiceDBMM.service  loaded active running

# 3) 服务方式起的,命令与参数从服务定义里看
systemctl cat DmMonitorServiceDBMM | grep ExecStart

# 4) 辅助佐证:谁在写监视器日志,监视器就在哪台
ls -lt --time-style=+'%m-%d %H:%M' /dmdata/dmmon/DAMENG/log/ | head -3

确认在这台之后:再记下程序路径与 path= 后面的配置路径。

# 进程行里同时给出这两段:
# dmdba 1624 1 0 18:13 ? 00:00:07 /home/dmdba/dmdbms/bin/dmmonitor \
#   path=/dmdata/dmmon/DAMENG/dmmonitor_auto.ini
#   ↑ 程序本体(软件目录 bin/ 下)        ↑ 它加载的配置
  • 目录规律:达梦所有可执行文件都在软件目录的 bin/ 子目录下——dmserver、dmmonitor、disql、dmrman 无一例外。bin/ 前面那段就是这台机器的软件目录。
  • 确认软件目录:echo $DM_HOME;数据与配置目录看 ps -ef | grep dmserver 输出里 dm.ini 所在路径。两者通常是分开的(本演示:软件在 /home/dmdba/dmdbms,数据与配置在 /dmdata)。
  • 陷阱一:有程序、有配置 ≠ 有进程。集群部署时主备两台通常都装全了软件,bin/dmmonitor 两台都在;配置文件也可能两台各留一份。只有 ps 里的进程行(或服务状态 active running)才算"监视器跑在这台"。
    实测(本演示环境):主库 135 上 /home/dmdba/dmdbms/bin/dmmonitor 文件存在、dmmonitor_manual.ini 也在,但 ps 里只有 dmwatcher 和 dmserver,没有监视器;真正的确认监视器在备库 136,是系统服务 DmMonitorServiceDBMM 拉起来的。照"有配置就是这台"去判断,100% 判反。
  • 陷阱二:dmmonitor(两个 m)不是 dmonitor。少写一个 m 时,ps -ef | grep dmonitor 只会匹配到 grep 自己那一行——看起来像"监视器根本没跑",实际进程一直好好在跑。这一步搜错,后面全跟着错。
  • 两台都找不到怎么办:别急着认定"集群没监视器"。① 监视器可能装在第三台机器上(生产上推荐独立部署)——查部署台账或逐台 ps;② 也可能当前压根没起,那就自己起一个普通监视器(下一步),效果一样。只要配置里 [GRP1] 段的 MON_DW_IP 指向集群两个守护进程地址,在任意一台装了达梦的机器上起监视器都能管整个组——这才是"从哪个节点连都一样"的正确含义(说的是连守护进程,不是 ps 查进程)。
  • 程序路径与配置路径各现场不同(/home/dmdba/dmdbms/bin/…、/opt/dmdbms/bin/…、/dmdata/… 都常见),一律以你自己 ps 输出里那一段为准,别照搬示例。

目标:进入监视器交互界面,后续所有管理命令都在 [monitor] 提示符下执行。

# 先进到配置文件所在目录
cd /dmdata/dmmon/DAMENG

# 复制一份配置,只把 MON_DW_CONFIRM 改成 0 —— 这就是普通监视器,能与确认监视器共存
sed 's/^MON_DW_CONFIRM.*/MON_DW_CONFIRM = 0/' dmmonitor.ini > dmmonitor_normal.ini
# 本演示环境已有现成的 dmmonitor_manual.ini(= 0),效果相同,直接用即可

# 用这份普通监视器配置启动(程序路径换成步骤 1 记下的那段)
/home/dmdba/dmdbms/bin/dmmonitor path=/dmdata/dmmon/DAMENG/dmmonitor_normal.ini

# 回车后提示符变为:
[monitor]

# 退出监视器用 exit(写 quit 会报"输入命令非法")
  • 为什么先复制一份配置:确认监视器全局只能有一个。如果集群已经把确认监视器做成服务在跑(很常见),再用同一份 MON_DW_CONFIRM = 1 的配置启动,会被直接顶回来——Exist multiple CONFIRM dmmonitor, can only startup one!。把 MON_DW_CONFIRM 改成 0,就是普通监视器,随时可以再起、与确认监视器并存不冲突。
  • 判断依据只有这一个参数:配置文件里 MON_DW_CONFIRM,0 或未配置=普通(非确认)监视器,1=确认监视器。两个监视器的启动命令一模一样,差别只在这个值。别拿文件名猜——现场叫 dmmonitor_auto.ini 的那份经常就是 = 1,叫 dmmonitor_manual.ini 的才是 = 0;连之前先 grep MON_DW_CONFIRM 配置文件 看一眼。
  • 为什么普通监视器够用:它不承担自动接管职责,但状态查看与人工管理命令(stop group / startup group / switchover)都能执行——计划内重启与切换完全足够。不要为了操作去停正在服务的确认监视器,那会制造「无确认监视器」的风险窗口。
  • 什么时候必须用确认监视器:需要「主库故障后由监视器自动选出备库接管」时。此时要另配一份 MON_DW_CONFIRM = 1 的配置并常驻运行;只做计划内维护则不必。
  • 小坑:配置文件属主。用 dmdba 启动、而 ini 属主是 root 时,会先打印一行 os_file_open_normal_rw error! ... Permission denied——不影响读取和后续操作,但很容易被误认为启动失败。把 ini 属主改成运行用户即可消除。
  • show / login / stop group 这些是监视器内部命令,必须敲在 [monitor] 提示符下——敲进 Linux shell 只会 command not found。

目标:重启前先确认集群是健康的:实例 OPEN、角色正确、主备日志同步到位。

# [monitor] 提示符下执行(不需要 login)
show

# 真实输出是「一个实例一个表块」,完整列序为:
# WTIME  WSTATUS  INST_OK  INAME  ISTATUS  IMODE  RSTAT  N_OPEN  FLSN  CLSN
# 下面只摘关键列,对照着看你自己的输出:
# INAME        ISTATUS  IMODE    RSTAT  N_OPEN  FLSN   CLSN
# DB1          OPEN     PRIMARY  VALID  8       51662  51662
# DB2          OPEN     STANDBY  NULL   8       51662  51662   ← 备库侧 RSTAT 可能为 NULL
  • 四个判读点:① ISTATUS 与 IMODE 都是 OPEN;② IMODE 一主一备(PRIMARY / STANDBY)——主备角色看 IMODE,不是 RSTAT;③ RSTAT 只作参考:主库侧通常 VALID,备库侧实测可能为 NULL(switchover 切回后持续 NULL,实例仍正常 OPEN),它表示 REDO 有效性,不是健康红线;④ 两侧 FLSN / CLSN 一致。
  • FLSN/CLSN 是主备日志同步进度。业务已停的停机窗口内两侧应基本一致;业务在跑时有少量差值属正常(备库重演有毫秒级延迟),差值持续扩大才是异常。
  • 组信息在实例表块之后:往下还有一段 GROUP / OGUID / MON_CONFIRM / MODE / MPP_FLAG——核对组名、OGUID,以及「当前这个监视器是不是确认模式」,看这一段最快(本页用普通监视器,这里应是 FALSE)。
  • 更细诊断用 tip:逐实例报告运行是否正常、能否被其他实例加入,末尾给一句「所有组中的活动实例运行正常」。

目标:停止、启动、切换都是管理类命令,必须先登录监视器,否则会被拒绝。

# [monitor] 提示符下执行
login
# 会连着问两行:先「用户名:」再「密码:」(口令不回显)
# 成功后输出:登录监视器成功!
  • show / tip 这类查看命令不需要登录;stop group / switchover 这类管理操作必须登录,未登录会被拒绝并提示 未登录监视器或服务器公钥发生变化,请重新登录!
  • switchover 的登录校验在二次确认之后:敲完 YES 才检查登录状态——没登录的话等于白答一次确认,切换根本不会执行。所以顺序一定是「先 login,再 switchover」。
  • 停组之后 login 一定失败,别以为是口令错:实例全停时敲 login 会得到 当前没有活动实例或守护进程状态不匹配(不是STARTUP/OPEN/RECOVERY状态),登录信息校验失败——此时直接执行 startup group 就行,它不校验登录;等实例起来再 login 做切换。

目标:一条命令停掉整个守护组(主备实例 + 守护进程),顺序由监视器保证。

# [monitor] 提示符下、已 login 后执行
stop group

# 组名可省略;显式写等价
stop group GRP1

# 监视器按实例逐个推进(先主后备),逐条打印进度(实测输出):
# STOP实例DB1[PRIMARY, OPEN, ISTAT_SAME:TRUE]的守护进程
# STOP实例DB1[PRIMARY, OPEN, ISTAT_SAME:TRUE]的守护进程成功
# STOP实例DB2[STANDBY, OPEN, ISTAT_SAME:TRUE]的守护进程成功
# 通知实例(DB1)SHUTDOWN
# 通知实例(DB1)SHUTDOWN成功,请等待实例完全退出
# 通知实例(DB2)SHUTDOWN成功,请等待实例完全退出
# 通知组(GRP1)的守护进程执行清理操作
# 退出组(GRP1)中所有活动实例成功
  • 这一步会真正停库,业务中断。务必先确认已进入停机窗口、应用侧已断开连接。
  • 停的次序(先主后备)由监视器自动保证,不需要手工干预。
  • 没有二次确认:实测敲完 stop group GRP1 回车就直接执行,不会再问 Y/N——手别抖,敲之前确认窗口已开。
  • 耗时:两节点实测约 20 秒(20:20:42 开始,20:21:02 输出「退出组(GRP1)中所有活动实例成功」)。
  • 怎么确认真的停了:别只看监视器输出,回到操作系统查 ps -ef | grep dmserver 应无实例进程、ss -lnt | grep 5666 无监听,两个 DmServiceDMSERVER* 单元变成 inactive (dead)。
  • 守护进程(dmwatcher)不会随之消失:实测停组后 watcher 进程仍在、对应 systemd 单元仍是 active——这正是下面 startup group 能成功的前提。

目标:一条命令拉起整个守护组;备库会自动跟主库走。

# [monitor] 提示符下、已 login 后执行
startup group GRP1

# 一个监视器只配一组时,组名可省略,等价:
startup group

# 实测输出是逐条日志,不是 show 那种表格:
# STARTUP实例DB1[PRIMARY, SHUTDOWN, ISTAT_SAME:TRUE]的守护进程
# 守护进程(DB1)状态切换 [SHUTDOWN-->STARTUP]
# 实例DB1的守护进程配置有自动拉起,请等待守护进程将其自动拉起
# STARTUP实例DB2[STANDBY, SHUTDOWN, ISTAT_SAME:TRUE]的守护进程
# 启动组(GRP1)中的所有实例成功
# 实测约 20~25 秒后恢复:DB1 OPEN/PRIMARY、DB2 OPEN/STANDBY
  • GRP1 这个组名从哪来:不是随手起的,它就是监视器配置文件里的组段名——打开配置文件能看到一行 [GRP1],下面列着本组的 MON_DW_IP(各守护进程的 IP:PORT)。组名改了,命令里的 GRP1 也必须跟着改。
  • 同段里还有 OGUID:MON_INST_OGUID 必须与各节点 dmwatcher.ini 里的 INST_OGUID 完全一致,否则监视器连不上守护进程。
  • 组名可以省略:监视器自己的命令帮助写的就是 startup group [group_name]——方括号即可选。实时主备/读写分离一个监视器只配一组,省略与写上等价;多组并存(如 MPP 主备)时必须指定。
  • 这条命令是让 dmwatcher 去拉起实例,不是监视器自己起进程。若 dmwatcher 没在跑,会报 监视器还未收到组(GRP1)的守护进程消息,并以「启动组(GRP1)中的所有实例失败」告终——这时先把两节点的守护进程服务起起来,再回来敲 startup group。
  • 不要看到「ERROR」就以为失败:启动过渡期 show 会短暂显示 WSTATUS=STARTUP、ISTATUS=SHUTDOWN、INST_OK=ERROR,这是实例还没 OPEN 的正常中间态,等 20~25 秒再看。
  • 实例已经在跑会怎样:监视器逐个报告 实例DB1[PRIMARY, OPEN, ISTAT_SAME:TRUE]已经处于运行状态,末尾补一句「不符合启动组(GRP1)中的所有实例条件」——不会重启实例,也不会报错退出。
  • 命令不对称:停是 stop group,起是 startup group——写成 start group 会被监视器直接拒绝(输入命令非法)。
  • 只有不走监视器、改用操作系统服务分别启停 dmwatcher/dmserver 时,才需要自己把关启动顺序。
重启到这里就结束了。只想重启的话:startup group 返回「启动组(GRP1)中的所有实例成功」、两个实例重新 OPEN 之后,集群已回到原状——主备角色没有任何变化。直接跳到 第 8 步 做终验即可,第 7 步不用做。
只有本次维护窗口还要做主备角色互换(换机下线、验证切换能力、把业务挪到另一台、切换演练)时,才接着走第 7 步——它接在这个位置,但逻辑上不属于重启。
这一步是可选的,不属于重启流程。前面的 stop group / startup group 只是让实例停一下再起来,主备角色从头到尾没变;只有 switchover 才会真正对调主备。跳过它,重启依然是一次完整的重启。
需要做:换机下线、验证切换能力、计划内把业务挪到另一台、切换演练。 不用做:单纯的重启维护(改参数、打补丁、换硬件后重启)。

目标:计划内维护做主备角色互换:不丢数据,原备库升主、原主库降备。

# 前置:两实例均 OPEN、(停机窗口内)FLSN/CLSN 基本一致、已 login
switchover
# 不写参数即可:监视器自动挑当前备库,并在确认提示里把目标填好

# 二次确认(实测文案,目标由监视器填):
# 此操作需谨慎, 将会导致主库发生切换, 是否继续使用GRP1.DB2执行SWITCHOVER操作(YES/NO/Y/N)?
Y

# 回答 Y 后逐条跑完(实测全程约 4 秒):
# 守护进程(DB1)状态切换 [OPEN-->SWITCHOVER]
# 实例DB1 / DB2 执行 SP_SET_GLOBAL_DW_STATUS(0, 6) 成功
# ALTER DATABASE MOUNT → 原主降 STANDBY、原备升 PRIMARY → ALTER DATABASE OPEN FORCE
  • 目标可以不写:实测直接敲 switchover 就能切,监视器自动选当前备库,并把目标填进确认提示(格式 组名.实例名,如 GRP1.DB2)。要显式指定就按这个格式写 switchover GRP1.DB2;目标是将被升为 PRIMARY 的备库,写成当前主库没有意义,写成不存在的名字会被拒:实例名(xxx)无效或尚未收到实例消息! 外加一句「输入命令非法」。
  • 实测耗时与结果:从回答 Y 到两实例重新 OPEN 约 4 秒(20:21:56.3 → 20:21:57.0)。本次连切两次(DB1→DB2、再切回 DB1),每次都回到库内用 v$instance 的 MODE 复核 PRIMARY / STANDBY 确已互换,两侧 FLSN=CLSN。
  • switchover vs takeover:switchover 用于计划内切换(主备都健康,不丢数据);takeover 用于主库故障后备库强行顶上(可能丢数据)。不要混用。
  • 登录校验在二次确认之后:未登录时答完 YES 只会得到 未登录监视器或服务器公钥发生变化,请重新登录!,切换不会执行。实例刚重启过尤其容易掉登录态,动手前重新 login 一次。

目标:确认集群回到健康状态,收工。

# [monitor] 提示符下执行
show

# 共同项(两种情形都要满足):
# 1) 两个实例的 ISTATUS 都是 OPEN
# 2) FLSN / CLSN 重新趋于一致(备库追平需要一点时间)
#    RSTAT 主库侧 VALID、备库侧可能 NULL,不作为判据
#
# 角色项(看 IMODE,按你走到哪一步挑一组核对,别套错):
# A 只重启、没做第 7 步 → 角色应保持原样:DB1 仍 PRIMARY、DB2 仍 STANDBY
# B 做过第 7 步切换   → 角色应已互换:DB1 变 STANDBY、DB2 变 PRIMARY
  • 标准别套错:没做第 7 步却看到角色变了,或者做了切换角色却没变,都算异常——先看 show 的 IMODE 列和实例日志,别急着收工。
  • 若此时业务已恢复写入,FLSN/CLSN 有少量差值属正常——「一致」要在「业务已停」前提下看才算数。

使用前须知

动手之前先对号入座:这件事什么时候该做、谁来做、会中断多久、哪些坑要绕开

一、什么时候要做这件事

  • 计划内维护:版本升级、硬件更换或扩容、机房搬迁、需重启才生效的参数调整——走本页这套流程;要不要顺带做一次 switchover,看变更单要求,不是默认动作(见第 7 步,可选)。
  • 主库故障后的恢复:处置路径不同,用的是 takeover 而不是 switchover,且可能丢数据,不要套用本页的计划内切换步骤。
  • 判断依据是变更单或故障单的明确要求,不是「感觉该重启了」——停机窗口没批下来就不要动。

二、谁来做、需要什么条件

  • 操作系统账号:达梦运行用户(通常为 dmdba),要能读到监视器配置文件。
  • 数据库账号:具备管理权限的账号(如 SYSDBA),login 时按提示输入。
  • 停机窗口:stop group 会让业务真正中断,这是硬约束,不适合「顺手做一下」。
  • 监视器状态:确认监视器(如有)保持运行,不要为了操作去停它。

三、影响范围

操作业务影响数据影响
show / login无无
stop group → startup group全程中断,直到实例重新 OPEN不丢数据
switchover(计划内)秒级到分钟级连接闪断不丢数据,主备角色互换
takeover(主库故障)中断持续到新主可用可能丢数据

四、常见的坑

  • 监视器程序名写错:是 dmmonitor(两个 m)。写成 dmonitor 时进程根本搜不到,还会让人误判"监视器没运行"。
  • start group 不合法:启动只能写 startup group,写成 start group 会被监视器直接拒绝。
  • 用确认监视器配置起第二个监视器:会报 Exist multiple CONFIRM dmmonitor, can only startup one!。临时操作请复制配置改 MON_DW_CONFIRM = 0,不要停掉正在服务的确认监视器。
  • 实例重启后要重新 login:会提示未登录或服务器公钥变化,重新登录一次再继续。switchover 的登录校验在二次确认之后,答完 YES 才发现没登录就白折腾一次。
  • dmwatcher 没起来就敲 startup group:会报「监视器还未收到组的守护进程消息」「启动组中的所有实例失败」——先确认守护进程服务在跑。
  • 监视器命令敲进操作系统 shell:show / login / stop group 都必须在 [monitor] 提示符下执行。
  • FLSN/CLSN 没追平就停库:停机窗口内两侧应基本一致,不一致先等备库追平,否则会拉长不可用时间。
  • 把 switchover 当 takeover 用:前者计划内、不丢数据;后者故障场景、可能丢数据,混用会导致误判。

五、如何自证已完成

  • show 输出中两个实例的 ISTATUS 均为 OPEN,WSTATUS 也是 OPEN。
  • IMODE 符合预期:只重启未切换则主备角色不变;做过切换则主备已互换(原主→STANDBY,原备→PRIMARY)。
  • RSTAT 均为 VALID,且 FLSN / CLSN 两侧趋于一致,说明备库已追平、日志同步正常。
  • 应用侧连接正常、关键业务与监控告警无异常后,才算交付完成。

详解:监视器怎么用 · 状态怎么看 · 模式有什么讲究

想弄清原理再看这一节:监视器怎么连、show 的字段怎么判读、switchover 与 takeover 怎么选、监视器模式有什么影响

一、先认清演示环境(照着换成自己的)

角色值
主库实例 DB1 @ 192.168.16.135 · PRIMARY · SQL 端口 5666
备库实例 DB2 @ 192.168.16.136 · STANDBY · SQL 端口 5666
守护组名 / OGUIDGRP1 / 102314271 ——组名取自监视器配置文件的 [GRP1] 段名,不是自定义名称
软件目录(DM_HOME)/home/dmdba/dmdbms(可执行文件在 bin/ 下)
数据与配置目录/dmdata(实例 dm.ini 在 /dmdata/DAMENG,监视器配置在 /dmdata/dmmon/DAMENG)
监视器所在节点备库 136 —— 系统服务 DmMonitorServiceDBMM 常驻拉起,加载 dmmonitor_auto.ini。主库 135 上没有监视器进程:只装了程序、留了一份 dmmonitor_manual.ini,别按"有配置文件"就判定它在 135
监视器配置dmmonitor_auto.ini(MON_DW_CONFIRM = 1,确认监视器,由 DmMonitorServiceDBMM 常驻)与同目录 dmmonitor_manual.ini(= 0,普通监视器,可与前者共存)
文档口径 + 通行实践:软件目录与数据目录彻底分开(如 /u01/dmdbms 放软件、/u02/dmdata 放数据)。 好处:① 升级只替换软件目录,数据一个字节不动,回退容易;② 数据目录可单独挂大容量高 IOPS 盘。 不要把数据库软件装进数据目录——备份、迁移、扩容都会变别扭。

二、show 输出字段怎么判读

字段含义
ISTATUS实例状态,正常 OPEN
IMODE主备角色:PRIMARY / STANDBY——切换后重点核对这一列是否按预期互换
RSTATREDO / 归档有效性,正常 VALID。它不是主备角色,别拿它判断谁是主库
FLSN / CLSN主备日志同步进度(文件序号 / 已重演序号)——最关键:停机窗口内两侧应基本一致
WSTATUS守护进程状态,正常 OPEN
N_OPEN实例被 OPEN 的累计次数,各环境数值不同,仅供参考、不作判据
FLSN/CLSN 差值判读(重要):业务在跑时两侧有一点差值本来就正常; 停机窗口内(业务已停、无新写入)两侧应当基本一致——若此时仍明显不一致,说明备库有积压没追平, 先等它追平再停库,否则会拉长重启后的不可用时间。差值持续扩大则是备库跟不上,先排查归档链路。

三、switchover 与 takeover:一字之差,场景不同

命令适用场景数据影响
switchover计划内切换,主备都健康(如例行维护、版本升级)不丢数据,角色互换
takeover主库故障、无法恢复,备库强行顶上可能丢数据

四、监视器模式:CONFIRM 与普通监视器

文档口径(DM8 数据守护与读写分离集群手册 · 监视器章节):一个集群只能有一个确认监视器 (MON_DW_CONFIRM = 1),但可以有多个普通监视器。普通监视器仅用于监控守护系统状态与执行手动切换命令—— stop group / startup group / switchover 都能用。 需要临时操作时,复制一份配置把 MON_DW_CONFIRM 改 0 起一个即可;停掉正在服务的确认监视器反而会制造「无确认监视器」的风险窗口:
# 先看这份配置到底是确认还是普通(0=普通,1=确认)
grep MON_DW_CONFIRM dmmonitor.ini

# 用普通监视器配置连上去(可与确认监视器共存)
sed 's/^MON_DW_CONFIRM.*/MON_DW_CONFIRM = 0/' dmmonitor.ini > dmmonitor_normal.ini
# 本演示环境已有现成的 dmmonitor_manual.ini(= 0),效果相同,直接用即可
/home/dmdba/dmdbms/bin/dmmonitor path=/dmdata/dmmon/DAMENG/dmmonitor_normal.ini
文档口径:DW_MODE = AUTO 只决定「主库故障时备库是否自动接管」, 与人工发起的 switchover 无关——AUTO 模式下照常可以手工切换(实测:switchover 完整执行到底,DB1→DB2 与切回 DB2→DB1 各一次,两实例均正常 OPEN)。 当前监视器是不是确认模式,show 的组信息里 MON_CONFIRM 一列直接可见(普通监视器为 FALSE); 部分版本 tip 会额外提示 This monitor is not in CONFIRM mode,意思是该监视器无法执行自动接管—— 只做计划内维护时不必紧张,但生产上依赖自动切换的集群要按手册把监视器配成 CONFIRM 模式。

常见问题(FAQ)

遇到卡壳先在这里找答案 —— 每条都标了依据:依据手册的标「文档」,来自现场经验的标「现场」

把监视器内部命令敲到 Linux shell 里了。show、login、stop group 都是监视器内部命令,必须先连上监视器、在 [monitor] 提示符下执行。

先分场景:业务在跑时有一点差值本来就正常,不必卡着不动;但停机窗口内(业务已停)两侧应当基本一致——不一致说明备库有积压,贸然停库会拉长重启后的追平时间(期间集群不可用),先等追平再操作。

命令不对称:停止是 stop group,启动是 startup group。写成 start group 监视器会直接回「输入命令非法」并提示正确用法——实测踩过的坑。

通常不需要。stop group / startup group 只是把实例停掉再起来,全程不改主备角色;switchover 是另一件事——把主备对调。只做重启维护(改参数、打补丁、换硬件后重启)就跳到终验,第 7 步可以完全跳过。

只有本次变更单确实要求把业务挪到另一台、或要验证切换能力时才做。动手前先算一笔账:应用如果是直连主库 IP 而不是服务名 / VIP,切换后连接串得跟着改,这才是做切换的真正成本;用的是服务名就基本无感。

能。文档口径:普通监视器「仅用于监控守护系统状态与执行手动切换命令」,管理命令都能用。不要为了操作而停掉确认监视器——一个集群只能有一个确认监视器,停掉它会制造一段无确认监视器的风险窗口;正确做法是复制配置把 MON_DW_CONFIRM 改 0,另起一个普通监视器与它共存。

能。文档口径:AUTO 只影响「主库故障时备库是否自动接管」,与人工发起的计划内切换无关——实测 AUTO 模式下 switchover 完整跑通两个方向(角色互换后两实例仍双 OPEN、FLSN=CLSN)。

取决于你依不依赖自动切换。文档口径:该提示表示此监视器不在 CONFIRM 模式,主库故障时无法完成自动接管。只做计划内维护不必紧张;生产上依赖自动切换的集群,务必按手册把监视器配成确认模式。

多半是找错机器了。ps 只列本机进程,而监视器只跑在启动它的那一台(本演示是备库 136,由系统服务 DmMonitorServiceDBMM 常驻)。 判断顺序:① hostname 确认当前在哪台 → ② ps -ef | grep -i '[d]mmonitor' → ③ systemctl list-units --type=service | grep -i DmMonitor → ④ 看谁在写 MON_LOG_PATH 下的日志(ls -lt 时间在涨的那台)。 别被"有程序、有配置"骗了:主库 135 上 bin/dmmonitor 与 dmmonitor_manual.ini 都在,但确实没有监视器进程。两台都没有也不必慌——自己起一个普通监视器即可(步骤 2)。

卡在某一步了?

这一步在你环境里报的错,大概率我也碰过 —— 别自己硬扛。
微信扫码添加 JC
微信扫码加我
备注「达梦」即可
卡住了 / 报错对不上

把卡在第几步、报错原文、版本号发我就够判断了 —— 不用发 dm.ini 或任何配置文件。共性问题我会补进这篇,下一个人就不用再踩这个坑。

这篇没覆盖到

现象和上面几步都对不上?把已经试过的命令和结果说一下,我能判断是文档该补一句,还是版本或环境差异。真要贴参数,先把 IP、路径、口令替换掉。

jiang-chuang@qq.com

想让答案别人也能查到?在 Gitee 仓库 提 issue,回复公开可查。