暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM7数据复制之数据库级复制

原创 敬勇 2020-02-26
497

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: 32.545(ms). Execute id is 26.
SQL> select * from SYSREP.RPS_GROUPS;

LINEID NAME ID DESC$


1 REP_GRP_hy2wy 3 主从同步复制

used time: 1.073(ms). Execute id is 27.
开始设置

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.529(ms). Execute id is 29.
添加数据库级复制

SQL> SP_RPS_ADD_DB_MAP(‘REPhy2wy’, 0);
DMSQL executed successfully
used time: 0.597(ms). Execute id is 30.
提交设置

SQL> SP_RPS_SET_APPLY();
DMSQL executed successfully
used time: 00:00:05.035. Execute id is 31.

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 3 4 7 8 /dm_home/dmdba/dmdbms/dmreplog -1 0 NULL 1 NULL hy到wy的同步复制

used time: 1.277(ms). Execute id is 32.
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 3 7 -1 0 NULL 0 NULL
2 wy 3 8 -1 0 NULL 0 NULL

used time: 1.014(ms). Execute id is 33.
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 4 NULL NULL -1 -1 NULL NULL -1 -1 0

used time: 1.129(ms). Execute id is 34.
至此,数据库级复制配置完成。注意一点,DM的复制配置必须在开始复制配置之前执行SP_RPS_SET_BEGIN,配置完成之后执行SP_RPS_SET_APPLY提交。

验证同步
在主库上的hy用户下创建一个测试表t4

SQL> create table t4 as select * from sysobjects;
executed successfully
used time: 12.280(ms). Execute id is 12.
SQL> select count(*) from t4;

LINEID COUNT(*)


1 1480

used time: 1.256(ms). Execute id is 13.
在从库上的wy用户查询这个表t4

SQL> select count() from t4;
select count(
) from t4;
[-2106]:Error in line: 1
Invalid table or view name [T4].
used time: 0.423(ms). Execute id is 0.
可以看到创建表的DDL语句没有同步到wy用户下。

在主库上创建用户jy

SQL> create user jy identified by “abcd”;
executed successfully
used time: 4.940(ms). Execute id is 5.
SQL> grant dba,resource to jy;
executed successfully
used time: 2.929(ms). Execute id is 6.
在从库上登录用户jy

[dmdba@jydm3 bin]$ ./disql jy/abcd
[-70028]:Create SOCKET connection failure.
disql V7.1.6.46-Build(2018.02.08-89107)ENT
username:
从从库上的日志可以看到故障信息

2019-12-20 00:15:08 [WARNING] database P0000029732 main_thread rps sys init failed, code:-8748
从复制数据库上查看复制故障信息

SQL> select * from SYSREP.RPS_FAULT_HISTORY;

LINEID GRP_NAME OBJ_NAME FAULT_TYPE START_TIME END_TIME


1 REP_GRP_hy2wy REPhy2wy REPLICATION FAULT 2019-12-20 00:14:23.366210 2019-12-20 00:15:24.042032
2 REP_GRP_hy2wy wy INSTANCE SYS FAULT 2019-12-20 00:14:23.366210 2019-12-20 00:15:24.042032
3 REP_GRP_hy2wy REPhy2wy REPLICATION FAULT 2019-12-20 00:16:23.386842 NULL
4 REP_GRP_hy2wy wy INSTANCE SYS FAULT 2019-12-20 00:16:23.386842 NULL

used time: 1.179(ms). Execute id is 4.
从测试结果可以看到数据库级的数据复制不支持DDL,数据库的数据复制对创建用户的操作处理异常,会导致从库奔溃。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论