📋 这篇有交互操作版:左侧步骤卡片导航、命令可一键复制,现场照着敲更方便。打开交互操作版 →
这篇是配套视频的文字版。视频演示的是真实环境下的操作,下面把每一步拆开写清楚,可以照着做,也可以用来快速定位某一步。
一、先认清演示环境
这一节只是为了让你看懂后面的输出示例。你的环境路径和实例名大概率不同,照着换成自己的即可。
| 角色 | 实例名 | IP | 守护状态 |
|---|---|---|---|
| 主库 | DB1 | 192.0.2.11 | PRIMARY |
| 备库 | DB2 | 192.0.2.12 | STANDBY |
- 守护组名:
GRP1 - 软件安装目录(DM_HOME):
/data/dmdata - 监视器程序:
/data/dmdata/bin/dmmonitor - 监视器配置:
/data/dmdata/dmmon/DAMENG/dmmonitor_auto.ini
后面每处需要替换成你自己环境的,我都会标出来。
达梦的目录约定
达梦所有可执行文件,都在「软件安装目录」的
bin/子目录下。dmserver、dmmonitor(监视器)、disql、dmap、dmrman,一个都没有例外。
目录名惯例就叫 dmdbms,Linux 上默认装到 /opt/dmdbms,也常见 /home/dmdba/dmdbms。上面演示环境单独做了目录规划,装在 /data/dmdata,所以监视器是 /data/dmdata/bin/dmmonitor。
记住这条规律就够:bin/ 前面那一段,就是这台机器上的安装目录。
生产环境:软件和数据分开两个目录
业界通行做法是把软件目录和数据目录彻底分开,例如:
/u01/dmdbms/ ← 只放软件(约 2–3 GB):bin/、jar/、tool/、jdk/、doc/
/u02/dmdata/ ← 只放数据:数据文件、控制文件、联机日志、归档、备份
这么做有两个实在的好处:
- 升级更安全:换版本时只替换软件目录,数据目录一个字节都不动;万一新版本有问题,回退旧软件目录就能恢复
- 扩容更方便:数据目录可以单独挂一块大容量、高 IOPS 的盘,软件目录不用跟着搬
⚠️ 反过来也别把数据库软件装在数据目录下面。数据目录是业务数据的地盘,混进软件文件后,做备份、迁移、磁盘扩容都会变别扭。
想知道自己这台机器装在哪,两条命令:
# 1) 软件目录
echo $DM_HOME
# 2) 数据目录(ps 输出里 path= 后面是 dm.ini 的完整路径,它所在目录就是实例目录)
ps -ef | grep dmserver
实测补充一句:$DM_HOME 只有 dmdba 用户的 shell 里有值,用 root 跑 echo $DM_HOME 出来是空的。查之前先 su - dmdba。
二、重启前:先确认集群是健康的
第 1 步:先确定监视器跑在哪台
ps 只能看见本机进程。监视器是一个独立进程,只存在于启动它的那台机器上。你在主库上查不到它是正常的:它可能跑在备库,也可能跑在独立部署的第三台机器上。
# 0) 先确认"我现在在哪台机器上"(多节点环境最容易漏的一步)
hostname; hostname -I
# 1) 查本机有没有监视器进程([d] 写法能避开 grep 自己那一行)
ps -ef | grep -i '[d]mmonitor'
# 2) 本机没有?看有没有注册成系统服务(确认监视器基本都是服务常驻)
systemctl list-units --type=service | grep -i DmMonitor
# 3) 辅助佐证:谁在写监视器日志,监视器就在哪台
ls -lt /dmdata/dmmon/DAMENG/log/ | head -3
别被「有程序、有配置」骗了。集群部署时主备两台通常都装全了软件,
bin/dmmonitor两台都有,配置文件也可能各留一份。只有ps里的进程行(或服务状态active running)才能证明监视器跑在这台。实测:主库 135 上
/home/dmdba/dmdbms/bin/dmmonitor文件存在、dmmonitor_manual.ini也在,但ps里只有dmwatcher和dmserver,真正的确认监视器跑在备库 136,由系统服务DmMonitorServiceDBMM拉起。两台都找不到也不必执着。只要手上有一份配置,在任意一台装了达梦的机器上起一个普通监视器即可(见第 3 步)。配置里
[GRP1]段的MON_DW_IP指向集群所有守护进程地址,所以从哪台机器起监视器都能管整个组。这才是「从哪个节点连都一样」的正确含义——说的是连守护进程,不是ps查进程。
第 2 步:找到监视器进程和它的配置路径
监视器通常不在 PATH 里,先把它揪出来:
ps -ef | grep dmmonitor
会看到类似这样一行,记下它:
dmdba 1015 1 0 Dec17 ? 00:00:06 /data/dmdata/bin/dmmonitor path=/data/dmdata/dmmon/DAMENG/dmmonitor_auto.ini
这一行信息量很大,拆开看:
| 片段 | 含义 |
|---|---|
dmdba | 运行监视器的系统用户 |
/data/dmdata/bin/dmmonitor | 监视器程序本体 —— 在软件安装目录的 bin/ 下($DM_HOME/bin/dmmonitor) |
path=/data/dmdata/dmmon/DAMENG/dmmonitor_auto.ini | 它加载的配置文件(可以放在数据目录,和软件分开) |
第 3 步:连上监视器
把上面那行里的 path= 去掉,剩下的整串就是启动命令:
/data/dmdata/bin/dmmonitor path=/data/dmdata/dmmon/DAMENG/dmmonitor_auto.ini
💡 路径太长懒得手打,用 Tab 补全。演示里就是这么做的:
[dmdba@db139 ~]$ /data/dmdata/bin/dmmonitor /data/dmdata/dmmon/DAMENG/dmmonitor_ dmmonitor_auto.ini dmmonitor_manual.ini敲到
dmmonitor_连按两下 Tab,它会列出该目录下的候选。这里有两个:dmmonitor_auto.ini是自动模式配置,dmmonitor_manual.ini是手动模式配置。演示用的是auto。
回车后进入监视器自己的交互界面,提示符会变成:
[monitor]
⚠️ 后面所有命令都是在
[monitor]提示符下敲的,不是操作系统命令,别敲到 shell 里去。
第 4 步:看一眼集群状态
show
输出长这样:
WTIME 2024-12-18 00:56:24 RTSTATUS 0 INST_OK NAME DB2 STATUS OPEN RISTAT OPEN RSTAT STANDBY VALID 3 FLSN 47822 CLSN 47822
WTIME 2024-12-18 00:56:24 RTSTATUS 0 INST_OK NAME DB1 STATUS OPEN RISTAT OPEN RSTAT PRIMARY VALID 3 FLSN 47822 CLSN 47822
盯住三个字段就够:
| 字段 | 正常值 | 说明 |
|---|---|---|
STATUS | OPEN | 实例处于打开状态 |
RSTAT | PRIMARY / STANDBY | 实例的主备角色 |
FLSN / CLSN | 两侧基本一致 | 主备数据同步进度,这一项最关键 |
这两个数值怎么判读:
| 场景 | 现象 | 说明 |
|---|---|---|
| 业务已停、无新写入(停机窗口内) | 两侧 FLSN/CLSN 几乎完全一致 | ✅ 这才是可以放心重启的状态 |
| 业务还在跑 | 两侧有一点差值 | ✅ 正常 —— 备库重演本来就有毫秒级延迟 |
| 业务在跑、且差值持续扩大 | 差值越拉越大 | ⚠️ 备库跟不上,先排查归档链路再动手 |
「一致」要在「业务已停」的前提下看才算数。业务在跑时两侧数值不同,不代表集群有问题。
想看更细的诊断信息:
tip
它会输出每个实例的详细状态,以及监视器的模式提示。注意这一条:
[TIP] This monitor is not in CONFIRM mode. If PRIMARY instance error occurs in AUTO switch mode,
this monitor cannot do auto takeover!!!
这句话的意思是,监视器当前不在 CONFIRM 模式。此时主库若故障,监视器虽然会走自动切换(AUTO),但无法完成自动接管。生产环境要留意这个提示。
三、停止主备集群
第 5 步:先登录监视器
管理类命令(停止、启动、切换)必须先登录,否则会被拒绝:
login
按提示输入数据库管理员账号和口令(如 SYSDBA)。
第 6 步:停止整个守护组
stop group
监视器会按顺序执行:
Stop dmmonitor process of instance DB1[PRIMARY, OPEN, ISTAT_SAME_TRUE]
Stop dmmonitor process of instance DB2[STANDBY, OPEN, ISTAT_SAME_TRUE]
Notify instance[dmdba] shutdown
Instance DB1 shutdown success, please wait
Instance DB2 shutdown success, please wait
顺序是先停主库(DB1),再停备库(DB2)。监视器自己会保证这个次序,不用手工干预。
⚠️ 这一步会真正停掉数据库,业务会中断。生产环境务必先确认已进入停机窗口,并且应用侧已经断开连接。
四、启动主备集群
第 7 步:启动整个守护组
startup group GRP1
⚠️ 注意命令不对称:停用的是
stop group,启动用的是startup group,不是start group。写成start group监视器会直接回「输入命令非法」,并提示正确用法。这是实测踩过的坑。
输出(监视器会逐条推进守护进程与实例状态):
STARTUP实例GRP1_RT_02[PRIMARY, SHUTDOWN]的守护进程
守护进程(GRP1_RT_02)状态切换 [SHUTDOWN-->STARTUP]
STARTUP实例GRP1_RT_01[STANDBY, SHUTDOWN]的守护进程
守护进程(GRP1_RT_01)状态切换 [SHUTDOWN-->STARTUP]
...
STARTUP OK GRP1_RT_02 OPEN PRIMARY VALID
STARTUP OK GRP1_RT_01 OPEN STANDBY
这个先后顺序同样由监视器自动保证,不需要手工干预。备库会跟着主库走,主库没起来时它会先等待。
⚠️ 只有当你不用监视器、改用操作系统服务分别启停
dmwatcher/dmserver时,才需要自己注意启动顺序。
第 8 步:再确认一次状态
show
验收标准:
- 两行都是
STATUS OPEN RSTAT分别是PRIMARY和STANDBY(角色没有意外翻转)- 两行的
FLSN/CLSN重新趋于一致(备库追上主库需要一点时间,稍等片刻再show;若此时业务已恢复写入,有少量差值属正常)
五、主备切换
重启完成后,如果要做计划内的主备角色互换,用的是 switchover,区别于主库故障时的 takeover:
| 命令 | 适用场景 | 数据影响 |
|---|---|---|
switchover | 计划内切换,主备都健康 | 不丢数据,角色互换 |
takeover | 主库故障、无法恢复 | 备库强行顶上,可能丢数据 |
执行切换前确认三件事:
- 监视器里已经
login。若刚才重启过实例,执行时可能提示「未登录监视器或服务器公钥发生变化,请重新登录!」,遇到就重新login一次(部分版本并不需要重登) show显示两个实例都是OPEN;停机窗口内(业务已停)两侧 FLSN/CLSN 应基本一致- 用普通监视器(
MON_DW_CONFIRM = 0)同样可以执行switchover
两个容易搞错的点
一、不必为了操作监视器而停掉确认监视器。一个集群只能有一个确认监视器,但可以有多个普通监视器。普通监视器「仅用于监控守护系统状态与执行手动切换命令」(官方原文),
stop group、startup group、switchover都能用。需要临时操作时,复制一份配置把MON_DW_CONFIRM改成0起一个即可。停掉正在服务的确认监视器,反而会制造一段「无确认监视器」的风险窗口。# 用普通监视器配置连上去(可与其他监视器共存) sed 's/^MON_DW_CONFIRM.*/MON_DW_CONFIRM = 0/' dmmonitor.ini > dmmonitor_normal.ini ./dmmonitor path=./dmmonitor_normal.ini二、
DW_MODE = AUTO不影响计划内切换。AUTO只决定主库故障时备库是否自动接管,与人工发起switchover无关。实测在 AUTO 模式下执行switchover完全正常。
切换命令会要求二次确认,输入 YES 后才真正执行:
此操作需谨慎, 将会导致主库发生切换, 是否继续使用GRP1.GRP1_RT_01执行SWITCHOVER操作(YES/NO/Y/N)?
YES
切换完成后同样用 show 确认:新的主库 RSTAT 变为 PRIMARY,原主库转为 STANDBY。
六、命令速查
操作系统层面:
# 找到监视器进程与配置路径
ps -ef | grep dmmonitor
# 确认本机软件安装目录(可执行文件在它的 bin/ 下)
echo $DM_HOME
# 连上监视器($DM_HOME/bin/dmmonitor,路径换成你自己环境的)
/data/dmdata/bin/dmmonitor /data/dmdata/dmmon/DAMENG/dmmonitor_auto.ini
监视器交互界面内([monitor] 提示符下):
| 命令 | 作用 | 是否需要先登录 |
|---|---|---|
show | 查看各实例状态(STATUS / RSTAT / FLSN / CLSN) | 不需要 |
tip | 查看监视器与实例的详细诊断信息 | 不需要 |
login | 登录监视器(管理操作的前置) | — |
stop group | 停止整个守护组(先主后备) | 需要 |
startup group | 启动整个守护组(先主后备) | 需要 |
switchover | 计划内主备切换 | 需要 |
七、四个容易踩的坑
一、把监视器命令敲到了 shell 里。 show、login 这些是监视器内部命令,必须先在 [monitor] 提示符下才能用。在 Linux shell 里敲 show 只会报 command not found。
二、没确认 FLSN/CLSN 就动手。 先分清场景:业务还在跑时,两侧 FLSN/CLSN 有一点差值本来就正常,不必卡着不动;但在停机窗口内(业务已停、无新写入)两侧应当基本一致。若此时仍明显不一致,说明备库有积压没追平,贸然停库会拉长重启后的追平时间,期间集群不可用。先等它追平再操作。
三、忽略了 not in CONFIRM mode 的警告。 这条 TIP 决定了主库真出故障时监视器能不能自动接管。依赖自动切换的话,务必按官方文档把监视器配成 CONFIRM 模式;只做计划内维护,看到它不用紧张。
四、照抄别人环境里的路径。 达梦的安装目录没有唯一答案,/opt/dmdbms、/home/dmdba/dmdbms、/dm8、/u01/dmdbms、/data/dmdata 都见过。唯一不变的是可执行文件一定在安装目录的 bin/ 下。抄命令前先 echo $DM_HOME 确认自己的软件目录,别拿着本文演示环境的 /data/dmdata 硬敲,十有八九会 No such file or directory。
看不到视频的话,顶部那张封面下面有下载链接。