DM7数据复制之模式级复制

简介:

DM 的数据复制可以在表级,模式级和库级进行配置,表级复制因为不能同步DDL,所以必须要求主从段表的结构必须完全一致。 本篇我们看下模式级数据复制的配置过程。
下面举一个简单的例子来说明数据复制的配置。

  1. 准备工作
    参与复制的复制实例的信息如下表所示。

数据库 实例名 IP地址 数据库端口号 MAL端口号 文件目录
复制数据库 jydm 10.10.10.180 5236 5241 /dm_home/dmdba/dmdbms/data/
主数据库 hy 10.10.10.184 5236 5242 /dm_home/dmdba/dmdbms/data/
从数据库 wy 10.10.10.185 5236 5243 /dm_home/dmdba/dmdbms/data/
假设主数据库上存在hy用户,从数据库上存在wy用户,现需要创建一个主数据库上的hy用户到从数据库上wy用户的同步复制关系,其名称为REPHY2WY。

  1. 参数设置
    修改3台DM数据库的dm.ini 文件,添加如下内容:

数据库 dm.ini 设置
复制数据库 INSTANCE_NAME = jydm
PORT_NUM = 5236
MAL_INI = 1
主数据库 INSTANCE_NAME = hy
PORT_NUM = 5236
MAL_INI = 1
从数据库 INSTANCE_NAME = wy
PORT_NUM = 5236
MAL_INI = 1
配置dmmal.ini 文件
修改dmmal.ini文件,添加如下内容。Dmmal 配置文件默认没有,可以从示例目录下复制过来修改。
[root@shard1 ini_script]# pwd
/dm_home/dmdba/dmdbms/samples/ini_script
[root@shard1 ini_script]# ls -lrt
总用量 48
-rwxr-xr-x 1 dmdba dinstall 890 2月 14 2019 dmarch_example.ini
-rwxr-xr-x 1 dmdba dinstall 1966 2月 14 2019 dmdcr_cfg_example.ini
-rwxr-xr-x 1 dmdba dinstall 631 2月 14 2019 dmdcr_example.ini
-rwxr-xr-x 1 dmdba dinstall 1537 2月 14 2019 dminit_example.ini
-rwxr-xr-x 1 dmdba dinstall 2070 2月 14 2019 dmmal_example.ini
-rwxr-xr-x 1 dmdba dinstall 1277 2月 14 2019 dmmonitor_example.ini
-rwxr-xr-x 1 dmdba dinstall 288 2月 14 2019 dmmpp_example.ini
-rwxr-xr-x 1 dmdba dinstall 1679 2月 14 2019 dmtimer_example.ini
-rwxr-xr-x 1 dmdba dinstall 1241 2月 14 2019 dmwatch_example.ini
-rwxr-xr-x 1 dmdba dinstall 2146 2月 14 2019 dmwatcher_example.ini
-rwxr-xr-x 1 dmdba dinstall 522 2月 14 2019 dmwmon_example.ini
-rwxr-xr-x 1 dmdba dinstall 636 2月 14 2019 sqllog_example.ini
在每个数据库服务器上创建一个dmmal.ini文件,每个dmmal.ini 配置必须一致:
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_jydm]
MAL_INST_NAME = jydm
MAL_HOST = 10.10.10.180
MAL_PORT = 5241
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.180
[MAL_hy]
MAL_INST_NAME = hy
MAL_HOST = 10.10.10.184
MAL_PORT = 5242
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.184
[MAL_wy]
MAL_INST_NAME =wy
MAL_HOST = 10.10.10.185
MAL_PORT = 5243
MAL_INST_PORT = 5236
MAL_INST_HOST =10.10.10.185
[dmdba@shard1 jydm]$ cat dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_jydm]
MAL_INST_NAME = jydm
MAL_HOST = 10.10.10.180
MAL_PORT = 5241
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.180
[MAL_hy]
MAL_INST_NAME = hy
MAL_HOST = 10.10.10.184
MAL_PORT = 5242
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.184
[MAL_wy]
MAL_INST_NAME =wy
MAL_HOST = 10.10.10.185
MAL_PORT = 5243
MAL_INST_PORT = 5236
MAL_INST_HOST =10.10.10.185
[dmdba@jydm2 hy]$ cat dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_jydm]
MAL_INST_NAME = jydm
MAL_HOST = 10.10.10.180
MAL_PORT = 5241
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.180
[MAL_hy]
MAL_INST_NAME = hy
MAL_HOST = 10.10.10.184
MAL_PORT = 5242
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.184
[MAL_wy]
MAL_INST_NAME =wy
MAL_HOST = 10.10.10.185
MAL_PORT = 5243
MAL_INST_PORT = 5236
MAL_INST_HOST =10.10.10.185
[dmdba@jydm3 wy]$ cat dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_jydm]
MAL_INST_NAME = jydm
MAL_HOST = 10.10.10.180
MAL_PORT = 5241
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.180
[MAL_hy]
MAL_INST_NAME = hy
MAL_HOST = 10.10.10.184
MAL_PORT = 5242
MAL_INST_PORT = 5236
MAL_INST_HOST = 10.10.10.184
[MAL_wy]
MAL_INST_NAME =wy
MAL_HOST = 10.10.10.185
MAL_PORT = 5243
MAL_INST_PORT = 5236
MAL_INST_HOST =10.10.10.185
对3个数据库都要启用mal_ini参数
SQL> sp_set_para_value(2,'MAL_INI',1);
DMSQL executed successfully
used time: 7.465(ms). Execute id is 23.
复制数据库初始化
如果是第一次使用复制数据库,需要对复制数据库执行初始化操作。通过执行系统函数SP_INIT_REP_SYS(create_flag)来初始化复制数据库。其主要作用是创建复制用户(SYSREP/SYSREP)和创建复制数据库上需要的系统表。SP_INIT_REP_SYS 的参数create_flag为1时表示创建用户和系统表,为0时表示删除用户和系统表。
开始初始化:
SQL> SP_INIT_REP_SYS(1);
DMSQL executed successfully
used time: 115.960(ms). Execute id is 30.
SQL> conn SYSREP/SYSREP
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 9.684(ms)
SQL> select table_name from user_tables;
LINEID TABLE_NAME
---------- -----------------
1 RPS_GROUPS
2 RPS_INSTANCES
3 RPS_REPLICATIONS
4 RPS_TABMAPS
5 RPS_FAULT_HISTORY
6 RPS_CONFLICTS
7 RPS_TIMERS
7 rows got
used time: 170.443(ms). Execute id is 31.
创建的7张复制系统表如下:
1) 复制组表
CREATE TABLE SYSREP.RPS_GROUPS (
NAME VARCHAR(128), // 复制组名
ID INT, // 复制组ID
DESC$ VARCHAR(1000), // 描述
CLUSTER PRIMARY (NAME)
);
2) 复制节点实例表
CREATE TABLE SYSREP.RPS_INSTANCES(
INST_NAME VARCHAR(128), // 复制节点实例名
GRP_ID INT, // 复制组ID
INST_ID INT, // 实例在复制组中编号
FAULT_TIMEOUT INT, // 故障超时处理值,以秒为单位,0为立即超时
VALID_FLAG CHAR(1), // 节点系统状态
FAULT_TIME DATETIME, // 节点故障开始时间
NET_VALID_FLAG CHAR(1), // 网络状态
NET_FAULT_TIME DATETIME, // 网络故障开始时间
CLUSTER PRIMAY KEY(GRP_ID, INST_NAME)
);
3) 复制关系表
CREATE TABLE SYSREP.RPS_REPLICATIONS(
REP_NAME VARCHAR(128), // 复制名
GRP_ID INT, // 复制组ID
REP_ID INT, // 复制ID,全局唯一
MINST_ID INT, // 主节点实例编号
SINST_ID INT, // 从节点实例编号
ARCH_DIR VARCHAR(256), // 主节点归档日志路径
FAULT_TIMEOUT INT, // 故障超时处理值,以秒为单位,0为立即超时
VALID_FLAG CHAR(1), // 复制关系状态
FAULT_TIME DATETIME, // 故障开始时间
SYNC_FLAG INTEGER //指定同步或异步复制
TIMER_NAME VARCHAR(128) //指定异步复制的定时器(同步复制没有此项)
DESC$ VARCHAR(1000), // 复制描述
CLUSTER PRIMARY KEY(GRP_ID, REP_NAME)
);
4) 复制映射表
CREATE TABLE SYSREP.RPS_TABMAPS(
REP_ID INT, //复制ID
MSCH_NAME VARCHAR(128), //主表模式名
MTAB_NAME VARCHAR(128), //主表名
MSCH_ID INT, //主表模式ID
MTAB_ID INT, //主表ID
SSCH_NAME VARCHAR(128), //从表模式名
STAB_NAME VARCHAR(128), //从表名
SSCH_ID INT, //从表模式ID
STAB_ID INT, //从表ID
READONLY_MODE INT, //映射模式1:只读模式,0:非只读模式
CLUSTER PRIMARY KEY(REP_ID, MTAB_ID, STAB_ID)
);
5) 复制故障历史表
CREATE TABLE SYSREP.REP_FAULT_HISTORY(
GRP_NAME VARCHAR(128), // 复制组
OBJ_NAME VARCHAR(128), // 故障节点或关系
FAULT_TYPE VARCHAR(128), // 故障类型描述
START_TIME DATETIME, // 故障开始时间
END_TIME DATETIME // 故障结束时间
);
6) 复制冲突历史表
CREATE TABLE SYSREP.RPS_CONFLICTS
(
SEQ_NO BIGINT // 冲突序号
REP_ID INT, // 对应复制号
INST_ID INT, // 产生冲突的节点编号
TABLE_ID INT, // 冲突表ID
TYPE TINYINT // 操作类型
OCC_TIME DATETIME, // 冲突产生时间
KEY_DATA VARCHAR(8000), // 冲突数据的PK值,如包含多个KEY值,则以逗号分隔。如键值超长则截断
);
7) 复制定时器表
CREATE TABLE SYSREP.RPS_TIMERS (
NAME VARCHAR(128), // 定时器名称
TYPE$ INT, // 定时类型,取值可参见SP_RPS_CREATE_TIMER
FERQ_INTERVAL INT, // 间隔天数
FREQ_SUB_INTERVAL INT, // 间隔的月/周(调度类型决定)数
FREQ_MINUTE_INTERVAL INT, // 间隔的分钟数
START_TIME TIME, // 开始时间
END_TIME TIME, // 结束时间
DURING_START_DATE DATETIME // 开始时间点
DURING_END_DATE DATETIME, // 结束时间点
NO_END_DATA_FLAG INTEGER //是否有结束日期(0:有结束日期;1:没有结束日期)
DESC$ VARCHAR(1000), // 定时器描述
CLUSTER PRIMARY KEY(REP_NAME)
);
配置模式级复制
启动3台服务器,启动的顺序不分先后。
[root@shard1 jydm]# systemctl stop DmServicejydm.service
[root@shard1 jydm]# systemctl start DmServicejydm.service
[root@jydm2 ~]# systemctl stop DmServicehy.service
[root@jydm2 ~]# systemctl start DmServicehy.service
[root@jydm3 ~]# systemctl stop DmServicewy.service
[root@jydm3 ~]# systemctl start DmServicewy.service
登录复制数据库(RPS jydm),保证服务器状态为OPEN,开始复制配置。
[dmdba@shard1 bin]$ ./disql sysdba/abcd
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 9.851(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT
Connected to: DM 7.1.6.46
创建复制组REP_GRP_hy2wy
SQL> SP_RPS_ADD_GROUP('REP_GRP_hy2wy', '主从同步复制');
DMSQL executed successfully
used time: 6.109(ms). Execute id is 55.
SQL> select * from SYSREP.RPS_GROUPS;
LINEID NAME ID DESC$
---------- ------------- ----------- ------------
1 REP_GRP_hy2wy 2 主从同步复制
used time: 1.182(ms). Execute id is 56.
开始设置
SQL> SP_RPS_SET_BEGIN('REP_GRP_hy2wy');
DMSQL executed successfully
used time: 0.530(ms). Execute id is 57.
添加复制关系
SQL> SP_RPS_ADD_REPLICATION ('REP_GRP_hy2wy', 'REPhy2wy', 'hy到wy的同步复制', 'hy', 'wy', NULL, '/dm_home/dmdba/dmdbms/dmreplog');
DMSQL executed successfully
used time: 2.623(ms). Execute id is 58.
添加模式级复制
添加复制映射, 注意这里用户名和表名要大写,否则会提示对象不存在
SQL> SP_RPS_ADD_SCH_MAP('REPhy2wy','hy','wy',0);
SP_RPS_ADD_SCH_MAP('REPhy2wy','hy','wy',0);

used time: 1.738(ms). Execute id is 0.
SQL> SP_RPS_ADD_SCH_MAP('REPhy2wy','HY','WY',0);
DMSQL executed successfully
used time: 3.126(ms). Execute id is 6.
提交设置
SQL> SP_RPS_SET_APPLY();
DMSQL executed successfully
used time: 00:00:05.041. Execute id is 7.
SQL> select * from SYSREP.RPS_REPLICATIONS;
LINEID REP_NAME GRP_ID REP_ID MINST_ID SINST_ID ARCH_DIR FAULT_TIMEOUT VALID_FLAG FAULT_TIME SYNC_FLAG TIMER_NAME DESC$
---------- -------- ----------- ----------- ----------- ----------- ------------------------------ ------------- ----------- --------------------------- ----------- ---------- ----------------
1 REPhy2wy 2 3 5 6 /dm_home/dmdba/dmdbms/dmreplog -1 0 NULL 1 NULL hy到wy的同步复制
used time: 1.362(ms). Execute id is 8.
SQL> select * from SYSREP.RPS_INSTANCES;
LINEID INST_NAME GRP_ID INST_ID FAULT_TIMEOUT VALID_FLAG FAULT_TIME NET_VALID_FLAG NET_FAULT_TIME
---------- --------- ----------- ----------- ------------- ----------- --------------------------- -------------- ---------------------------
1 hy 2 5 -1 0 NULL 0 NULL
2 wy 2 6 -1 0 NULL 0 NULL
used time: 0.981(ms). Execute id is 9.
SQL> select * from SYSREP.RPS_TABMAPS;
LINEID REP_ID MSCH_NAME MTAB_NAME MSCH_ID MTAB_ID SSCH_NAME STAB_NAME SSCH_ID STAB_ID READONLY_MODE
---------- ----------- --------- --------- ----------- ----------- --------- --------- ----------- ----------- -------------
1 3 HY NULL 150995951 -1 WY NULL 150995951 -1 0
used time: 1.178(ms). Execute id is 10.
SQL>
至此,模式级复制配置完成。注意一点,DM的复制配置必须在开始复制配置之前执行SP_RPS_SET_BEGIN,配置完成之后执行SP_RPS_SET_APPLY提交。
验证同步
先测试DML操作:在主库insert 数据:
SQL> insert into t1 values(1,'hy1');
affect rows 1
used time: 1.565(ms). Execute id is 6.
SQL> commit;
executed successfully
used time: 1.442(ms). Execute id is 7.
SQL> select * from t1;
LINEID ID USERNAME
---------- -- --------
1 1 hy1
used time: 0.548(ms). Execute id is 8.
从库查询,同步成功:
SQL> select * from t1;
LINEID ID USERNAME
---------- -- --------
1 1 hy1
used time: 2.538(ms). Execute id is 5.
在主库上的hy用户下创建一个测试表t2
SQL> create table t2 as select * from sysobjects;
executed successfully
used time: 12.763(ms). Execute id is 6.
SQL> select count(*) from t2;
LINEID COUNT(*)
---------- --------------------
1 1480
used time: 1.266(ms). Execute id is 7.
在从库上的wy用户查询这个表t2
SQL> select count(*) from t2;
LINEID COUNT(*)
---------- --------------------
1 1480
used time: 0.463(ms). Execute id is 8.
可以看到创建表的DDL语句已经同步到wy用户下。
因为我这里的复制从库是0级,就是非只读的,删除后重新添加1级,即只读模式在测试:
SQL> SP_RPS_SET_BEGIN('REP_GRP_hy2wy');
DMSQL executed successfully
used time: 0.408(ms). Execute id is 12.
SQL> SP_RPS_DROP_SCH_MAP('REPhy2wy','HY','WY');
DMSQL executed successfully
used time: 1.456(ms). Execute id is 13.
SQL> SP_RPS_ADD_SCH_MAP('REPhy2wy','HY','WY',1);
DMSQL executed successfully
used time: 2.820(ms). Execute id is 14.
SQL> SP_RPS_SET_APPLY();
DMSQL executed successfully
used time: 00:00:05.039. Execute id is 15.
再测试
从主库的hy用户中创建表t3
SQL> create table t3 as select * from sysobjects;
executed successfully
used time: 9.925(ms). Execute id is 9.
SQL> select count(*) from t3;
LINEID COUNT(*)
---------- --------------------
1 1480
used time: 0.861(ms). Execute id is 10.
在从库上的wy用户下查询表t3显示不存在
SQL> select count(*) from t3;
select count(*) from t3;

Invalid table or view name [T3].
used time: 0.774(ms). Execute id is 0.
从测试结果可以看到在只读模式下的模式级复制不能同步DDL操作。

目录
相关文章
|
1月前
|
机器学习/深度学习 设计模式 人工智能
TinyAI :全栈式轻量级 AI 框架
一个完全用Java实现的全栈式轻量级AI框架,TinyAI IS ALL YOU NEED。
TinyAI :全栈式轻量级 AI 框架
|
7月前
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
267 10
|
9月前
|
编解码 安全 JavaScript
《深入剖析鸿蒙生态原生应用:一次开发多端部署的技术革新》
鸿蒙生态通过“一次开发多端部署”技术,重新定义了应用开发模式。基于ArkTS语言与ArkUI框架,结合HUAWEI DevEco Studio工具,开发者可高效构建跨设备应用,实现无缝流转与协同工作。这一技术不仅降低了开发成本,提升了用户体验,还推动了全场景智能生态的繁荣。尽管面临性能优化与安全保护等挑战,但随着技术进步,鸿蒙将引领万物互联新时代,带来更智能便捷的生活体验。
312 0
|
11月前
|
机器学习/深度学习 算法 PyTorch
昇腾910-PyTorch 实现 GoogleNet图像分类
本实验基于PyTorch在昇腾平台上实现GoogleNet模型,针对CIFAR-10数据集进行图像分类。内容涵盖GoogleNet的创新点(如Inception模块、1x1卷积、全局平均池化等)、网络架构解析及代码实战分析。通过详细讲解模型搭建、数据预处理、训练与测试过程,帮助读者掌握如何使用经典CNN模型进行高效图像分类。实验中还介绍了辅助分类器、梯度传播优化等技术细节,并提供了完整的训练和测试代码示例。
|
12月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
240 1
Java—多线程实现生产消费者
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
282 0
|
Ubuntu Linux
在Linux中,如何查看当前系统的版本信息?
在Linux中,如何查看当前系统的版本信息?
|
机器学习/深度学习 算法 IDE
一行代码加速sklearn运算上千倍
一行代码加速sklearn运算上千倍
292 0
|
安全 Linux Shell
在Linux中,如何修改系统打开最大句柄数?
在Linux中,如何修改系统打开最大句柄数?
|
消息中间件 Java
Java一分钟之-RabbitMQ:AMQP协议实现
【6月更文挑战第11天】RabbitMQ是基于AMQP协议的开源消息队列服务,支持多种消息模式。本文介绍了RabbitMQ的核心概念:生产者、消费者、交换器、队列和绑定,以及常见问题和解决方案。例如,通过设置消息持久化和确认机制防止消息丢失,配置死信队列处理不可消费消息,以及妥善管理资源防止泄漏。还提供了Java代码示例,帮助读者理解和使用RabbitMQ。通过理解这些基础和最佳实践,可以提升RabbitMQ在分布式系统中的可靠性和效率。
315 0
Java一分钟之-RabbitMQ:AMQP协议实现