DM8 数据守护主备集群
DM8 数据守护主备集群
—— 虚拟机环境准备 · 集群搭建 · 测试验证 ——
2026 年 8 月 19 日
目 录
第一章 虚拟机操作系统环境准备
1.1 物理主机与虚拟机规划
达梦数据库主备集群项目的物理主机要求为 16G+内存、CPU 8 线程、500G+ 硬盘空间,虚拟化平台采用 VMware Workstation 15+。整体环境包括 1 台 Windows 2019 管理机和 2 台 RHEL 7.6 数据库服务器。
|
主机名 |
IP 地址 |
内存 |
CPU |
磁盘 |
|
|
RHEL 主库节点 |
DMW81 |
**.**.2.81 / **.**.10.81 |
4G |
2C |
100G |
|
RHEL 备库节点 |
DMW82 |
**.**.2.82 / **.**.10.82 |
4G |
2C |
100G |
|
RHEL 监视器节点 |
DMW83 |
**.**.2.83 / **.**.10.83 |
4G |
2C |
100G |
1.1.1 虚拟机节点规划
1.2 磁盘与分区配置(LVM)
采用 LVM 逻辑卷管理方式对磁盘进行规范化分区,将不同用途的数据分散到独立的卷组中,便于后续空间管理和性能优化。
1.2.1 创建物理卷与卷组
# 创建物理卷
pvcreate /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 创建卷组(按用途划分)
vgcreate dmappvg /dev/sdb # 应用程序卷组
vgcreate dmdatavg /dev/sdc # 数据文件卷组
vgcreate dmlogvg /dev/sdd # 归档日志卷组
vgcreate dmbakvg /dev/sde # 备份文件卷组
# 创建逻辑卷
lvcreate -n dmapplv -L 99G dmappvg
lvcreate -n dmdatalv -L 100G dmdatavg
lvcreate -n dmloglv -L 100G dmlogvg
lvcreate -n dmbaklv -L 100G dmbakvg
# 查看验证
pvs
vgs vgdisplay
lvs lvdisplay
1.2.2 格式化与挂载
# 格式化逻辑卷为 xfs 文件系统
mkfs.xfs /dev/dmappvg/dmapplv
mkfs.xfs /dev/dmdatavg/dmdatalv
mkfs.xfs /dev/dmlogvg/dmloglv
mkfs.xfs /dev/dmbakvg/dmbaklv
# 创建达梦对应挂载目录
mkdir -p /dm/dmdbms
mkdir -p /dm/dmdata
mkdir -p /dm/dmarch
mkdir -p /dm/dmback
# 挂载分区至对应目录
mount /dev/dmappvg/dmapplv /dm/dmdbms
mount /dev/dmdatavg/dmdatalv /dm/dmdata
mount /dev/dmlogvg/dmloglv /dm/dmarch
mount /dev/dmbakvg/dmbaklv /dm/dmback
# 查看磁盘挂载情况
df -h
# 编辑开机自动挂载配置文件
vi /etc/fstab
# 写入以下持久挂载配置
/dev/dmappvg/dmapplv /dm/dmdbms xfs defaults 0 0
/dev/dmdatavg/dmdatalv /dm/dmdata xfs defaults 0 0
/dev/dmlogvg/dmloglv /dm/dmarch xfs defaults 0 0
/dev/dmbakvg/dmbaklv /dm/dmback xfs defaults 0 0
1.3 操作系统环境配置
1.3.1 hosts 主机名解析
# 追加IP与主机名映射到hosts文件
echo "**.**.2.82 DMW82" >> /etc/hosts
cat /etc/hosts
1.3.2 配置语言环境
# 配置英文UTF-8字符集,避免数据库中文乱码
echo "export LANG=en_US.UTF8" >> ~/.bash_profile
cat ~/.bash_profile
1.3.3 修改资源限制参数
修改 /etc/security/limits.conf 文件,为 root 和 dmdba 用户设置文件句柄数、进程数和栈大小限制:
vi /etc/security/limits.conf
# root用户文件句柄限制
root soft nofile 1048576
root hard nofile 1048576
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft stack 65536
dmdba hard stack 65536
# 修改全局进程数限制配置文件(覆盖配置,所有用户最大进程数65535)
echo "* - nproc 65536" > /etc/security/limits.d/90-nproc.conf
1.3.4 设置系统安全策略
1)关闭 SELinux:
# 永久关闭SELinux配置
echo "SELINUX=disabled" > /etc/selinux/config
echo "SELINUXTYPE=targeted" >> /etc/selinux/config
cat /etc/selinux/config
setenforce 0
2)关闭防火墙 firewalld:
# 查看防火墙运行状态
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
3)资源限制 PAM 认证加载(使 limits.conf 参数登录生效):
# 追加pam_limits模块到登录PAM配置
echo "session required pam_limits.so" >> /etc/pam.d/login
cat /etc/pam.d/login
1.3.5 关闭透明大页与 NUMA
# 编辑grub内核启动参数
vi /etc/default/grub
# 修改内核启动行,添加 numa=off transparent_hugepage=never
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off transparent_hugepage=never elevator=deadline"
# 更新grub引导配置(RHEL7系列)
grub2-mkconfig -o /etc/grub2.cfg
# 校验NUMA状态
numastat
numactl --show
numactl --hardware
# 重启服务器使内核参数生效
shutdown -r now
1.3.6 IO 调度算法
对于 SAS 磁盘设置为 deadline 调度算法,对于 SSD 磁盘设置为 NOOP 调度算法。官方推荐方式是在 grub 内核参数中永久设置 elevator=deadline(已在上一节中配置)。
# 查看当前IO调度算法
cat /sys/block/sd*/queue/scheduler
# SAS磁盘临时设置
echo 'deadline' > /sys/block/sd*/queue/scheduler
# SSD磁盘临时设置
echo 'NOOP' > /sys/block/sd*/queue/scheduler
1.3.7 修改内核参数
编辑 /etc/sysctl.conf 文件,配置数据库运行所需的内核参数:
vi /etc/sysctl.conf
fs.aio-max-nr = 1048576 # 异步IO最大并发数
fs.file-max = 6815744 # 系统全局最大打开文件句柄数
net.ipv4.ip_local_port_range = 1024 65535 # 客户端可用本地端口范围
net.core.rmem_default = 262144 # TCP接收缓冲区默认值
net.core.rmem_max = 4194304 # TCP接收缓冲区最大值
net.core.wmem_default = 262144 # TCP发送缓冲区默认值
net.core.wmem_max = 1048586 # TCP发送缓冲区最大值
vm.overcommit_memory = 0 # 严格禁止超分配,避免OOM
vm.swappiness = 1 # 降低swap使用倾向
vm.min_free_kbytes = 51200 # 系统最小空闲内存(测试环境)
# 生效内核参数
sysctl -p
注:生产环境中 vm.min_free_kbytes 建议设置为 512000,具体根据实际情况处理,以确保系统有足够的空闲内存预留。
1.3.8 yum 源环境配置
# 挂载光盘
mount /dev/cdrom /mnt
# 配置本地yum源
cd /etc/yum.repos.d
mkdir bk
mv *.repo bk/
echo "[EL7]" >> itpux.repo
echo "name = linux 7.6 dvd" >> itpux.repo
echo "baseurl=file:///mnt" >> itpux.repo
echo "gpgcheck=0" >> itpux.repo
echo "enabled=1" >> itpux.repo
# 安装必要软件包
yum install glib* vnc* -y
1.3.9 创建用户与目录
# 创建达梦数据库用户组与用户
groupadd -g 66000 dinstall
useradd -u 66000 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
echo "****" | passwd --stdin dmdba
# 创建安装目录并设置权限
mkdir /dm/dmdbms/dm8
chown -R dmdba:dinstall /dm
chmod -R 775 /dm
1.3.10 配置环境变量
su - dmdba
vi ~/.bash_profile
export LANG=zh_CN.UTF8
export DM_INSTALL_TMPDIR=/tmp
export DM_HOME=/dm/dmdbms/dm8
export PATH=$DM_HOME/bin:$PATH:$HOME/bin
source ~/.bash_profile
第二章 达梦数据库安装与实例初始化
2.1 上传与安装 DM 数据库
将 DM8 安装 ISO 镜像上传至服务器后,以 root 用户执行挂载和安装操作。安装需在主库节点(**.**.2.81)、备库节点(**.**.2.82)和监视器节点(**.**.2.83)上分别执行。
# root用户执行:卸载原有挂载,挂载DM安装ISO镜像
umount /mnt
mount -o loop /dm/dmdbms/dm8_setup_rh7_64_ent_8.1.1.48_20191129.iso /mnt
# 切换dmdba用户执行安装
cd /mnt
./DMInstall.bin -i
# 安装结束后,以root用户注册DMAP备份辅助服务
cd /dm/dmdbms/dm8/script/root/
./dm_service_installer.sh -t dmap
2.2 命令行初始化实例
在主库节点 **.**.2.81 上使用 dminit 工具初始化数据库实例:
# 使用dminit创建数据库实例
./dminit path=/dm/dmdata db_name=DMOA instance_name=DMOA1 \
port_num=15236 LOG_SIZE=256 \
SYSDBA_PWD=**** SYSAUDITOR_PWD=**** \
PAGE_SIZE=32 EXTENT_SIZE=16 charset=1
初始化参数说明:
|
参数 |
值 |
说明 |
|
path |
/dm/dmdata |
数据库文件存放路径 |
|
db_name |
DMOA |
数据库名称 |
|
instance_name |
DMOA1 |
实例名称(主库为DMOA1,备库为DMOA2) |
|
port_num |
15236 |
数据库实例监听端口 |
|
LOG_SIZE |
256 |
日志文件大小(MB),共2个 |
|
PAGE_SIZE |
32 |
页大小(KB) |
|
EXTENT_SIZE |
16 |
簇大小(页数) |
|
charset |
1 |
字符集:1=UTF-8 |
|
SYSDBA_PWD |
**** |
SYSDBA用户密码 |
2.3 注册与启动数据库服务
# root用户注册服务
cd /dm/dmdbms/dm8/script/root/
./dm_service_installer.sh -t dmserver -dm_ini /dm/dmdata/DMOA/dm.ini -p DMOA -m mount
# 设置开机自启
systemctl enable DmServiceDMOA
# 启动数据库服务
su - dmdba
DmServiceDMOA start
# 也可以前台启动(调试用)
./dmserver /dm/dmdata/DMOA/dm.ini
# 后台启动
nohup dmserver /dm/dmdata/DMOA/dm.ini &
2.4 实例参数优化
使用 SF_SET_SYSTEM_PARA_VALUE 内置函数对实例参数进行优化配置(实际根据生产资源需要进行修改):
disql sysdba/****@**.**.2.81:15236
call SF_SET_SYSTEM_PARA_VALUE('MAX_OS_MEMORY', 95, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('MAX_SESSIONS', 1000, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('MAX_SESSION_STATEMENT', 5000, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('BUFFER', 1024, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('BUFFER_POOLS', 2, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('RECYCLE', 512, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('RECYCLE_POOLS', 1, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('HJ_BUF_GLOBAL_SIZE', 500, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('HJ_BUF_SIZE', 300, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('DICT_BUF_SIZE', 50, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('TEMP_SIZE', 200, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('VM_POOL_SIZE', 256, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('SESS_POOL_SIZE', 256, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('CACHE_POOL_SIZE', 200, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('WORKER_THREADS', 2, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('TASK_THREADS', 2, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('USE_PLN_POOL', 1, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('OLAP_FLAG', 2, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('OPTIMIZER_MODE', 1, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('VIEW_PULLUP_FLAG', 1, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('COMPATIBLE_MODE', 2, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('ENABLE_MONITOR', 0, 1, 2);
call SF_SET_SYSTEM_PARA_VALUE('SVR_LOG', 0, 1, 2);
SF_SET_SYSTEM_PARA_VALUE 函数参数说明:
|
参数位置 |
含义 |
取值说明 |
|
第1参数 |
参数名称 |
如 BUFFER、MAX_SESSIONS 等 |
|
第2参数 |
值/比例 |
参数的具体设定值 |
|
第3参数 |
scope 范围 |
0=会话级(重启失效);1=系统级(写入dm.ini,永久生效) |
|
第4参数 |
type 类型 |
1=动态参数(立即生效);2=静态参数(需重启实例生效) |
2.5 开启归档模式
归档模式是主备集群搭建的前提条件,需在主库上先开启归档再配置归档路径。支持两种方式:命令行方式和修改配置文件方式。
2.5.1 方式一:SQL 命令行开启归档
-- 一条一条执行,要先开启归档才能配置路径
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/dm/dmarch/DMOA,TYPE=local,FILE_SIZE=256,SPACE_LIMIT=0';
ALTER DATABASE OPEN;
-- 验证归档状态
SELECT ARCH_MODE FROM V$DATABASE;
SELECT * FROM V$DM_ARCH_INI;
2.5.2 方式二:修改配置文件开启归档
# 1. 停止数据库服务
systemctl stop DmServiceDMOA
# 2. 修改dm.ini中的归档配置参数
vi /dm/dmdata/DMOA/dm.ini
# 设置 ARCH_INI = 1
# 3. 创建归档目录
mkdir -p /dm/dmarch
chown -R dmdba:dinstall /dm/dmarch
# 4. 创建归档配置文件 dmarch.ini(与dm.ini同目录)
vi /dm/dmdata/DMOA/dmarch.ini
[ARCH_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/dmarch # 归档存放目录
ARCH_FILE_SIZE = 1024 # 单个归档文件大小,单位MB
ARCH_SPACE_LIMIT = 10240 # 归档总上限10G(10240MB)
# 5. 重启数据库使归档模式生效
su - dmdba
/dm/dmdbms/dm8/bin/dmserver /dm/dmdata/DMOA/dm.ini
# 6. 验证
SELECT ARCH_MODE FROM V$DATABASE;
第三章 DM 主备数据守护集群规划
3.1 集群概念
DM 数据守护(DMDataWatch)是达梦数据库提供的高可用方案,通过主库实时同步 Redo 日志到备库,实现数据的实时备份与故障自动切换。结合 DMRWC(读写分离集群),可在保证数据一致性的同时将读请求分流到备库,提升系统整体吞吐能力。
本次搭建的集群架构为:1 主 + 1 备 + 1 监控,共 3 台主机。主库负责读写操作,备库实时同步数据并可作为只读节点,监视器负责监控集群状态并在故障时执行自动切换。
3.2 端口规划
|
实例名 |
PORT_NUM |
MAL_INST_HOST |
MAL_INST_PORT |
MAL_INST_DW_PORT |
MAL_DW_PORT |
MAL_HOST |
MAL_PORT |
|
DMOA1 |
15236 |
**.**.2.81 |
15236 |
15237 |
15238 |
**.**.2.81 |
15239 |
|
DMOA2 |
25236 |
**.**.2.82 |
25236 |
25237 |
25238 |
**.**.2.82 |
25239 |
各端口含义说明:
|
端口号/参数 |
说明 |
|
PORT_NUM |
数据库实例对外服务端口,客户端 JDBC、disql 访问数据库使用 |
|
MAL_INST_HOST |
实例的对外服务 IP 地址 |
|
MAL_INST_PORT |
实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 |
|
MAL_INST_DW_PORT |
实例监听守护进程 TCP 连接的端口(本地 dmserver 监听本地 dmwatcher) |
|
MAL_HOST |
MAL 系统监听 TCP 连接的 IP 地址 |
|
MAL_PORT |
MAL 系统监听 TCP 连接的端口(主备实例间日志传输、消息交互) |
|
MAL_DW_PORT |
实例对应的守护进程监听 TCP 连接的端口(dmwatcher 之间通信) |
|
OGUID |
守护集群全局唯一标识,集群所有节点必须完全一致(本次为 453331) |
|
GRP1 |
守护组名称,同一个守护组内节点参与主备切换 |
配置注意事项:
1. 两个节点端口可以相同(IP 不同即可),这是达梦主备守护集群标准配置。
2. 防火墙需放行所有相关 TCP 端口,确保主备节点之间互通。
3. OGUID 必须两边完全一致,修改 dm.ini 后需保证 ALTER SYSTEM SET OGUID 同步设置。
4. dmmal.ini、dmwatcher.ini 中的端口号必须与端口规划表保持一致。
3.3 数据库初始化参数
|
参数 |
设定值 |
|
页大小 |
16K / 32K |
|
簇大小 |
16 页 |
|
字符集 |
默认值GB18030 |
|
大小写敏感 |
是 |
|
数据库名 |
DMOA |
|
实例名 |
DMOA1(主库)、DMOA2(备库) |
|
端口 |
15236(主库)、25236(备库) |
|
日志文件大小 |
共 2 个,每个 256MB |
|
归档模式 |
启用 |
3.4 部署路径规划
|
实例名 |
IP 地址 |
安装路径 |
实例路径 |
归档路径 |
备份路径 |
日志路径 |
|
DMOA1 |
**.**.2.81 |
/dm/dmdbms/dm8 |
/dm/dmdata/DMOA |
/dm/dmarch/DMOA |
/dm/dmback |
/dm/dmdbms/dm8/log |
|
DMOA2 |
**.**.2.82 |
/dm/dmdbms/dm8 |
/dm/dmdata/DMOA |
/dm/dmarch/DMOA |
/dm/dmback |
/dm/dmdbms/dm8/log |
|
监视器 |
**.**.2.83 |
/dm/dmdbms/dm8 |
— |
— |
— |
/dm/dmdbms/dm8/log |
第四章 DM 主备集群搭建
4.1 主库实例创建与配置
在主库节点 **.**.2.81 上创建数据库实例并启动:
# dmdba用户执行
cd /dm/dmdbms/dm8/bin
./dminit path=/dm/dmdata db_name=DMOA instance_name=DMOA1 \
port_num=15236 LOG_SIZE=256 \
SYSDBA_PWD=**** SYSAUDITOR_PWD=**** \
PAGE_SIZE=32 EXTENT_SIZE=16 charset=1
# 启动实例
./dmserver /dm/dmdata/DMOA/dm.ini
4.2 主库数据备份
正常关闭主库后,使用 DMRMAN 进行脱机全量备份:
# 关闭数据库
DmServiceDMOA stop
# 使用DMRMAN脱机备份
cd /dm/dmdbms/dm8/bin
./dmrman
backup database '/dm/dmdata/DMOA/dm.ini' full to DMOA_full01 \
backupset '/dm/dmback/DMOA_full01';
# 将备份集拷贝到备机
scp -r /dm/dmback/DMOA_full01 **.**.2.82:/dm/dmback
图4.2-1 备份
图4.2-2 拷贝到备机
4.3 备库实例创建与数据恢复
在备库节点 **.**.2.82 上创建实例并从主库备份集恢复数据:
# dmdba用户执行
cd /dm/dmdbms/dm8/bin
# 初始化备库实例
./dminit path=/dm/dmdata db_name=DMOA instance_name=DMOA2 \
port_num=25236 LOG_SIZE=256 \
SYSDBA_PWD=**** SYSAUDITOR_PWD=**** \
PAGE_SIZE=32 EXTENT_SIZE=16 charset=1
# 使用DMRMAN还原、恢复、修改魔数
./dmrman
restore database '/dm/dmdata/DMOA/dm.ini' from backupset '/dm/dmback/DMOA_full01'
recover database '/dm/dmdata/DMOA/dm.ini' from backupset '/dm/dmback/DMOA_full01'
recover database '/dm/dmdata/DMOA/dm.ini' update db_magic
DB_MAGIC(数据库魔数)说明:
DB_MAGIC 是数据库控制页内的运行时标识,每次还原恢复后必须换新值。其作用是:
1. 区分备份源库和还原出来的目标库;
2. 确认当前数据库文件已处于数据一致状态;
3. 给数据库生成全新 DB_MAGIC 魔数;
4. 修改控制页内部状态,标记数据库“恢复完成,允许打开启动”;
5. 切断和原备份库归档日志的继承关系。
如果不执行 update db_magic,数据库直接启动会报错拒绝打开。
图4.3-1 还原恢复修改魔数
4.4 主库配置参数
在主库节点 **.**.2.81 上修改以下 4 个配置文件:
4.4.1 dm.ini(主库)
su - dmdba
cd /dm/dmdata/DMOA
vi dm.ini
INSTANCE_NAME = DMOA1 # 主库实例名
PORT_NUM = 15236 # 数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 # 不允许备库OFFLINE表空间
MAL_INI = 1 # 打开MAL系统
ARCH_INI = 1 # 打开归档配置
RLOG_SEND_APPLY_MON = 64 # 统计最近64次的日志发送信息
4.4.2 dmmal.ini(主备库相同)
vi dmmal.ini
MAL_CHECK_INTERVAL = 5 # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 # 判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMOA1 # 实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = **.**.2.81 # MAL系统监听TCP连接的IP地址
MAL_PORT = 15239 # MAL系统监听TCP连接的端口
MAL_INST_HOST = **.**.2.81 # 实例的对外服务IP地址
MAL_INST_PORT = 15236 # 实例的对外服务端口,和PORT_NUM一致
MAL_INST_DW_PORT = 15237 # 实例监听守护进程TCP连接的端口
MAL_DW_PORT = 15238 # 守护进程监听TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = DMOA2
MAL_HOST = **.**.2.82
MAL_PORT = 25239
MAL_INST_HOST = **.**.2.82
MAL_INST_PORT = 25236
MAL_INST_DW_PORT = 25237
MAL_DW_PORT = 25238
4.4.3 dmarch.ini(主库)
主库的 ARCH_DEST 配置为备库实例名 DMOA2:
vi dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档类型
ARCH_DEST = DMOA2 # 实时归档目标实例名(指向备库)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /dm/dmarch/DMOA # 本地归档文件存放路径
ARCH_FILE_SIZE = 256 # 单个归档文件最大值(MB)
ARCH_SPACE_LIMIT = 0 # 归档总上限,0表示无限制
4.4.4 dmwatcher.ini(主备库相同)
vi dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL # 全局守护类型
DW_MODE = AUTO # 自动切换模式
DW_ERROR_TIME = 10 # 远程守护进程故障认定时间
INST_RECOVER_TIME = 60 # 主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 # 本地实例故障认定时间
INST_OGUID = 453331 # 守护系统唯一OGUID值
INST_INI = /dm/dmdata/DMOA/dm.ini # dm.ini配置文件路径
INST_AUTO_RESTART = 1 # 打开实例的自动启动功能
#INST_STARTUP_CMD = /dm/dmdbms/dm8/bin/dmserver # 命令行方式启动
INST_STARTUP_CMD = /dm/dmdbms/dm8/bin/DmServiceDMOA start # 实际需要以服务方式启动
RLOG_SEND_THRESHOLD = 0 # 主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 # 备库重演日志的时间阀值,默认关闭
4.5 备库配置参数
在备库节点 **.**.2.82 上修改配置文件。dmmal.ini 和 dmwatcher.ini 与主库相同,dm.ini 中实例名和端口不同,dmarch.ini 中 ARCH_DEST 指向主库 DMOA1。
4.5.1 dm.ini(备库)
su - dmdba
cd /dm/dmdata/DMOA
vi dm.ini
INSTANCE_NAME = DMOA2 # 备库实例名
PORT_NUM = 25236 # 数据库实例监听端口
DW_PORT = 25237 # 守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 # 接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 # 不允许备库OFFLINE表空间
MAL_INI = 1 # 打开MAL系统
ARCH_INI = 1 # 打开归档配置
HA_INST_CHECK_FLAG = 1 # 检测是否多个实例进程同时启动
4.5.2 dmarch.ini(备库)
备库的 ARCH_DEST 配置为主库实例名 DMOA1:
vi dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档类型
ARCH_DEST = DMOA1 # 实时归档目标实例名(指向主库)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /dm/dmarch/DMOA # 本地归档文件存放路径
ARCH_FILE_SIZE = 256 # 单个归档文件最大值(MB)
ARCH_SPACE_LIMIT = 0 # 归档总上限,0表示无限制
RLOG_SEND_APPLY_MON = 64 # 统计最近64次的日志发送信息
4.6 主库注册服务与配置 OGUID
在主库节点 **.**.2.81 上执行以下操作:
# root用户注册服务
cd /dm/dmdbms/dm8/script/root/
./dm_service_installer.sh -t dmserver -dm_ini /dm/dmdata/DMOA/dm.ini -p DMOA
./dm_service_installer.sh -t dmwatcher -watcher_ini /dm/dmdata/DMOA/dmwatcher.ini -p DMOA -m mount
# dmdba用户以mount方式启动实例
su - dmdba
cd /dm/dmdbms/dm8/bin
./dmserver /dm/dmdata/DMOA/dm.ini mount
# 另开窗口,连接数据库配置OGUID和主库模式
disql SYSDBA/****@**.**.2.81:15236
SELECT STATUS$ FROM V$DATABASE;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); -- 临时允许修改模式/状态
SP_SET_OGUID(453331); -- 设置OGUID
ALTER DATABASE PRIMARY; -- 修改为PRIMARY模式
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); -- 恢复不允许修改
EXIT;
4.7 备库注册服务与配置 OGUID
在备库节点 **.**.2.82 上执行以下操作:
# root用户注册服务
cd /dm/dmdbms/dm8/script/root/
./dm_service_installer.sh -t dmserver -dm_ini /dm/dmdata/DMOA/dm.ini -p DMOA
./dm_service_installer.sh -t dmwatcher -watcher_ini /dm/dmdata/DMOA/dmwatcher.ini -p DMOA -m mount
# dmdba用户以mount方式启动实例
su - dmdba
cd /dm/dmdbms/dm8/bin
./dmserver /dm/dmdata/DMOA/dm.ini mount
# 另开窗口,连接数据库配置OGUID和备库模式
disql SYSDBA/****@**.**.2.82:25236
SELECT STATUS$ FROM V$DATABASE;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); -- 临时允许修改模式/状态
SP_SET_OGUID(453331); -- 设置OGUID(与主库一致)
ALTER DATABASE STANDBY; -- 修改为STANDBY模式
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); -- 恢复不允许修改
EXIT;
4.8 启动守护进程
配置完成后,分别在主库和备库启动守护进程和服务:
# ===== 主库 **.**.2.81 =====
su - dmdba
cd /dm/dmdbms/dm8/bin
DmServiceDMOA start
DmWatcherServiceDMOA start
# 验证进程
ps -ef | grep dmserver
ps -ef | grep dmwatcher
# ===== 备库 **.**.2.82 =====
su - dmdba
cd /dm/dmdbms/dm8/bin
DmServiceDMOA start
DmWatcherServiceDMOA start
# 验证进程
ps -ef | grep dmserver
ps -ef | grep dmwatcher
第五章 监视器配置与启动
5.1 监视器配置文件
在监视器节点 **.**.2.83 上创建 dmmonitor.ini 配置文件:
su - dmdba
mkdir -p /dm/dmdbms/dm8/data
vi /dm/dmdbms/dm8/data/dmmonitor.ini
MON_DW_CONFIRM = 1 # 确认监视器模式
MON_LOG_PATH = /dm/dmdbms/dm8/log # 监视器日志文件存放路径
MON_LOG_INTERVAL = 60 # 每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 # 每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 # 不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 # 组GRP1的唯一OGUID值
MON_DW_IP = **.**.2.81:15238 # 主库守护进程连接信息
MON_DW_IP = **.**.2.82:25238 # 备库守护进程连接信息
MON_DW_IP 的 IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT。
5.2 注册与启动监视器服务
# root用户注册监视器服务
su - root
cd /dm/dmdbms/dm8/script/root
./dm_service_installer.sh -t dmmonitor \
-monitor_ini /dm/dmdbms/dm8/data/dmmonitor.ini -p DMOA
# 启动监视器服务
su - dmdba
DmMonitorServiceDMOA start
# 交互式启动监视器(查看集群状态)
/dm/dmdbms/dm8/bin/dmmonitor /dm/dmdbms/dm8/data/dmmonitor.ini
# 停止监视器
DmMonitorServiceDMOA stop
图5.2-1 打开监视器
第六章 集群测试与维护管理
6.1 主备同步测试
在主库上创建表空间、用户和表,插入测试数据后,在备库上验证数据是否已实时同步。
6.1.1 主库操作
# 连接主库
disql SYSDBA/****@**.**.2.81:15236
# 创建表空间
CREATE TABLESPACE dmoa DATAFILE '/dm/dmdata/dmoa/dmoa01.dbf' SIZE 50 AUTOEXTEND OFF;
CREATE TABLESPACE dmoa_idx DATAFILE '/dm/dmdata/dmoa/dmoa_idx01.dbf' SIZE 10 AUTOEXTEND OFF;
# 创建用户
CREATE USER "dmoa" IDENTIFIED BY "****"
DEFAULT TABLESPACE dmoa DEFAULT INDEX TABLESPACE dmoa_idx;
GRANT DBA TO dmoa;
# 查看数据文件路径
SELECT PATH FROM V$DATAFILE;
# 切换用户创建表并插入数据
CONN dmoa/****@**.**.2.81:15236;
CREATE TABLE dmoa (id INT, name VARCHAR(50), create_date DATE);
INSERT INTO dmoa VALUES (1, '张三', '2026-07-30');
INSERT INTO dmoa VALUES (2, '李四', '2026-07-30');
COMMIT;
SELECT * FROM dmoa;
SELECT COUNT(*) FROM dmoa;
图6.1.1-1 建表表空间主库插入数据
6.1.2 备库验证
# 连接备库
disql SYSDBA/****@**.**.2.82:25236
# 查看数据文件是否同步
SELECT PATH FROM V$DATAFILE;
# 切换到业务用户查询数据
CONN dmoa/****@**.**.2.82:25236;
SELECT * FROM dmoa.dmoa;
-- 应能看到主库插入的数据:张三、李四
图6.1.1-1 验证备库数据是否能同步(主库需要提交)
6.2 主备切换测试
主备切换测试包括三种场景:正常手工切换、故障自动接管、强制切换。
6.2.1 正常手工切换
在监视器节点上执行 switchover 操作,将备库切换为主库:
# 在监视器83上操作
/dm/dmdbms/dm8/bin/dmmonitor /dm/dmdbms/dm8/data/dmmonitor.ini
# 查看可切换为主机的实例列表
choose switchover grp1
# 执行切换(将DMOA1切换为主库)
switchover grp1.DMOA1
# 登录监视器(切换后需重新登录)
login
sysdba
****
图6.2.1-1手动切换主备
图6.2.1-2 查看主备状态
图6.2.1-3 回切主备状态
图6.2.1-4 查看回切主备状态
图6.2.1-5 回切后看数据是否正常
6.2.2 故障自动接管
通过杀掉主库进程或重启主库来模拟故障,验证备库是否能自动接管:
# 在主库81上制造故障
ps -ef | grep dmserver
kill -9 <dmserver_pid>
# 或直接重启
reboot
# 在监视器83上观察
# 可以看到81主节点故障,备库82自动接管成为主库
# 验证原备库82已成为主库(可写入数据)
disql SYSDBA/****@**.**.2.82:25236
CONN dmoa/****@**.**.2.82:25236;
CREATE TABLE dmoa2(id INT); -- 现在的主库可以写入
INSERT INTO dmoa VALUES (3, '王五', '2026-07-30');
SELECT * FROM dmoa;
# 验证原主库81已成为备库(不可写入)
disql SYSDBA/****@**.**.2.81:15236
CONN dmoa/****@**.**.2.81:15236;
CREATE TABLE dmoa2(id INT); -- 备库无法写入
图6.2.2-1 制造故障
图6.2.2-2 备库接管
6.2.3 强制切换(Takeover)
当主库故障且自动切换未成功时,可通过监视器执行手动接管:
# 在监视器83上操作
show # 展示集群状态
choose takeover grp1 # 查看可接管的实例列表
takeover DMOA1 # 手动接管,确保备库是打开正常的
# 强制切换(极端情况)
choose takeover force grp1 # 查看可强制切换的实例列表
takeover force grp1.DMOA1 # 强制切换
切换命令汇总:
|
命令 |
适用场景 |
说明 |
|
choose switchover GRP1 |
主机正常 |
查看可切换为主机的实例列表 |
|
switchover GRP1.实例名 |
主机正常 |
使用指定实例切换为主机 |
|
choose takeover GRP1 |
主机故障 |
查看可切换为主机的实例列表 |
|
takeover GRP1.实例名 |
主机故障 |
使用指定实例切换为主机 |
|
choose takeover force GRP1 |
强制切换 |
查看可强制切换的实例列表 |
|
takeover force GRP1.实例名 |
强制切换 |
使用指定实例强制切换为主机 |
6.3 恢复故障主机
故障主机恢复后,需将其重新加入集群。有两种方式:
方式一:重启现主库即可达到切换目的,主备都能正常运行。
# 重启现主库82
reboot
# 重启后82变为备库,81恢复为主库(需确保守护进程自动拉起)
方式二:在监视器上执行手工切换。
# 在监视器83上操作
choose switchover grp1 # 查看可切换的实例列表
switchover grp1.DMOA1 # 将81现备库切换为主库
# 验证同步
CONN dmoa/****@**.**.2.81:15236;
INSERT INTO dmoa VALUES (4, '宋江', '2026-07-30');
COMMIT;
SELECT * FROM dmoa;
CONN dmoa/****@**.**.2.82:25236;
SELECT * FROM dmoa; -- 查看备库是否同步成功
6.4 集群启停流程
集群的启停必须遵循严格的顺序,否则可能导致数据不一致或服务异常。
6.4.1 启动集群(顺序:实例 → 守护 → 监视器)
# 第一步:启动数据库实例服务
# **.**.2.81
su - dmdba
DmServiceDMOA start
# **.**.2.82
su - dmdba
DmServiceDMOA start
# 第二步:启动数据库守护服务
# **.**.2.81
su - dmdba
DmWatcherServiceDMOA start
# **.**.2.82
su - dmdba
DmWatcherServiceDMOA start
# 第三步:启动监视器查看集群状态
# **.**.2.83
su - dmdba
dmmonitor /dm/dmdbms/dm8/data/dmmonitor.ini
6.4.2 停止集群(顺序:监视器 → 守护 → 实例)
# 第一步:确保监视器服务停止
# **.**.2.83
su - dmdba
DmMonitorServiceDMOA stop
# 或交互式退出
dmmonitor /dm/dmdbms/dm8/data/dmmonitor.ini
exit
# 第二步:停止数据库守护服务
# **.**.2.81
su - dmdba
DmWatcherServiceDMOA stop
# **.**.2.82
su - dmdba
DmWatcherServiceDMOA stop
# 第三步:停止数据库实例服务
# **.**.2.81
su - dmdba
DmServiceDMOA stop
# **.**.2.82
su - dmdba
DmServiceDMOA stop
6.4.3 集群状态查看
# 查看服务进程
ps -ef | grep dmserver
ps -ef | grep dmwatcher
ps -ef | grep dmmonitor
# 查看数据库角色与状态
# status$ : 1=主库, 2=备库
SELECT NAME, STATUS$, ROLE$ FROM V$DATABASE;
6.5 应用连接配置
应用程序通过 dm_svc.conf 配置文件实现主备自动切换连接:
vi /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)
DMOA=(**.**.2.81:15236,**.**.2.82:25236)
配置后,应用程序使用服务名 DMOA 连接数据库,达梦客户端会自动连接到当前主库。当主库故障切换后,客户端会自动连接到新的主库,实现透明故障切换。
第七章 学习总结与问题记录
7.1 学习要点总结
通过本次 DM8 数据守护主备集群的完整搭建与测试,掌握了以下核心知识点:
【操作系统层面】完成了 RHEL 7.6 下达梦数据库运行所需的全部系统配置,包括 LVM 磁盘分区、资源限制调优、SELinux/防火墙关闭、透明大页与 NUMA 关闭、内核参数优化、IO 调度算法设置以及用户与目录规划。
【数据库安装与初始化】掌握了 DM8 数据库的 ISO 挂载安装、dminit 命令行实例初始化、服务注册与启动、图形化管理工具使用、用户与表空间创建、参数优化配置等全流程操作。
【归档与备份】理解了归档模式的两种开启方式(SQL 命令行和配置文件),掌握了 DMRMAN 脱机备份还原恢复流程,以及 DB_MAGIC 魔数的作用与更新方法。学会配置定时作业实现全量/增量备份策略。
【主备集群搭建】完整掌握了 DM 数据守护集群的搭建流程,包括端口规划、4 个核心配置文件(dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini)的编写、OGUID 配置、主备模式设置、守护进程启动等关键步骤。
【监视器与集群管理】学会配置确认监视器,掌握集群启停的标准顺序、主备同步验证、正常切换(switchover)、故障接管(takeover)、强制切换等运维操作。
【应用连接】了解通过 dm_svc.conf 配置服务名实现主备透明切换的机制。
7.2 关键配置文件说明
|
配置文件 |
位置 |
作用 |
主备是否相同 |
|
dm.ini |
/dm/dmdata/DMOA/dm.ini |
数据库实例主配置文件,设置实例名、端口、守护参数等 |
不同(实例名、端口不同) |
|
dmmal.ini |
/dm/dmdata/DMOA/dmmal.ini |
MAL 系统配置,定义主备节点通信信息 |
相同 |
|
dmarch.ini |
/dm/dmdata/DMOA/dmarch.ini |
归档配置,定义实时归档目标和本地归档路径 |
不同(ARCH_DEST指向对方) |
|
dmwatcher.ini |
/dm/dmdata/DMOA/dmwatcher.ini |
守护进程配置,定义守护类型、切换模式、OGUID等 |
相同 |
|
dmmonitor.ini |
监视器节点 |
监视器配置,定义确认模式、日志路径、守护组连接信息 |
仅监视器节点 |
7.3 常见问题与解决方法
问题:disql 无法进入命令界面
解决:检查数据库服务是否启动、端口是否正确、防火墙是否放行。确认 dmdba 用户环境变量中 PATH 包含 $DM_HOME/bin。
问题:数据库服务无法启动
解决:使用前台方式启动查看错误信息:./dmserver /dm/dmdata/DMOA/dm.ini。常见原因包括 dm.ini 配置错误、数据文件权限不对、端口被占用等。
问题:光盘未永久挂载导致 yum 源失效
解决:手动挂载光盘:mount /dev/cdrom /mnt,或在 /etc/fstab 中添加持久挂载配置。
问题:vi 中快速检索参数
解决:在 vi 命令模式下输入 /参数名 即可检索,如 /ARCH_INI,按 n 查找下一个。
问题:系统时间不正确
解决:使用 date 命令查看时间,ntpdate 或 chronyd 同步网络时间,确保集群节点时间一致。
问题:还原后未执行 update db_magic 导致启动失败
解决:在 DMRMAN 中执行 recover database '...' update db_magic 生成新魔数后才能正常启动。
问题:守护进程服务有时启不起来
解决:检查 dmwatcher.ini 中 INST_INI 路径是否正确、INST_STARTUP_CMD 路径是否正确、OGUID 是否与数据库中设置一致。查看守护进程日志排查具体原因。
7.4 集群启停顺序速查
|
操作 |
顺序 |
节点 |
命令 |
|
启动 |
1 |
81 + 82 |
DmServiceDMOA start |
|
启动 |
2 |
81 + 82 |
DmWatcherServiceDMOA start |
|
启动 |
3 |
83 |
dmmonitor dmmonitor.ini |
|
停止 |
1 |
83 |
DmMonitorServiceDMOA stop |
|
停止 |
2 |
81 + 82 |
DmWatcherServiceDMOA stop |
|
停止 |
3 |
81 + 82 |
DmServiceDMOA stop |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐




所有评论(0)