DM7数据复制中模式级复制的配置及用法是什么

58次阅读
没有评论

共计 10515 个字符,预计需要花费 27 分钟才能阅读完成。

DM7 数据复制中模式级复制的配置及用法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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。

2. 参数设置
修改 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);
[-8713]:source table is not exists.
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;
[-2106]:Error in line: 1
Invalid table or view name [T3].
used time: 0.774(ms). Execute id is 0.

从测试结果可以看到在只读模式下的模式级复制不能同步 DDL 操作。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-18发表,共计10515字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)