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。

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@shard1ini_script]#pwd/dm_home/dmdba/dmdbms/samples/ini_script[root@shard1ini_script]#ls-lrt总用量48-rwxr-xr-x1dmdbadinstall8902月142019dmarch_example.ini-rwxr-xr-x1dmdbadinstall19662月142019dmdcr_cfg_example.ini-rwxr-xr-x1dmdbadinstall6312月142019dmdcr_example.ini-rwxr-xr-x1dmdbadinstall15372月142019dminit_example.ini-rwxr-xr-x1dmdbadinstall20702月142019dmmal_example.ini-rwxr-xr-x1dmdbadinstall12772月142019dmmonitor_example.ini-rwxr-xr-x1dmdbadinstall2882月142019dmmpp_example.ini-rwxr-xr-x1dmdbadinstall16792月142019dmtimer_example.ini-rwxr-xr-x1dmdbadinstall12412月142019dmwatch_example.ini-rwxr-xr-x1dmdbadinstall21462月142019dmwatcher_example.ini-rwxr-xr-x1dmdbadinstall5222月142019dmwmon_example.ini-rwxr-xr-x1dmdbadinstall6362月142019sqllog_example.ini

在每个数据库服务器上创建一个dmmal.ini文件,每个dmmal.ini 配置必须一致:

MAL_CHECK_INTERVAL=5MAL_CONN_FAIL_INTERVAL=5[MAL_jydm]MAL_INST_NAME=jydmMAL_HOST=10.10.10.180MAL_PORT=5241MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.180[MAL_hy]MAL_INST_NAME=hyMAL_HOST=10.10.10.184MAL_PORT=5242MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.184[MAL_wy]MAL_INST_NAME=wyMAL_HOST=10.10.10.185MAL_PORT=5243MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.185[dmdba@shard1jydm]$catdmmal.iniMAL_CHECK_INTERVAL=5MAL_CONN_FAIL_INTERVAL=5[MAL_jydm]MAL_INST_NAME=jydmMAL_HOST=10.10.10.180MAL_PORT=5241MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.180[MAL_hy]MAL_INST_NAME=hyMAL_HOST=10.10.10.184MAL_PORT=5242MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.184[MAL_wy]MAL_INST_NAME=wyMAL_HOST=10.10.10.185MAL_PORT=5243MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.185[dmdba@jydm2hy]$catdmmal.iniMAL_CHECK_INTERVAL=5MAL_CONN_FAIL_INTERVAL=5[MAL_jydm]MAL_INST_NAME=jydmMAL_HOST=10.10.10.180MAL_PORT=5241MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.180[MAL_hy]MAL_INST_NAME=hyMAL_HOST=10.10.10.184MAL_PORT=5242MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.184[MAL_wy]MAL_INST_NAME=wyMAL_HOST=10.10.10.185MAL_PORT=5243MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.185[dmdba@jydm3wy]$catdmmal.iniMAL_CHECK_INTERVAL=5MAL_CONN_FAIL_INTERVAL=5[MAL_jydm]MAL_INST_NAME=jydmMAL_HOST=10.10.10.180MAL_PORT=5241MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.180[MAL_hy]MAL_INST_NAME=hyMAL_HOST=10.10.10.184MAL_PORT=5242MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.184[MAL_wy]MAL_INST_NAME=wyMAL_HOST=10.10.10.185MAL_PORT=5243MAL_INST_PORT=5236MAL_INST_HOST=10.10.10.185

对3个数据库都要启用mal_ini参数

SQL>sp_set_para_value(2,'MAL_INI',1);DMSQLexecutedsuccessfullyusedtime:7.465(ms).Executeidis23.

复制数据库初始化
如果是第一次使用复制数据库,需要对复制数据库执行初始化操作。通过执行系统函数SP_INIT_REP_SYS(create_flag)来初始化复制数据库。其主要作用是创建复制用户(SYSREP/SYSREP)和创建复制数据库上需要的系统表。SP_INIT_REP_SYS 的参数create_flag为1时表示创建用户和系统表,为0时表示删除用户和系统表。

开始初始化:

SQL>SP_INIT_REP_SYS(1);DMSQLexecutedsuccessfullyusedtime:115.960(ms).Executeidis30.SQL>connSYSREP/SYSREPServer[LOCALHOST:5236]:modeisnormal,stateisopenloginusedtime:9.684(ms)SQL>selecttable_namefromuser_tables;LINEIDTABLE_NAME---------------------------1RPS_GROUPS2RPS_INSTANCES3RPS_REPLICATIONS4RPS_TABMAPS5RPS_FAULT_HISTORY6RPS_CONFLICTS7RPS_TIMERS7rowsgotusedtime:170.443(ms).Executeidis31.

创建的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@shard1jydm]#systemctlstopDmServicejydm.service[root@shard1jydm]#systemctlstartDmServicejydm.service[root@jydm2~]#systemctlstopDmServicehy.service[root@jydm2~]#systemctlstartDmServicehy.service[root@jydm3~]#systemctlstopDmServicewy.service[root@jydm3~]#systemctlstartDmServicewy.service

登录复制数据库(RPS jydm),保证服务器状态为OPEN,开始复制配置。

[dmdba@shard1bin]$./disqlsysdba/abcdServer[LOCALHOST:5236]:modeisnormal,stateisopenloginusedtime:9.851(ms)disqlV7.1.6.46-Build(2018.02.08-89107)ENTConnectedto:DM7.1.6.46

创建复制组REP_GRP_hy2wy

SQL>SP_RPS_ADD_GROUP('REP_GRP_hy2wy','主从同步复制');DMSQLexecutedsuccessfullyusedtime:32.545(ms).Executeidis26.SQL>select*fromSYSREP.RPS_GROUPS;LINEIDNAMEIDDESC$----------------------------------------------1REP_GRP_hy2wy3主从同步复制usedtime:1.073(ms).Executeidis27.

开始设置

SQL>SP_RPS_SET_BEGIN('REP_GRP_hy2wy');DMSQLexecutedsuccessfullyusedtime:0.530(ms).Executeidis57.

添加复制关系

SQL>SP_RPS_ADD_REPLICATION('REP_GRP_hy2wy','REPhy2wy','hy到wy的同步复制','hy','wy',NULL,'/dm_home/dmdba/dmdbms/dmreplog');DMSQLexecutedsuccessfullyusedtime:2.529(ms).Executeidis29.

添加数据库级复制

SQL>SP_RPS_ADD_DB_MAP('REPhy2wy',0);DMSQLexecutedsuccessfullyusedtime:0.597(ms).Executeidis30.

提交设置

SQL>SP_RPS_SET_APPLY();DMSQLexecutedsuccessfullyusedtime:00:00:05.035.Executeidis31.SQL>select*fromSYSREP.RPS_REPLICATIONS;LINEIDREP_NAMEGRP_IDREP_IDMINST_IDSINST_IDARCH_DIRFAULT_TIMEOUTVALID_FLAGFAULT_TIMESYNC_FLAGTIMER_NAMEDESC$------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1REPhy2wy3478/dm_home/dmdba/dmdbms/dmreplog-10NULL1NULLhy到wy的同步复制usedtime:1.277(ms).Executeidis32.SQL>select*fromSYSREP.RPS_INSTANCES;LINEIDINST_NAMEGRP_IDINST_IDFAULT_TIMEOUTVALID_FLAGFAULT_TIMENET_VALID_FLAGNET_FAULT_TIME-------------------------------------------------------------------------------------------------------------------------------------1hy37-10NULL0NULL2wy38-10NULL0NULLusedtime:1.014(ms).Executeidis33.SQL>select*fromSYSREP.RPS_TABMAPS;LINEIDREP_IDMSCH_NAMEMTAB_NAMEMSCH_IDMTAB_IDSSCH_NAMESTAB_NAMESSCH_IDSTAB_IDREADONLY_MODE------------------------------------------------------------------------------------------------------------------14NULLNULL-1-1NULLNULL-1-10usedtime:1.129(ms).Executeidis34.

至此,数据库级复制配置完成。注意一点,DM的复制配置必须在开始复制配置之前执行SP_RPS_SET_BEGIN,配置完成之后执行SP_RPS_SET_APPLY提交。

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

SQL>createtablet4asselect*fromsysobjects;executedsuccessfullyusedtime:12.280(ms).Executeidis12.SQL>selectcount(*)fromt4;LINEIDCOUNT(*)------------------------------11480usedtime:1.256(ms).Executeidis13.

在从库上的wy用户查询这个表t4

SQL>selectcount(*)fromt4;selectcount(*)fromt4;[-2106]:Errorinline:1Invalidtableorviewname[T4].usedtime:0.423(ms).Executeidis0.

可以看到创建表的DDL语句没有同步到wy用户下。

在主库上创建用户jy

SQL>createuserjyidentifiedby"abcd";executedsuccessfullyusedtime:4.940(ms).Executeidis5.SQL>grantdba,resourcetojy;executedsuccessfullyusedtime:2.929(ms).Executeidis6.

在从库上登录用户jy

[dmdba@jydm3bin]$./disqljy/abcd[-70028]:CreateSOCKETconnectionfailure.disqlV7.1.6.46-Build(2018.02.08-89107)ENTusername:

从从库上的日志可以看到故障信息

2019-12-2000:15:08[WARNING]databaseP0000029732main_threadrpssysinitfailed,code:-8748

从复制数据库上查看复制故障信息

SQL>select*fromSYSREP.RPS_FAULT_HISTORY;LINEIDGRP_NAMEOBJ_NAMEFAULT_TYPESTART_TIMEEND_TIME-------------------------------------------------------------------------------------------------------1REP_GRP_hy2wyREPhy2wyREPLICATIONFAULT2019-12-2000:14:23.3662102019-12-2000:15:24.0420322REP_GRP_hy2wywyINSTANCESYSFAULT2019-12-2000:14:23.3662102019-12-2000:15:24.0420323REP_GRP_hy2wyREPhy2wyREPLICATIONFAULT2019-12-2000:16:23.386842NULL4REP_GRP_hy2wywyINSTANCESYSFAULT2019-12-2000:16:23.386842NULLusedtime:1.179(ms).Executeidis4.

从测试结果可以看到数据库级的数据复制不支持DDL,数据库的数据复制对创建用户的操作处理异常,会导致从库奔溃。

看完上述内容,你们掌握DM7数据复制中数据库级复制的原理及用法是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!