环境与端口检查
cat /etc/*release
uname -a
chronyc sources -v
echo $LANG
ss -lntp | egrep '5237|5238|5337|5338|5437|5438|5537|5538'
同机部署最关键的区别是端口不能重复。最终规划中,主实例使用 5238/5338/5438/5538,备实例使用 5237/5337/5437/5537;两个实例必须使用相同 OGUID 和守护组,但实例名、数据库目录、本地归档目录与服务后缀必须区分。
实例初始化命令
cd /home/dmdba/dmdbms/bin
# 主实例(密码仅使用占位符)
./dminit PATH=/home/dmdba/dmdata DB_NAME=MASTER INSTANCE_NAME=GRP1_RT_01 \
PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
SYSDBA_PWD='<强口令>' SYSAUDITOR_PWD='<强口令>'
# 备实例
./dminit PATH=/home/dmdba/dmdata DB_NAME=STANDBY INSTANCE_NAME=GRP1_RT_02 \
PORT_NUM=5237 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 \
SYSDBA_PWD='<强口令>' SYSAUDITOR_PWD='<强口令>'
主备数据守护不是分别创建两个空库后直接启动,而是以主库的一致性物理备份为基线恢复备库。主库先进入 MOUNT 状态,开启归档并添加本地归档目的地,再 OPEN 数据库并执行 BACKUP DATABASE。
开启归档与备份
# 连接主库初始端口
./disql SYSDBA/'<口令>'@127.0.0.1:5236
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG
'DEST=/home/dmdba/dmdata/MASTER/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
ALTER DATABASE OPEN;
BACKUP DATABASE BACKUPSET '/home/dmdba/dm_backup/BACKUP_FILE';
主库完成备份后,按照最终端口规划修改 PORT_NUM,并启用 MAL 系统和日志发送/重演监控。ALTER_MODE_STATUS=0 用于禁止运行期间随意修改实例模式、状态和 OGUID;后续首次设置 PRIMARY/STANDBY 角色时会临时打开。
主库参数调整
SP_SET_PARA_VALUE(2,'PORT_NUM',5238);
SP_SET_PARA_VALUE(2,'DW_INACTIVE_INTERVAL',60);
SP_SET_PARA_VALUE(2,'ALTER_MODE_STATUS',0);
SP_SET_PARA_VALUE(2,'ENABLE_OFFLINE_TS',2);
SP_SET_PARA_VALUE(2,'MAL_INI',1);
SP_SET_PARA_VALUE(2,'RLOG_SEND_APPLY_MON',64);
三个配置文件分别负责实时归档、MAL 通讯和守护进程行为。主备两端的 dmmal.ini 节点清单必须一致;dmwatcher.ini 仅需将 INST_INI 指向本机实例路径;dmarch.ini 的实时归档目标则互相指向对端实例名。
主库 dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/dmdata/MASTER/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE = 2
ARCH_HANG_FLAG = 1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02
主备一致的 dmmal.ini
MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
MAL_TEMP_PATH = /home/dmdba/dmdata/MASTER/mal_tmp/
MAL_BUF_SIZE = 512
MAL_SYS_BUF_SIZE = 2048
MAL_COMPRESS_LEVEL = 0
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.200.178
MAL_PORT = 5338
MAL_INST_HOST = 192.168.200.178
MAL_INST_PORT = 5238
MAL_DW_PORT = 5438
MAL_INST_DW_PORT = 5538
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.200.178
MAL_PORT = 5337
MAL_INST_HOST = 192.168.200.178
MAL_INST_PORT = 5237
MAL_DW_PORT = 5437
MAL_INST_DW_PORT = 5537
主库 dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 453331
INST_INI = /home/dmdba/dmdata/MASTER/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
数据库服务以 MOUNT 模式注册,避免启动后直接 OPEN;守护进程接管后会根据集群状态控制实例。服务后缀决定最终 systemd 服务名,因此主备必须使用不同后缀。
主库服务注册
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -p MASTER \
-dm_ini /home/dmdba/dmdata/MASTER/dm.ini -m mount
./dm_service_installer.sh -t dmwatcher -p WATCH_MASTER \
-watcher_ini /home/dmdba/dmdata/MASTER/dmwatcher.ini
systemctl daemon-reload
备库通过主库备份集执行 RESTORE、RECOVER 和 UPDATE DB_MAGIC。UPDATE DB_MAGIC 使恢复后的数据库获得新的数据库魔数,避免与主库完全相同。恢复成功后配置备库的 dm.ini、dmarch.ini、dmmal.ini 和 dmwatcher.ini。
备库恢复
cd /home/dmdba/dmdbms/bin
./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdata/STANDBY/dm.ini' FROM BACKUPSET '/home/dmdba/dm_backup/BACKUP_FILE'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/STANDBY/dm.ini' FROM BACKUPSET '/home/dmdba/dm_backup/BACKUP_FILE'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/STANDBY/dm.ini' UPDATE DB_MAGIC"
备库差异项
# 备库 dm.ini 关键项
INSTANCE_NAME = GRP1_RT_02
PORT_NUM = 5237
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
# 备库 dmarch.ini 的实时归档目标
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01
备库服务注册
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -p STANDBY \
-dm_ini /home/dmdba/dmdata/STANDBY/dm.ini -m mount
./dm_service_installer.sh -t dmwatcher -p WATCH_STANDBY \
-watcher_ini /home/dmdba/dmdata/STANDBY/dmwatcher.ini
systemctl daemon-reload
首次启动时先启动数据库服务,使两个实例处于 MOUNT 状态,再分别设置相同 OGUID 和主备角色。ALTER_MODE_STATUS 只在变更模式前临时设置为 1,操作完成后立即恢复为 0。
启动数据库服务
systemctl start DmServiceMASTER
systemctl start DmServiceSTANDBY
systemctl status DmServiceMASTER --no-pager -l
systemctl status DmServiceSTANDBY --no-pager -l
设置主备角色
# 主实例 5238
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
SP_SET_OGUID(453331);
ALTER DATABASE PRIMARY;
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
# 备实例 5237
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
SP_SET_OGUID(453331);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
主备角色设置完成后启动两端守护进程。由于 INST_AUTO_RESTART=1,后续日常启动时守护进程可以自动拉起对应实例;首次搭建阶段仍应按照“实例初始化—角色设置—守护进程”的顺序执行。
启动守护进程
systemctl start DmWatcherServiceWATCH_MASTER
systemctl start DmWatcherServiceWATCH_STANDBY
systemctl status DmWatcherServiceWATCH_MASTER --no-pager -l
systemctl status DmWatcherServiceWATCH_STANDBY --no-pager -l
确认监视器 MON_DW_CONFIRM=1 可在 DW_MODE=AUTO 时参与自动故障切换,官网建议部署在独立第三台机器;非确认监视器 MON_DW_CONFIRM=0 用于查询状态和人工切换,不需要注册后台服务。本次实训将两类监视器均放在同一台云主机上。
确认监视器 dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 512
MON_LOG_SPACE_LIMIT = 2048
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.200.178:5438
MON_DW_IP = 192.168.200.178:5437
监视器注册与启动
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmmonitor -p Monitor \
-monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini
systemctl daemon-reload
# 后台确认监视器
/home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start
# 前台非确认监视器
cd /home/dmdba/dmdbms/bin
./dmmonitor dmmonitor_manual.ini
监视器连接成功后,先使用 tip 或 show global info 确认两个实例均为 OPEN,主库为 PRIMARY、备库为 STANDBY,状态为 OK/VALID。执行切换前需要 login 登录监视器,再通过 choose switchover 查看满足正常切换条件的实例。
完成首次搭建后,推荐由守护进程统一管理实例。停止集群时先停止守护进程,避免其自动拉起实例,再停止数据库服务。应用侧应使用服务名连接,并设置 LOGIN_MODE=1 只连接 PRIMARY 模式实例,使主备切换后客户端可以重新选择当前主库。
建议启停顺序
# 日常启动
systemctl start DmWatcherServiceWATCH_MASTER
systemctl start DmWatcherServiceWATCH_STANDBY
systemctl start DmMonitorServiceMonitor
# 日常停止
systemctl stop DmMonitorServiceMonitor
systemctl stop DmWatcherServiceWATCH_MASTER
systemctl stop DmWatcherServiceWATCH_STANDBY
systemctl stop DmServiceMASTER
systemctl stop DmServiceSTANDBY
本次环境 dm_svc.conf 示例
TIME_ZONE=(480)
LANGUAGE=(cn)
DM_YQ=(192.168.200.178:5238,192.168.200.178:5237)
[DMHA]
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
LOGIN_MODE=(1)
# JDBC 连接串
jdbc:dm://DM_YQ
文章
阅读量
获赞
