介绍
介绍
福哥想要使用达梦数据库作为客户系统的数据库引擎,但是单机数据库只能出现开发环境当中(甚至很多开发环境都不会使用单机模式了)。所以查询了达梦的文档寻找最基本的读写分离的解决方案,后来发现了达梦支持类似MySQL的主从复制运行模式,福哥各种尝试搭建DM8的主从复制运行模式死活过不去,就在快要放弃的时候灵机一动要不试试DM7?结果成功了~~
DM8不支持主从复制,大家还不吐槽,这不太可能啊!?后来福哥又发现了另一个解决方案DMMPP,这个解决方案可以很好地解决读写分离的需求。不仅如此,DMMPP是一个达梦数据库的集群,它的每一个节点都支持读操作和写操作,这个相比较主从复制的解决方案要强大得多!
安装
创建数据库实例
搭建达梦数据库的DMMPP运行环境至少需要两个数据库实例。福哥创建了dm7ep1和dm7ep2两个个容器,每个容器里面都是tfums数据库的实例。
配置dm.ini
两个个容器的dm.ini都要配置一下。
首先INSTANCE_NAME必须设置成不一样的名称才行,福哥设置了tfums_ep1(节点1)、tfums_ep2(节点2)。
INSTANCE_NAME = tfums_ep1
设置的INSTANCE_NAME一定不要有“-”,否则在后面启动复制的时候会报“无效实例”的错误,但是启动的时候不会报错,TNND~
其次要开启dmmal.ini的支持。
MAL_INI = 1
其次要开启dmmpp.ini的支持。
MPP_INI = 1
配置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 dm7ep1:/tongfunet/env/dm7data/tfums/dmmal.ini .
福哥编辑好的dmmal.ini是这样的,分配了两个端口分别是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_EP1] MAL_INST_NAME = tfums_ep1 MAL_HOST = dm7ep1 MAL_PORT = 5337 MAL_INST_HOST = dm7ep1 MAL_INST_PORT = 5236 [MAL_EP2] MAL_INST_NAME = tfums_ep2 MAL_HOST = dm7ep2 MAL_PORT = 5338 MAL_INST_HOST = dm7ep2 MAL_INST_PORT = 5236
现在再把编辑好的dmmal.ini复制到两个容器里面。
docker cp dmmal.ini dm7ep1:/tongfunet/env/dm7data/tfums/dmmal.ini docker cp dmmal.ini dm7ep2:/tongfunet/env/dm7data/tfums/dmmal.ini
配置dmmpp.ini
在dm7dbms的samples目录里面找到dmmpp_example.ini文件,我们来配置这个文件。
cp /tongfunet/env/dm7dbms/samples/ini_script/UTF-8/dmmpp_example.ini /tongfunet/env/dm7data/tfums/dmmpp.ini
首先把它复制到宿主机上进行编辑。
docker cp dm7ep1:/tongfunet/env/dm7data/tfums/dmmpp.ini .
福哥编辑好的dmmpp.ini是这样的,MPP_SEQ_NO是节点的序号,福哥设置的是0和1分别对应tfums_ep1和tfums_ep2。
[SERVICE_EP1] MPP_SEQ_NO = 0 MPP_INST_NAME = tfums_ep1 [SERVICE_EP2] MPP_SEQ_NO = 1 MPP_INST_NAME = tfums_ep2
现在再把编辑好的dmmpp.ini复制到两个容器里面。
docker cp dmmpp.ini dm7ep1:/tongfunet/env/dm7data/tfums/dmmpp.ini docker cp dmmpp.ini dm7ep2:/tongfunet/env/dm7data/tfums/dmmpp.ini
dmmpp.ini不能直接使用,需要用dmctlcvt工具转换成ctl格式的文件才行,在每个节点上面执行一下下面的命令将dmmpp.ini转换成dmmpp.ctl
/tongfunet/env/dm7dbms/bin/dmctlcvt TYPE=2 SRC=/tongfunet/env/dm7data/tfums/dmmpp.ini DEST=/tongfunet/env/dm7data/tfums/dmmpp.ctl
重启
重启两个容器里面的数据库实例。
使用
数据表
现在福哥要在SYSDBA模式下面建立一个数据表users,看看同步情况。
在ep1上面执行CREATE TABLE语句。
CREATE TABLE users ( userId INT NOT NULL IDENTITY(1, 1), userName VARCHAR(45) NOT NULL, createDT DATETIME NULL, logonDT DATETIME NULL )
在ep2上面看看用户表里有没有users表。
select * from user_tables
欧耶,同步过来了~
反过来在ep2上面再建立一个数据表user_profiles看看反向同步的情况。
在ep2上面执行CREATE TABLE语句。
CREATE TABLE user_profiles ( userId INT NOT NULL, nickName VARCHAR(45) NOT NULL, gender SMALLINT NOT NULL, description VARCHAR(500) )
在ep1上面看看有没有user_profiles表。
select * from user_tables
帅啊!反向也同步过来了~
数据
现在福哥要往users表里面插入几条数据测试复制数据的情况。
在ep1上面插入一条数据。
INSERT INTO users VALUES ('鬼谷子叔叔', NOW(), NULL); COMMIT;
在ep2上面查一查。
select * from users
过来了!!
反过来在ep2上面再插入一条数据。
INSERT INTO users VALUES ('福哥', NOW(), NULL); COMMIT;
再在ep1上面查一查。
select * from users
反过来也能过来!!
注意事项
DM MPP支持绝大多数单机版DM的功能,但在某些小的功能点使用上存在一些使用限制,具体如下:
MPP环境下,不支持创建SET NULL或SET DEFAULT约束检查规则的引用约束;
MPP环境下不支持创建外部表、间隔分区表;
MPP环境下不支持修改表的ADD [COLUMN] <列名>[<IDENTITY子句>]子句;
MPP环境下不支持创建位图索引、空间索引、数组索引;
MPP环境下位图连接索引涉及的维度表需FULLY分布;
MPP环境下不支持索引的ONLINE选项;
MPP环境下不支持视图的WITH CHECK OPTION操作;
MPP环境下不支持闪回查询;
MPP环境下不支持物化视图日志;
MPP各EP创建数据库时指定的编码格式应相同,否则可能造成乱码问题;
MPP环境下INI参数MVCC_RETRY_TIMES无效,发生MVCC冲突时直接报错;
MPP环境下不支持DBMS_JOB包;
MPP环境下日志辅助表不支持FULLY分布。
总结
达梦数据库是国产数据库里面比较好用的一款,福哥打算深入的学习一下,支持国产,支持信创~~(达梦要是推出社区版本就好了,像MySQL那样)