在之前的博客我们了解了DM 数据复制的相关概念和配置存储过程,如下:
DM7 达梦数据库 数据复制概念 及 配置存储过程 说明
https://www.cndba.cn/dave/article/3648
DM 的数据复制可以在表级,模式级和库级进行配置,本篇我们看下表级数据复制的配置过程。
下面举一个简单的例子来说明数据复制的配置。
1 准备工作
参与复制的复制实例的信息如下表所示。
| 数据库 | 实例名 | IP地址 | 数据库端口号 | MAL端口号 | 文件目录 |
|---|---|---|---|---|---|
| 复制数据库 | China | 192.168.20.191 | 5236 | 5241 | /dm/dmdbms/data |
| 主数据库 | AnQing | 192.168.20.192 | 5236 | 5242 | /dm/dmdbms/data |
| 从数据库 | HeFei | 192.168.20.193 | 5236 | 5243 | /dm/dmdbms/data |
假设 AnQing 上的表AnQing.T1 与HeFei 上的表HeFei.T1表结构完全相同。
创建AnQing 上 AnQing.T1表到 HeFei 上HeFei.T1 表的同步复制关系,其名称为REPAnQing2HeFei。
实例的创建参考我的博客,如下,这里不在描述:
DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580
2 参数设置
2.1 配置dm.ini 文件
修改3台DM数据库的dm.ini 文件,添加如下内容:
| 数据库 | dm.ini 设置 |
|---|---|
| 复制数据库 | INSTANCE_NAME = China PORT_NUM = 5236 MAL_INI = 1 |
| 主数据库 | INSTANCE_NAME = AnQing PORT_NUM = 5236 MAL_INI = 1 |
| 从数据库 | INSTANCE_NAME = HeFei PORT_NUM = 5236 MAL_INI = 1 |
2.2 配置dmmal.ini 文件
修改dmmal.ini文件,添加如下内容。Dmmal 配置文件默认没有,可以从示例目录下复制过来修改。
[dave@www.cndba.cn1 ini_script]$ pwd
/dm/dmdbms/samples/ini_script
[dave@www.cndba.cn1 ini_script]$ ll
总用量 48
-rwxr-xr-x 1 dmdba dinstall 890 2月 23 2029 dmarch_example.ini
-rwxr-xr-x 1 dmdba dinstall 1966 2月 23 2029 dmdcr_cfg_example.ini
-rwxr-xr-x 1 dmdba dinstall 631 2月 23 2029 dmdcr_example.ini
-rwxr-xr-x 1 dmdba dinstall 1537 2月 23 2029 dminit_example.ini
-rwxr-xr-x 1 dmdba dinstall 2070 2月 23 2029 dmmal_example.ini
-rwxr-xr-x 1 dmdba dinstall 1277 2月 23 2029 dmmonitor_example.ini
-rwxr-xr-x 1 dmdba dinstall 288 2月 23 2029 dmmpp_example.ini
-rwxr-xr-x 1 dmdba dinstall 1679 2月 23 2029 dmtimer_example.ini
-rwxr-xr-x 1 dmdba dinstall 2146 2月 23 2029 dmwatcher_example.ini
-rwxr-xr-x 1 dmdba dinstall 1241 2月 23 2029 dmwatch_example.ini
-rwxr-xr-x 1 dmdba dinstall 522 2月 23 2029 dmwmon_example.ini
-rwxr-xr-x 1 dmdba dinstall 636 2月 23 2029 sqllog_example.ini
[dave@www.cndba.cn1 ini_script]$
每个站点的 dmmal.ini 配置必须一致,我们这里直接touch文件并粘贴内容:
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_China]
MAL_INST_NAME = China
MAL_HOST = 192.168.20.191
MAL_PORT = 5241
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.20.191
[MAL_AnQing]
MAL_INST_NAME = AnQing
MAL_HOST = 192.168.20.192
MAL_PORT = 5242
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.20.192
[MAL_HeFei]
MAL_INST_NAME = HeFei
MAL_HOST = 192.168.20.193
MAL_PORT = 5243
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.20.193
3 复制数据库初始化
配置数据复制在 RPS(复制数据库:China) 上进行,在配置数据复制之前,需要保证复制数据库和所有待配置节点的实例名各不相同,配置好其 MAL 系统并保证网络环境正常。按照复制组、复制关系、复制表映射的顺序配置复制环境。
注意:MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。
如果是第一次使用复制数据库,需要对复制数据库(China)执行初始化操作。通过执行系统函数SP_INIT_REP_SYS(create_flag)来初始化复制数据库。SP_INIT_REP_SYS 的参数create_flag 为 1 时表示创建用户和系统表,为 0 时表示删除用户和系统表。
执行系统函数 SP_INIT_REP_SYS(1)创建的复制用户SYSREP,该用户默认密码也是SYSREP,具有RESOURCE的角色。
创建的7张复制系统表如下:
1)复制组表(SYSREP.RPS_GROUPS)
2)复制节点实例表(SYSREP.RPS_INSTANCES)
3)复制关系表(SYSREP.RPS_REPLICATIONS)
4)复制映射表( SYSREP.RPS_TABMAPS)
5)故障历史表(SYSREP.REP_FAULT_HISTORY)
6)冲突历史表( SYSREP.RPS_CONFLICTS)
7)复制定时器表(SYSREP.RPS_TIMERS)
开始初始化:
SQL> SP_INIT_REP_SYS(1);
DMSQL executed successfully
used time: 20.316(ms). Execute id is 835.
SQL>
SQL> conn SYSREP/SYSREP
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 9.226(ms)
SQL>
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: 32.359(ms). Execute id is 837.
SQL>
4 配置表级复制
配置复制涉及到存储过程说明可以参考如下博客:
DM7 达梦数据库 数据复制概念 及 配置存储过程 说明
https://www.cndba.cn/dave/article/3648
这里看具体的配置步骤。
4.1 启动DB
启动 3 台数据库,启动的顺序不分先后。
[dave@www.cndba.cn2 AnQing]$ service DmServiceAnQing start
Starting DmServiceAnQing: [ OK ]
[dave@www.cndba.cn2 AnQing]$
[dave@www.cndba.cn3 HeFei]$ service DmServiceHeFei start
Starting DmServiceHeFei: [ OK ]
[dave@www.cndba.cn3 HeFei]$
4.2 配置表级复制
登录 RPS (China),配置复制:
#创建复制组 REP_GRP_B2C
SQL> SP_RPS_ADD_GROUP('REP_GRP_AnQing2HeFei', '主从同步复制');
DMSQL executed successfully
used time: 40.909(ms). Execute id is 838.
SQL>
#开始设置
SQL> SP_RPS_SET_BEGIN('REP_GRP_AnQing2HeFei');
DMSQL executed successfully
used time: 0.733(ms). Execute id is 839.
#添加复制关系
SQL> SP_RPS_ADD_REPLICATION ('REP_GRP_AnQing2HeFei', 'REPAnQing2HeFei', 'AnQing 到 HeFei 的同步复制', 'AnQing', 'HeFei', NULL, '/dm/dmreplog');
DMSQL executed successfully
used time: 6.277(ms). Execute id is 840.
SQL>
#添加复制映射,注意这里用户名和表名要大写,否则会提示对象不存在:
SQL> SP_RPS_ADD_TAB_MAP('REPAnQing2HeFei', 'ANQING', 'T1', 'HEFEI', 'T1', 0);
DMSQL executed successfully
used time: 3.869(ms). Execute id is 845.
SQL>
#提交设置
SQL> SP_RPS_SET_APPLY();
DMSQL executed successfully
used time: 00:00:05.287. Execute id is 846.
至此,表复制完成。注意一点,DM的复制配置必须在开始复制配置之前执行SP_RPS_SET_BEGIN,配置完成之后执行SP_RPS_SET_APPLY提交。
若需要删除复制组,则该复制组不能处于配置阶段,即该组的配置已经提交或取消。
我们配置的是同步的复制,如果想改成异步同步可以添加个计时器,比如:
SP_RPS_ADD_TIMER('B2C_TIMER','',1,0,0,0,'19:50:33',NULL,'2011-08-2419:50:33',NULL,1);
SP_RPS_REP_RESET_TIMER('REPB2C','B2C_TIMER');
其他的复制配置比如对修改复制组,修改复制关系,删除映射等可以参考之前的博客:
DM7 达梦数据库 数据复制概念 及 配置存储过程 说明
https://www.cndba.cn/dave/article/3648
4.3 验证同步
#主库的逻辑日志:
[dave@www.cndba.cn2 dmreplog]$ pwd
/dm/dmreplog
[dave@www.cndba.cn2 dmreplog]$ ll
total 4
-rw-r--r-- 1 dmdba dinstall 48 Mar 6 05:16 llog_arch_file_20290306051620.log
[dave@www.cndba.cn2 dmreplog]$
#主库对T1表插入数据:
SQL> select count(1) from t1;
LINEID COUNT(1)
---------- --------------------
1 1276
used time: 1.933(ms). Execute id is 842.
SQL> insert into T1 select * from sysobjects;
affect rows 1276
used time: 13.047(ms). Execute id is 843.
SQL> commit;
executed successfully
used time: 2.711(ms). Execute id is 844.
SQL> select count(1) from t1;
LINEID COUNT(1)
---------- --------------------
1 2552
used time: 0.411(ms). Execute id is 845.
SQL>
#从库查询: 同步成功,主库之前的数据无法同步过来,只对后来操作的数据有效:
SQL> select count(1) from t1;
LINEID COUNT(1)
---------- --------------------
1 1276
used time: 0.422(ms). Execute id is 2116.
SQL>
我们在主库删除T1表的所有数据测试:
SQL> truncate table t1;
executed successfully
used time: 4.391(ms). Execute id is 846.
SQL>
#从库的所有数据也删除了:
SQL> select count(1) from t1;
LINEID COUNT(1)
---------- --------------------
1 0
used time: 1.040(ms). Execute id is 2119.
SQL>
查看从库的逻辑日志为空:
[dave@www.cndba.cn3 dmreplog]$ pwd
/dm/dmreplog
[dave@www.cndba.cn3 dmreplog]$ ls
即在整个复制的环境中,逻辑日志仅存在源库。
5 监控数据复制状态
复制节点的系统状态在 SYSREP.RPS_INSTANCES 中 VALID_FLAG 字段;网络状态在 SYSREP.RPS_INSTANCES 表的 NET_VALID_FLAG 字段。
复制关系的状态在 SYSREP.RPS_REPLICATIONS 中的 VALID_FLAG 字段表示。
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 REPAnQing2HeFei 1 1 1 2 /dm/dmreplog -1 0 NULL 1 NULL
AnQing 到 HeFei 的同步复制
used time: 0.918(ms). Execute id is 865.
SQL>
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 AnQing 1 1 -1 0 NULL 0 NULL
2 HeFei 1 2 -1 0 NULL 0 NULL
used time: 1.570(ms). Execute id is 866.
SQL>
状态的含义如下表:
若复制结点或复制关系发生异常都会记录在SYSREP.RPS_FAULT_HISTORY 表。若其 END_TIME 字段为 NULL,表示该故障还没有结束,需尽快检查复制节点的状态及其网络连接。通过对SYSREP.RPS_FAULT_HISTORY 表的删除和查询来实现错误记录的管理。
SQL> select * from SYSREP.RPS_FAULT_HISTORY;
no rows
used time: 1.238(ms). Execute id is 867.
SQL>
在复杂的复制过程中,比如多对一或多对多的复制环境,可能出现数据冲突。数据冲突发生后,从数据库会将其记录在相应的日志中,RPS 每隔固定时间会轮询所有结点,收集其间产生的数据冲突记录并将其插入到 SYSREP.RPS_CONFLICTS 表中,管理员可以通过查询该表来查看。
SQL> select * from SYSREP.RPS_CONFLICTS;
no rows
used time: 1.597(ms). Execute id is 868.
SQL>
版权声明:本文为博主原创文章,未经博主允许不得转载。



