本手册仅适用于达梦8.1.4.80及其以后的版本,旨在指导技术人员在 不中断业务 的前提下,将一个运行中的、已开启归档模式的单机 DM8 数据库,在线、无中断地升级为一个“一主一备”的 事务一致性 实时读写分离集群。所有组件将注册为系统服务,实现标准化运维和开机自启。
2.1 环境规划
为实现标准化和避免端口冲突,对集群端口进行统一规划。
| 角色 | 主机名 | IP地址 | 实例名 | DB端口 | MAL端口 | 守护端口 | 实例监听守护端口 |
|---|---|---|---|---|---|---|---|
| 原单机/新主库 | DW-MASTER | 192.168.16.136 | DMSERVER |
5236 | 6236 | 8236 | 7236 |
| 备库 & 监视器 | DW-SLAVE01 | 192.168.16.146 | DMSERVER_S |
5236 | 6236 | 8236 | 7236 |
2.2 准备工作与前置检查
新服务器准备:确保新备库服务器(DW-SLAVE01)已就绪,并与主库(DW-MASTER)安装了完全相同版本的 DM8 软件,软件安装目录为 /home/dmdba/dmdbms。
网络与目录:确保主备机网络互通,所有端口已开放,并在备库创建一致的、包含数据库名的目录结构。
# 在备库 DW-SLAVE01 上以 root 用户执行
mkdir -p /data/dmdata/DAMENG /data/dmdata/dmarch/DAMENG /data/dmdata/dmbak/DAMENG
chown -R dmdba:dinstall /data/dmdata
【关键】检查主库归档状态:登录原单机数据库,确认其已处于归档模式。
# 切换到 dmdba 用户
su - dmdba
# 使用操作系统认证登录,如果配置了密码,也可使用 disql SYSDBA/Your_Password 登录
disql / as sysdba
SELECT ARCH_MODE FROM V$DATABASE;
-- 预期结果应为 'Y'
根据主库参数初始化新备库:
# 在备库 DW-SLAVE01 上,切换到 dmdba 用户执行
su - dmdba
dminit PATH=/data/dmdata DB_NAME=DAMENG INSTANCE_NAME=DMSERVER_S PORT_NUM=5236 MAL_FLAG=1 ARCH_FLAG=1 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
规划 OGUID:本例中使用 45333。
3.1 准备新备库数据
主库在线备份:
# 切换到 dmdba 用户,登录主库 disql
disql / as sysdba
BACKUP DATABASE FULL BACKUPSET '/data/dmdata/dmbak/DAMENG/FULL_BAK_01';
exit;
传输备份集:
# 在主库服务器上执行
scp -rp /data/dmdata/dmbak/DAMENG/FULL_BAK_01 root@192.168.16.146:/data/dmdata/dmbak/DAMENG/
# 在备库服务器上确认权限
ssh root@192.168.16.146 "chown -R dmdba:dinstall /data/dmdata/dmbak/DAMENG/FULL_BAK_01"
备库脱机还原恢复:
# 在备库服务器上,切换到 dmdba 用户执行
dmrman use_ap=2 ctlstmt="RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/data/dmdata/dmbak/DAMENG/FULL_BAK_01'"
dmrman use_ap=2 ctlstmt="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' FOR STANDBY FROM BACKUPSET '/data/dmdata/dmbak/DAMENG/FULL_BAK_01'"
dmrman use_ap=2 ctlstmt="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"
3.2 在线配置主库
在线配置主库模式、OGUID、归档和MAL:
# 切换到 dmdba 用户,登录主库 disql
disql / as sysdba
-- 1. 在线添加主备库的MAL信息,此操作会自动生成和更新 dmmal.ini 文件
SF_MAL_INST_ADD_APPLY(
MAL_NAME => 'MAL_INST1', -- MAL配置项名
INST_NAME => 'DMSERVER', -- 实例名
MAL_HOST => '192.168.16.136', -- MAL IP 地址 (内部IP)
MAL_PORT => 6236, -- MAL 端口
INST_HOST => '192.168.16.136', -- 实例 IP 地址 (外部IP)
INST_PORT => 5236, -- 实例端口
DW_PORT => 8236, -- 守护进程端口
LINK_MAGIC => 1, -- 链路魔数
INST_DW_PORT => 7236 -- 实例监听守护进程端口
);
SF_MAL_INST_ADD_APPLY(
MAL_NAME => 'MAL_INST2', -- MAL配置项名
INST_NAME => 'DMSERVER_S', -- 实例名
MAL_HOST => '192.168.16.146', -- MAL IP 地址
MAL_PORT => 6236, -- MAL 端口
INST_HOST => '192.168.16.146', -- 实例 IP 地址
INST_PORT => 5236, -- 实例端口
DW_PORT => 8236, -- 守护进程端口
LINK_MAGIC => 1, -- 链路魔数
INST_DW_PORT => 7236 -- 实例监听守护进程端口
);
-- 2. 动态开启MAL功能,为添加实时归档做准备
CALL SP_SET_PARA_VALUE(1,'MAL_INI',1);
-- 3. 在线修改本地归档并添加实时归档
alter database modify archivelog 'DEST=/data/dmdata/dmarch/DAMENG, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=204800';
ALTER DATABASE ADD ARCHIVELOG 'TYPE=REALTIME,DEST=DMSERVER_S,WAIT_APPLY=1';
-- 4. 切换为主库模式并设置OGUID
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
ALTER DATABASE PRIMARY FORCE;
SP_SET_OGUID(45333);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
3.3 配置文件生成与同步
在主库生成配置文件
# 在主库 DW-MASTER 上执行
vim /data/dmdata/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
INST_OGUID = 45333
INST_INI = /data/dmdata/DAMENG/dm.ini
vim /data/dmdata/DAMENG/dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /data/dmdata/log
[GRP1]
MON_INST_OGUID = 45333
MON_DW_IP = 192.168.16.136:8236
MON_DW_IP = 192.168.16.146:8236
cp /data/dmdata/DAMENG/dmmonitor.ini /data/dmdata/DAMENG/dmmonitor_manual.ini
sed -i 's/MON_DW_CONFIRM = 1/MON_DW_CONFIRM = 0/' /data/dmdata/DAMENG/dmmonitor_manual.ini
同步配置文件到备库
# 在主库 DW-MASTER 上以 root 用户执行
scp -p /data/dmdata/DAMENG/{dmmal.ini,dmwatcher.ini,dmmonitor.ini,dmmonitor_manual.ini,dmarch.ini} root@192.168.16.146:/data/dmdata/DAMENG/
# 在备库服务器上确认权限
ssh root@192.168.16.146 "chown dmdba:dinstall /data/dmdata/DAMENG/*.ini"
修改备库的 dmarch.ini
# 在备库 DW-SLAVE01 上执行
sed -i "s/ARCH_DEST\s*=\s*DMSERVER_S/ARCH_DEST = DMSERVER/" /data/dmdata/DAMENG/dmarch.ini
3.4 注册系统服务
以 root 用户在 对应节点 上执行。
主库服务器
# 在主库 DW-MASTER 上执行
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmwatcher -p DMSERVER -watcher_ini /data/dmdata/DAMENG/dmwatcher.ini
备库服务器
# 在备库 DW-SLAVE01 上执行
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -p DMSERVER_S -dm_ini /data/dmdata/DAMENG/dm.ini -m mount
./dm_service_installer.sh -t dmwatcher -p DMSERVER_S -watcher_ini /data/dmdata/DAMENG/dmwatcher.ini
./dm_service_installer.sh -t dmmonitor -p GRP1 -monitor_ini /data/dmdata/DAMENG/dmmonitor.ini
3.5 启动服务与最终配置
启动备库服务并配置模式:
# 在备库 DW-SLAVE01 上以 root 执行
systemctl start DmServiceDMSERVER_S.service
待服务启动到 mount 状态后:
# 切换到 dmdba 用户,登录备库 disql
su - dmdba
disql SYSDBA/Dameng123
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
ALTER DATABASE STANDBY;
SP_SET_OGUID(45333);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
exit;
启动守护和监视器服务:
# 在主库 DW-MASTER 上以 root 启动守护服务
systemctl start DmWatcherServiceDMSERVER.service
# 在备库 DW-SLAVE01 上以 root 启动守护服务
systemctl start DmWatcherServiceDMSERVER_S.service
# 任意节点使用前台监视器确认集群状态
su - dmdba -s /bin/bash -c "source ~dmdba/.bash_profile;dmmonitor /data/dmdata/DAMENG/dmmonitor_manual.ini"
# 在监视器节点启动监视器服务
systemctl start DmMonitorServiceGRP1.service
写入测试数据确认同步情况:
# 在主库上,使用 dmdba 用户执行
su - dmdba
disql / as sysdba
create table if not exists tb_test_sync(dt datetime);
insert into tb_test_sync select sysdate as dt from dual;
commit;
# 在备库上,切换到 dmdba 用户执行
su - dmdba
disql / as sysdba -e 'select * from tb_test_sync'
根据实际需要,清理同步测试表和数据(也可保留,方便日后定期写入测试数据检验同步情况)。
配置并测试客户端读写分离:
在客户端机器上编辑 dm_svc.conf 文件:
RWW_SERVICE=(192.168.16.136:5236,192.168.16.146:5236)
[RWW_SERVICE]
LOGIN_MODE=(1) # 主库优先
RW_SEPARATE=(1) # 启用读写分离
# RW_PERCENT: 主库保留的读事务比例(0-100),剩余比例分发到备库。
# 设置为20,表示80%的读请求将被分发到备库。
RW_PERCENT=(20)
使用客户端(如 disql 或应用程序)通过服务名 RWW_SERVICE 连接,执行查询和更新操作,验证读写请求是否按预期分发。
文章
阅读量
获赞
