介绍
介绍
福哥想要使用达梦数据库作为客户系统的数据库引擎,但是单机数据库只能出现开发环境当中(甚至很多开发环境都不会使用单机模式了),所以查询了达梦的文档寻找最基本的读写分离的解决方案,最后发现了达梦支持类似MySQL的主从复制运行模式。
在福哥整理这篇教程的时候,达梦的最新版本DM8依然无法使用主从复制实现读写分离。达梦官方社区搜索找不到相似的问题,度娘满屏幕都是“复制”官方教程文档的结果(居然还给排最前面,这度娘是老了~)。现象是无论怎么配置,只要一执行SP_RPS_SET_APPLY()就会卡死,需要杀进程重新启动数据库实例才行。福哥尝试了Docker方式部署、Linux虚拟机方式部署、Windows方式部署都解决不了,严重怀疑官方就没有测试过,真是无语了~~
安装
创建数据库实例
搭建达梦数据库的主从复制环境至少需要三个数据库实例。福哥创建了dm7replicate、dm7master和dm7slave三个容器,每个容器里面都是tfums数据库的实例。
配置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端口 |
---|---|---|---|
dm7replicate | tfums_replicate | 5236 | 5337 |
dm7master | tfums_master | 5236 | 5338 |
dm7slave | tfums_slave | 5236 | 5339 |
配置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)
如果要取消初始化,可以把1改成0再执行一下。
SP_INIT_REP_SYS(0)
复制组
在复制服务器上执行如下命令创建一个复制组。
SP_RPS_ADD_GROUP('MASTER_TO_SLAVE', '主从同步复制')
开始复制组。
SP_RPS_SET_BEGIN('MASTER_TO_SLAVE')
添加复制规则。
SP_RPS_ADD_REPLICATION('MASTER_TO_SLAVE','M2S','master到slave的复制','tfums_master','tfums_slave',null,'/tongfunet/env/dm7data/tfums')
添加复制映射。
SP_RPS_ADD_SCH_MAP('M2S', 'SYSDBA', 'SYSDBA', 0)
应用复制组。
SP_RPS_SET_APPLY()
这个地方会消耗一点时间,大家要耐心等待下哦~~
在这个地方如果是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 )
在slave上面看看用户表里有没有users表。
select * from user_tables
哦吼,同步过来了!
复制数据
现在福哥要往users表里面插入几条数据测试复制数据的情况。
在master上面插入几条数据。
INSERT INTO users VALUES ('鬼谷子叔叔', NOW(), NULL) INSERT INTO users VALUES ('福哥', NOW(), NULL) INSERT INTO users VALUES ('tongfunet', NOW(), NULL)
COMMIT
在slave上面看看users表里有没有这三条数据。
select * from users
总结
达梦数据库是国产数据库里面比较好用的一款,福哥打算深入的学习一下,支持国产,支持信创~~(达梦要是推出社区版本就好了,像MySQL那样)