注册
一键自动部署dw
专栏/技术分享/ 文章详情 /

一键自动部署dw

张宇 2026/09/04 101 0 0
摘要

主要步骤
1.node1/node2用dm.sh部署和初始化单机数据库
2.node1跑ssh_trust.sh配置互信
3.node1跑setup_dw.sh配置dw环境
4.支持switchover
5.支持分解为两个独立的单机库
脚本说明

==== 达梦 Data Watch 主备搭建(本地为主、单参数指定备库,dmdba 视角)====
用法: ./${SCRIPT_NAME} <备库IP> [--yes|--status]

  <备库IP>   唯一必填参数:备库主机地址(本机即主库,不可填本机 IP)
  --yes      跳过交互确认,直接搭建
  --precheck 仅做前置检查(非破坏性,FATAL 项会给出解决方法),不搭建
  --status   仅确认运行态(deploy 后随时可重跑,不重搭)
  --postcheck 校验配置文件正确性 + 运行态(搭建后或排障时重跑)
  --plan     只读预演:打印「探测到的环境 vs 将采用的 DW 身份/端口」,不停止/不写入任何实例
  --deconfig 优化回退 Data Watch:停主备 watcher、[同步闸门]确认备库 redo 追平、清除 DW 配置(MAL_INI=0/dmmal/dmwatcher/REALTIME归档)、双节点正常单机 OPEN 重启——两库独立、均含最新数据、不再有 DW 关系(仅改配置,不动数据目录)
  --switchover 主备切换:经 dmmonitor 执行 switchover(login -> switchover <当前STANDBY实例> -> YES),把当前 STANDBY 提升为 PRIMARY(需 --yes 或非交互确认)

身份自适应(默认沿用运行态,无需手填;均可环境变量覆盖):
  - 实例名:自动取运行态 INSTANCE_NAME;主备同名(多为同名单机库默认 DMSERVER)且未指定 env 时,自动分配 GRP1_RT_01/GRP1_RT_02;覆盖 -> DW_PRI_INST / DW_STB_INST
  - OGUID :自动取运行态 OGUID;覆盖 -> DW_OGUID(默认回退 453331)
  - MAL_DW_PORT:自动沿用现有 dmmal.ini;MAL/DW 端口可用 DW_MAL_PRI/DW_MAL_STB/DW_PORT_OV 覆盖

前提:
  - 本机(主) 与 备库IP 均为 dm.sh 初始化的正常实例
  - 以 dmdba 用户运行;本机↔备库 已配置 SSH 密钥互信(免密,无需密码/sshpass)
  - 主备 SYSDBA 密码一致;可用 SYSDBA_PWD 环境变量传入(默认 Dmdba_1234)
  - 备库数据会被主库备份覆盖
  - 核心搭建无需 root;仅 systemd 服务注册需特权:root 直注 / dmdba 配 NOPASSWD sudo 直注 /
    非 sudoer 则跳过并仅打印 root 命令(集群仍可运行,重启后不会自动拉起)

实施过程

[dmdba@vm1 ~]$ sh setup_dw.sh 192.168.56.102
[INFO]  09:29:45 探测主(本机)/备(192.168.56.102) DM 环境 ...
[INFO]  09:29:46 路径探测: 主 arch=/app/dmdbms/data/arch bak=/app/dmdbms/data/DAMENG/bak | 备 arch=/u01/app/dmdbms/data/arch bak=/u01/app/dmdbms/data/DAMENG/bak
[INFO]  09:29:46 主库出口 IP(供 MAL): 192.168.56.101
[INFO]  09:29:46 主: /app/dmdbms | /app/dmdbms/data/DAMENG | 实例=? | 运行=yes
[INFO]  09:29:46 备: /u01/app/dmdbms | /u01/app/dmdbms/data/DAMENG | 实例=? | 运行=yes
[INFO]  09:29:46 身份(自适应): 主实例=DMSERVERVM1 备实例=DMSERVERVM2 OGUID=453331 MAL_DW_PORT=52141 DW_PORT=5237

▶ 开始搭建 Data Watch(GRP1,模式=MANUAL,类型=GLOBAL)
[WARN]  09:29:46 备库数据将被主库备份覆盖;主备实例名沿用 DMSERVERVM1 / DMSERVERVM2(可被 DW_PRI_INST / DW_STB_INST 环境变量覆盖)
确认继续?[yes/N] yes

▶ 前置检查 precheck(逐项核对搭建前提,FATAL 将阻断并给出解决方法)
✓ 运行用户: dmdba(推荐)
✓ 备库 SSH 密钥互信可达(dmdba@192.168.56.102)
✓ [PRI] 关键二进制齐全: /app/dmdbms/bin
✓ [STB] 关键二进制齐全: /u01/app/dmdbms/bin
✓ [PRI] dm.ini 可写: /app/dmdbms/data/DAMENG/dm.ini
✓ [STB] dm.ini 可写: /u01/app/dmdbms/data/DAMENG/dm.ini
✓ [PRI] SYSDBA 密码连接成功(LISTEN_IP+端口+密码均正确)
✓ [STB] SYSDBA 密码连接成功(LISTEN_IP+端口+密码均正确)
✓ [PRI] DW 端口无外部冲突: 5237 61141 61142 52141 52142
✓ [STB] DW 端口无外部冲突: 5237 61141 61142 52141 52142
[INFO]  09:31:01        主节点数据目录剩余: 64317MB   备节点: 49825MB
[INFO]  09:31:01        主库版本: --03151060506-20260417-322930-20218   备库版本: --03151060506-20260417-322930-20218
[WARN]  09:31:01 [WARN] 本机 dmdba 非 sudoer 且无 root:systemd 服务注册将跳过,集群不会开机自启
[WARN]  09:31:01        解决(二选一): ①以 root 手动执行搭建末尾打印的注册命令;
[WARN]  09:31:01                     ②配置 dmdba NOPASSWD sudo: visudo 追加  dmdba ALL=(ALL) NOPASSWD: /app/dmdbms/bin/dm_service_installer.sh
✓ 双节点 dmap 运行中(加密备份前置)

✓ 前置检查通过(WARN 项不阻断;如需开机自启请按特权提示处理)
[INFO]  09:31:01 [本机/主] 停止数据库 ...
[INFO]  09:31:10 [备] 停止数据库 ...
[INFO]  09:31:22 已尝试确保备库 dmap 运行

▶ 主库(本机)离线一致性备份(dmrman 离线全备,停库态,规避联机备份需归档集的限制)
[INFO]  09:31:22 [本机] dmrman 离线全备 -> /app/dmdbms/data/DAMENG/bak/dw_bak
BACKUP DATABASE '/app/dmdbms/data/DAMENG/dm.ini' FULL BACKUPSET '/app/dmdbms/data/DAMENG/bak/dw_bak';
Processing backupset /app/dmdbms/data/DAMENG/bak/dw_bak
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:04][Remaining:00:00:00]
backup successfully!
[INFO]  09:31:27 直传备份到备库 192.168.56.102:/u01/app/dmdbms/data/DAMENG/bak/dw_bak(利用主备 SSH 互信)...
✓ 备库备份集 CHECK BACKUPSET 通过
[INFO]  09:31:29 备份已传至备库

▶ 备库恢复(主备同 OGUID、异 DB_MAGIC,构成合法主备对)
[WARN]  09:31:29 备库 /u01/app/dmdbms/data/DAMENG 现有数据将被主库备份覆盖
/tmp/dw_restore.txt
RESTORE DATABASE '/u01/app/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/u01/app/dmdbms/data/DAMENG/bak/dw_bak';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:03][Remaining:00:00:00]
restore successfully.
RECOVER DATABASE '/u01/app/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/u01/app/dmdbms/data/DAMENG/bak/dw_bak';
recover successfully!
RECOVER DATABASE '/u01/app/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
recover successfully!
[INFO]  09:31:36 备库恢复完成

▶ 写入 DW 配置(dm.ini / dmmal.ini / dmarch.ini / dmwatcher.ini)
[INFO]  09:32:41 双节点配置写入完成
[INFO]  09:32:41 [本机/主] MOUNT -> 设 OGUID=453331 -> PRIMARY -> OPEN
[INFO]  09:32:41 [本机/主] 以 MOUNT 状态启动 dmserver ...
STARTED
已用时间: 46.048(毫秒). 执行号:101.
SQL>
已用时间: 137.740(毫秒). 执行号:0.
SQL>
已用时间: 0.290(毫秒). 执行号:0.
SQL>
[INFO]  09:32:52 [备] MOUNT -> 设 OGUID=453331 -> STANDBY -> OPEN
[INFO]  09:32:52 [备] 以 MOUNT 状态启动 dmserver ...
STARTED
已用时间: 27.128(毫秒). 执行号:101.
SQL>
已用时间: 113.775(毫秒). 执行号:0.
SQL>
已用时间: 2.785(毫秒). 执行号:0.
SQL>
[INFO]  09:32:56 [本机/主] 启动 dmwatcher ...
OK
[INFO]  09:32:56 [备] 启动 dmwatcher ...
OK
[INFO]  09:32:57 搭建流程结束,执行部署后配置与状态确认 ...

▶ 部署后配置(守护监视器 + 服务注册 + 总览)
[INFO]  09:32:58 守护监视器配置: /app/dmdbms/data/DAMENG/dmmonitor.ini(备库同份已同步;运行: /app/dmdbms/bin/dmmonitor /app/dmdbms/data/DAMENG/dmmonitor.ini)
[WARN]  09:32:58 [local] 未找到 /app/dmdbms/bin/dm_service_installer.sh,跳过 dmserver 服务注册
[WARN]  09:32:58 [local] 未找到 /app/dmdbms/bin/dm_service_installer.sh,跳过 dmwatcher 服务注册
[INFO]  09:35:07 [remote] (sudo) 注册 dmserver 服务(DMSERVERVM2) ...
✓ [remote] dmserver 服务注册完成
[INFO]  09:38:21 [remote] (sudo) 注册 dmwatcher 服务(DMSERVERVM2_watcher) ...
✓ [remote] dmwatcher 服务注册完成

▶ 部署完成总览
  主库 : 192.168.56.101:5236    实例=DMSERVERVM1    角色=PRIMARY
  备库 : 192.168.56.102:5236  实例=DMSERVERVM2    角色=STANDBY
  OGUID=453331  MAL端口=61141/61142  DW端口=52141/52142
  归档 : 实时(REALTIME→对端) + 本地(LOCAL, /app/dmdbms/data/arch;备=/u01/app/dmdbms/data/arch)  备份集根目录: 主=/app/dmdbms/data/DAMENG/bak 备=/u01/app/dmdbms/data/DAMENG/bak
  监视器: /app/dmdbms/data/DAMENG/dmmonitor.ini

▶ 部署后配置校验 postcheck(配置文件正确性 + 运行态)
--- 配置项校验(通用 DW 不变量 + 内部一致性,不绑定特定实例名/端口) ---
✓ [PRI] dm.ini: MAL_INI=1 ARCH_INI=1 DW_PORT 已设 ALTER_MODE_STATUS∈{1,2} INSTANCE_NAME=DMSERVERVM1
✓ [PRI] dmmal.ini: 2 个 MAL 实例、MAL_DW_PORT 已设,且含本节点实例名=DMSERVERVM1
✓ [PRI] dmarch.ini: 含 REALTIME 实时归档
✓ [PRI] dmwatcher.ini: DW_TYPE=GLOBAL INST_OGUID=453331 与运行态一致 启动命令正确
✓ [STB] dm.ini: MAL_INI=1 ARCH_INI=1 DW_PORT 已设 ALTER_MODE_STATUS∈{1,2} INSTANCE_NAME=DMSERVERVM2
✓ [STB] dmmal.ini: 2 个 MAL 实例、MAL_DW_PORT 已设,且含本节点实例名=DMSERVERVM2
✓ [STB] dmarch.ini: 含 REALTIME 实时归档
✓ [STB] dmwatcher.ini: DW_TYPE=GLOBAL INST_OGUID=453331 与运行态一致 启动命令正确
✓ 本机 dmmonitor.ini: MON_INST_OGUID=453331 与运行态一致,且含 2 行 MON_DW_IP


▶ Data Watch 状态确认
✓ [主] 实例状态: OPEN(STATUS$=4)
✓ [备] 实例状态: OPEN(STATUS$=4)
✓ 角色: 本机=PRIMARY 对端=STANDBY(一主一备,正常)
✓ OGUID: 主=453331 备=453331 与配置(453331)一致
✓ [主] 实时归档(REALTIME)目标: VALID(MAL 链路正常)
✓ [备] 实时归档(REALTIME)目标: VALID(MAL 链路正常)
✓ [主] dmwatcher 进程: 运行中
✓ [备] dmwatcher 进程: 运行中

✓ Data Watch 状态确认通过:主备 OPEN、OGUID 一致、实时归档(REALTIME)有效、watcher 运行中

✓ postcheck 通过:配置文件正确且运行态健康

脚本地址

http://godba.cn:5000/sharing/yhg0rXKE4
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服