同福

达梦数据库DM7搭建主从复制运行环境【20220419】

介绍

介绍

福哥想要使用达梦数据库作为客户系统的数据库引擎,但是单机数据库只能出现开发环境当中(甚至很多开发环境都不会使用单机模式了),所以查询了达梦的文档寻找最基本的读写分离的解决方案,最后发现了达梦支持类似MySQL的主从复制运行模式。

在福哥整理这篇教程的时候,达梦的最新版本DM8依然无法使用主从复制实现读写分离。达梦官方社区搜索找不到相似的问题,度娘满屏幕都是“复制”官方教程文档的结果(居然还给排最前面,这度娘是老了~)。现象是无论怎么配置,只要一执行SP_RPS_SET_APPLY()就会卡死,需要杀进程重新启动数据库实例才行。福哥尝试了Docker方式部署、Linux虚拟机方式部署、Windows方式部署都解决不了,严重怀疑官方就没有测试过,真是无语了~~

安装

创建数据库实例

搭建达梦数据库的主从复制环境至少需要三个数据库实例。福哥创建了dm7replicate、dm7master和dm7slave三个容器,每个容器里面都是tfums数据库的实例。

home/topic/2022/0427/10/cf0110e6dad3746c3afaeb8de609c082.png

配置dm.ini

三个容器的dm.ini都要配置一下。

首先INSTANCE_NAME必须设置成不一样的名称才行,福哥设置了tfums_replicate(复制服务器)、tfums_master(主服务器)、tfums_slave(从服务器)。

INSTANCE_NAME                   = tfums_replicate

设置的INSTANCE_NAME一定不要有“-”,否则在后面启动复制的时候会报“无效实例”的错误,但是启动的时候不会报错,TNND~

其次要开启dmmal.ini的支持。

MAL_INI                         = 1

三个容器的情况如下:

容器实例名称实例端口MAL端口
dm7replicatetfums_replicate52365337
dm7mastertfums_master52365338
dm7slavetfums_slave52365339

配置dmmal.ini

在dm7dbms的samples目录里面找到dmmal_example.ini文件,我们来配置这个文件。

cp /tongfunet/env/dm7dbms/samples/ini_script/UTF-8/dmmal_example.ini /tongfunet/env/dm7data/tfums/dmmal.ini

首先把它复制到宿主机上进行编辑。

docker cp dm7replicate:/tongfunet/env/dm7data/tfums/dmmal.ini .

福哥编辑好的dmmal.ini是这样的,分配了三个端口分别是5336、5337和5338。

#MAL_CHECK_INTERVAL		=	30
#MAL_CONN_FAIL_INTERVAL  	=	10  
#MAL_LOGIN_TIMEOUT		=	15
#MAL_BUF_SIZE			=	100
#MAL_SYS_BUF_SIZE		=	0
#MAL_VPOOL_SIZE			=	128
#MAL_COMPRESS_LEVEL		=	0
#MAL_TEMP_PATH			=

[MAL_REPLICATE]
MAL_INST_NAME		=	tfums_replicate
MAL_HOST		=	dm7replicate
MAL_PORT		=	5337
MAL_INST_HOST		=	dm7replicate
MAL_INST_PORT		=	5236

[MAL_MASTER]
MAL_INST_NAME		=	tfums_master
MAL_HOST		=	dm7master
MAL_PORT		=	5338
MAL_INST_HOST		=	dm7master
MAL_INST_PORT		=	5236

[MAL_SLAVE]
MAL_INST_NAME		=	tfums_slave
MAL_HOST		=	dm7slave
MAL_PORT		=	5339
MAL_INST_HOST		=	dm7slave
MAL_INST_PORT		=	5236

现在再把编辑好的dmmal.ini复制到三个容器里面。

docker cp dmmal.ini dm7replicate:/tongfunet/env/dm7data/tfums/dmmal.ini
docker cp dmmal.ini dm7master:/tongfunet/env/dm7data/tfums/dmmal.ini
docker cp dmmal.ini dm7slave:/tongfunet/env/dm7data/tfums/dmmal.ini

重启

重启三个容器里面的数据库实例。

初始化

初始化复制服务器

登录dm7replicate服务器,使用下面的命令进行初始化操作。

SP_INIT_REP_SYS(1)

home/topic/2022/0427/10/befc591162d94984cc0dd51ecd778331.png

如果要取消初始化,可以把1改成0再执行一下。

SP_INIT_REP_SYS(0)

复制组

在复制服务器上执行如下命令创建一个复制组。

SP_RPS_ADD_GROUP('MASTER_TO_SLAVE', '主从同步复制')

home/topic/2022/0422/15/5fd42365297b9ff98ccfd6b75b64ca41.png

开始复制组。

SP_RPS_SET_BEGIN('MASTER_TO_SLAVE')

home/topic/2022/0422/15/f195e8b23627f3c27efe3f64545326d1.png

添加复制规则。

SP_RPS_ADD_REPLICATION('MASTER_TO_SLAVE','M2S','master到slave的复制','tfums_master','tfums_slave',null,'/tongfunet/env/dm7data/tfums')

home/topic/2022/0427/10/f001bd52d02a533e15a72a8d0482261c.png

添加复制映射。

SP_RPS_ADD_SCH_MAP('M2S', 'SYSDBA', 'SYSDBA', 0)

home/topic/2022/0422/16/8e1aa61560acc6ceefc96361f8ca9e48.png

应用复制组。

SP_RPS_SET_APPLY()

home/topic/2022/0427/11/80f94944b34050e5b71826eb16fae222.png

这个地方会消耗一点时间,大家要耐心等待下哦~~

在这个地方如果是DM8的话就会无限期的执行下去,replicate机器和master机器都会被锁死,无法连接,无法操作,也没有任何错误日志。。。

使用

复制数据表

现在福哥要在SYSDBA模式下面建立一个数据表users,看看同步情况。

在master上面执行CREATE TABLE语句。

CREATE TABLE users (
uId INT NOT NULL IDENTITY(1, 1),
uName VARCHAR(45) NOT NULL,
crtDT DATETIME NULL,
logDT DATETIME NULL
)

home/topic/2022/0427/11/9e36985c0241da81d35a0ef03baa01f6.png

在slave上面看看用户表里有没有users表。

select * from user_tables

home/topic/2022/0427/11/50a3158fccf538277e01c7a09905bf4b.png

哦吼,同步过来了!

复制数据

现在福哥要往users表里面插入几条数据测试复制数据的情况。

在master上面插入几条数据。

INSERT INTO users VALUES ('鬼谷子叔叔', NOW(), NULL)
INSERT INTO users VALUES ('福哥', NOW(), NULL)
INSERT INTO users VALUES ('tongfunet', NOW(), NULL)

home/topic/2022/0427/11/6605bea7d8d6623b3ff91c7935bd464f.png

COMMIT

home/topic/2022/0427/11/34f912c5178ca78287131ea64eba731c.png

在slave上面看看users表里有没有这三条数据。

select * from users

home/topic/2022/0427/11/a908f8d3534cbf50b84b66b46bd4f1c0.png

总结

达梦数据库是国产数据库里面比较好用的一款,福哥打算深入的学习一下,支持国产,支持信创~~(达梦要是推出社区版本就好了,像MySQL那样)