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@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,数据库的数据复制对创建用户的操作处理异常,会导致从库奔溃。

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@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操作。

DM7数据复制之表级复制

达梦数据复制(DATA REPLICATION)是一个分担系统访问压力、加快异地访问响应速度、提高数据可靠性的解决方案。将一个服务器实例上的数据变更复制到另外的服务器实例。可以用于解决大、中型应用中出现的因来自不同地域、不同部门、不同类型的数据访问请求导致数据库服务器超负荷运行、网络阻塞、远程用户的数据响应迟缓的问题。

重要概念
1. 数据库状态
服务器的状态,在不同的状态下,对能够进行的操作有不同的限制。详见数据守护部分。
2. 主服务器
发起复制操作的服务器,称为主服务器。
3. 从服务器
接收主服务器发送的数据并进行复制的服务器,称为从服务器。
4. 复制节点
涉及到复制的服务器,主服务和从服务的统称。一个节点既可以是主服务器也可以是从服务器。
5. 复制服务器(RPS)
在数据复制环境中,负责配置复制环境,定义复制关系的服务器。RPS有且仅有一台,它只负责配置和监控,并不参与到复制过程中。
6. 复制关系
复制关系指明主服务器和从服务器以何种方式进行复制。按照复制的方式,复制关系分为同步复制和异步复制。
7. 同步复制关系
主服务器数据更新立即复制到从服务器。
8. 异步复制关系
主服务器和从服务器在某段时间内数据可能是不同的,主服务器数据更新不会立刻同步到从服务器,而是在经过一段时间后才进行复制。异步复制的同步时机由指定的定时器确定。
9. 逻辑日志
记录产生数据变化的逻辑操作的日志。记录的逻辑操作包括INSERT、UPDATE、DELETE、TRUNCATE、ROLLBACK和COMMIT。
10. 复制源对象
主服务器上作为复制数据源的对象,可以是库、模式或表。在该对象上的操作都会被记录成逻辑日志,发送给从服务器进行复制操作。

11. 复制目标对象
从服务器上作为复制数据目标的对象。从服务器接收到逻辑日志后,将复制源对象的变化复制到复制目标对象中。

12. 复制对象映射
一对复制源对象和复制目标对象构成一个复制对象映射。构成映射的源对象和目标对象必须是同一类型的对象。根据对象的类型,复制映射分为库级、模式级和表级三个级别。其中表级要求源表和目标表结构完全一致,库级和模式级没有要求。库级和模式级复制映射会将其DDL也进行复制。复制映射包括只读模式和非只读模式。对于只读模式的映射,映射的目的表禁止用户更新。
13. 复制组
一组逻辑相关的复制关系可以构造成为复制组。通过复制组,可以构造出一对多复制、多对一复制、级联复制、对称复制、循环复制等复杂的逻辑复制环境。

体系构架
数据复制系统由以下部件构成:
1. 复制服务器;
2. 复制节点;
3. 各实例站点间通讯的MAL系统。

除了系统管理员通过复制服务器定义复制和处理异常外,其他部分的处理及主从服务器之间复制操作对于用户是透明的。整个复制环境的配置境况如下图所示。

在整个环境中有且仅有一台复制服务器(RPS),用户通过RPS定义复制及复制环境,但RPS并不参与到复制过程中。
DM7中,将复制逻辑日志按照配置归档到本站点指定目录称为本地归档,将日志的发送称为日志的远程归档。
复制节点上,与复制相关的配置文件有dmtimer.ini、dmllog.ini、dmrep.ini。各个配置文件在复制中的功能如下表所示

这些文件均是RPS依据用户配置通过MAL系统自动生成或修改的,管理员不需要手动进行管理。

在数据复制过程中,除了配置文件,其他的重要文件如下表。

这些文件都是流式文件,主服务器在执行过程中,逻辑日志先记录到逻辑日志文件中,并根据配置的信息,将逻辑日志分别分发归档到不同的逻辑日志归档文件中,并在恰当的时机将逻辑日志归档文件的内容发送给从服务器。

从服务器接收到一批数据就产生一个复制数据文件将数据存储其中,防止从服务器复制速度低导致复制数据的丢失。
逻辑日志文件大小限制为32M,两个文件交替使用。

归档路径内每个逻辑日志归档文件大小限制为32M,文件写满后增加新文件来存放新的记录。在dmllog.ini中有配置归档路径内所有文件总的空间限制,若达到限制的空间,则会删除之前的文件;若配置为无空间限制,则管理员可根据复制情况进行删除。

复制数据文件是从服务器一次接收的复制数据的临时文件,其大小不会超过32K;在其数据复制结束后会被自动删除。

配置数据复制在RPS上进行,与数据复制相关的过程如下:
1. SP_INIT_REP_SYS*
定义:
SP_INIT_REP_SYS(
CREATE_FLAG INT
);
功能说明:
创建或删除数据复制所需的系统表
参数说明:
CREATE_FLAG:为1表示创建复制所需系统表;为0表示删除这些系统表
返回值:

举例说明:
创建复制所需的系统表
SP_INIT_REP_SYS(1);

2. SP_RPS_ADD_GROUP
定义:
SP_RPS_ADD_GROUP(
GROUP_NAME VARCHAR(128),
GROUP_DESC VARCHAR(1000)
);
功能说明:
创建复制组
参数说明:
GROUP_NAME:创建的复制组名称
GROUP_DESC:复制组描述
返回值:

备注:
指示RPS创建一个新的复制组。如果已存在同名复制组则报错。
举例说明:
创建复制组REP_GRP_B2C
SP_RPS_ADD_GROUP(‘REP_GRP_B2C’,’主从同步复制’);

3. SP_RPS_DROP_GROUP
定义:
SP_RPS_DROP_GROUP(
GROUP_NAME VARCHAR(128)
);
功能说明:
删除复制组
参数说明:
GROUP_NAME:复制组名称
返回值:

举例说明:
删除复制组REP_GRP_B2C
SP_RPS_DROP_GROUP (‘REP_GRP_B2C’);

4. SP_RPS_ADD_REPLICATION
定义:
SP_RPS_ADD_REPLICATION(
GRP_NAME VARCHAR(128),
REP_NAME VARCHAR(128),
REP_DESC VARCHAR(1000),
MINSTANCE VARCHAR(128),
SINSTANCE VARCHAR(128),
REP_TIMER VARCHAR(128),
ARCH_PATH VARCHAR(256)
);
功能说明:
创建复制关系
参数说明:
GRP_NAME:复制组名
REP_NAME:复制名,必须在RPS上唯一
REP_DESC:复制描述
MINSTANCE:主节点实例名,必须在RPS的MAL中已配置
SINSTANCE:从节点实例名,必须在RPS的MAL中已配置
REP_TIMER:复制定时器名。借助定时器,可以设置复制数据的同步时机。如果是同步复制则为NULL
ARCH_PATH:主服务器上逻辑日志的完整归档路径。
返回值:

举例说明:
创建复制关系
SP_RPS_ADD_REPLICATION (‘REP_GRP_B2C’, ‘REPB2C’, ‘B到C的同步复制’, ‘B’, ‘C’, NULL, ‘{ DEFARCHPATH}\REPB2C’);

5. SP_RPS_DROP_REPLICATION
定义:
SP_RPS_DROP_REPLICATION (
REP_NAME VARCHAR(128)
);
功能说明:
删除复制关系
参数说明:
REP_NAME:复制名称
返回值:

举例说明:
删除复制关系
SP_RPS_DROP_REPLICATION (‘REPB2C’);

6. SP_RPS_SET_ROUTE_FAULT_TIMEOUT
定义:
SP_RPS_SET_ROUTE_FAULT_TIMEOUT (
REP_NAME VARCHAR(128),
TIMEOUTS INT
);
功能说明:
设置复制路径故障超时
参数说明:
REP_NAME:复制关系名。
TIMEOUTS:故障超时值,以秒为单位。0为立即超时;-1表示无超时限制返回值:

备注:
该接口用于设置复制路径故障处理策略。设置后,RPS如检测到复制路径产生故障,且故障持续超过设定的超时值后,则需要取消故障的复制关系。
举例说明:
设置复制路径故障超时
SP_RPS_SET_ROUTE_FAULT_TIMEOUT (‘REPB2C’,10);

7. SP_RPS_SET_INST_FAULT_TIMEOUT
定义:
SP_RPS_SET_INST_FAULT_TIMEOUT (
INST_NAME VARCHAR(128),
TIMEOUTS INT
);
功能说明:
设置复制节点故障超时
参数说明:
INST_NAME:复制节点实例名
TIMEOUTS:故障超时值,以秒为单位。0为立即超时;-1表示无超时限制
返回值:

举例说明:
设置复制节点故障超时
SP_RPS_SET_INST_FAULT_TIMEOUT (‘B’,10);

8. SP_RPS_ADD_TIMER
定义:
SP_RPS_ADD_TIMER(
TIMER_NAME VARCHAR(128),
TIMER_DESC VARCHAR(1000),
TYPE$ INT,
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 INT
);
功能说明:
设置复制关系的定时器
参数说明:
TIMER_NAME:定时器名
TIMER_DESC:定时器描述
TYPE$:定时器类型,取值如下:
1:执行一次
2:每日执行
3:每周执行
4:按月执行的第几天
5:按月执行的第一周
6:按月执行的第二周
7:按月执行的第三周
8:按月执行的第四周
9:按月执行的最后一周
FREQ_INTERVAL:间隔的月/周(调度类型决定)数
FREQ_SUB_INTERVAL: 间隔天数
FREQ_MINUTE_INTERVAL:间隔的分钟数
START_TIME:开始时间
END_TIME:结束时间
DURING_START_DATE:有效日期时间段的开始日期时间
DURING_END_DATE:有效日期时间段结束日期时间
NO_END_DATA_FLAG:结束日期是否无效标识,0表示结束日期有效,1表示无效
本过程的TYPE$、FERQ_INTERVAL、FREQ_SUB_INTERVAL、FREQ_MINUTE_INTERVAL、START_TIME、END_TIME、DURING_START_DATE、DURING_END_DATE和NO_END_DATA_FLAG分别与过程SP_ADD_TIMER的参数TYPE、FREQ_MONTH_WEEK_INTERVAL、FREQ_SUB_INTERVAL、FREQ_MINUTE_INTERVAL、START_TIME、END_TIME、DURING_START_DATE、DURING_END_DATE和NO_END_DATE_FLAG对应,其具体说明可参考过程SP_ADD_TIMER的说明。
返回值:

举例说明:
设置复制关系的定时器
SP_RPS_ADD_TIMER (‘TIMER1′,’按天计算’, 1, 1, 0, 1, CURTIME, ’23:59:59′, NOW, NULL, 1);

9. SP_RPS_REP_RESET_TIMER
定义:
SP_RPS_REP_RESET_TIMER(
REP_NAME VARCHAR(128),
TIMER_NAME VARCHAR(128)
);
功能说明:
重新设置复制关系的定时器
参数说明:
REP_NAME:复制名
TIMER_NAME:新的定时器名
返回值:

举例说明:
重新设置复制关系的定时器
SP_RPS_REP_RESET_TIMER (‘REPB2C’, ‘TIMER1’);

10. SP_RPS_ADD_TAB_MAP
定义:
SP_RPS_ADD_TAB_MAP(
REP_NAME VARCHAR(128),
MTAB_SCHEMA VARCHAR(128),
MTAB_NAME VARCHAR(128),
STAB_SCHEMA VARCHAR(128),
STAB_NAME VARCHAR(128),
READ_ONLY_MODE INT
);
功能说明:
添加表级复制映射
参数说明:
REP_NAME:复制关系名
MTAB_SCHEMA:主表模式名
MTAB_NAME:主表名
STAB_SCHEMA:从表模式名
STAB_NAME:从表名
READ_ONLY_MODE:只读复制模式,1表示只读模式,从表只接受复制更新,0表示非只读模式
返回值:

举例说明:
添加复制映射
SP_RPS_ADD_TAB_MAP(‘REPB2C’, ‘USER1’, ‘T1’, ‘USER2’, ‘T2’, 0);

11. SP_RPS_DROP_TAB_MAP
定义:
SP_RPS_DROP_TAB_MAP(
REP_NAME VARCHAR(128),
MTAB_SCHEMA VARCHAR(128),
MTAB_NAME VARCHAR(128),
STAB_SCHEMA VARCHAR(128),
STAB_NAME VARCHAR(128),
);
功能说明:
删除表级复制映射
参数说明:
REP_NAME:复制关系名
MTAB_SCHEMA:主表模式名
MTAB_NAME:主表名
STAB_SCHEMA:从表模式名
STAB_NAME:从表名
返回值:

举例说明:
删除表级复制映射
SP_RPS_DROP_TAB_MAP(‘REPB2C’, ‘USER1’, ‘T1’, ‘USER2’, ‘T2’);

12. SP_RPS_ADD_SCH_MAP
定义:
SP_RPS_ADD_SCH_MAP(
REP_NAME VARCHAR(128),
MSCH VARCHAR(128),
SSCH VARCHAR(128),
READ_ONLY_MODE INT
);
功能说明:
添加模式级复制映射
参数说明:
REP_NAME:复制关系名
MSCH:主模式名
SSCH: 从表模式名
READ_ONLY_MODE:只读复制模式,1表示只读模式,从表只接受复制更新,0表示非只读模式
返回值:

举例说明:
添加复制映射
SP_RPS_ADD_SCH_MAP(‘REPB2C’, ‘USER1’, ‘USER2’, 0);

13. SP_RPS_DROP_SCH_MAP
定义:
SP_RPS_DROP_SCH_MAP(
REP_NAME VARCHAR(128),
MSCH VARCHAR(128),
SSCH VARCHAR(128)
);
功能说明:
删除模式级复制映射
参数说明:
REP_NAME:复制关系名
MSCH:主模式名
SSCH:从模式名
返回值:

举例说明:
删除模式级复制映射
SP_RPS_DROP_SCH_MAP(‘REPB2C’, ‘USER1’, ‘USER2’);

14. SP_RPS_ADD_DB_MAP
定义:
SP_RPS_ADD_DB_MAP(
REP_NAME VARCHAR(128),
READ_ONLY_MODE INT
);
功能说明:
添加库级复制映射
参数说明:
REP_NAME:复制关系名
READ_ONLY_MODE:只读复制模式,1表示只读模式,从表只接受复制更新,0表示非只读模式
返回值:

举例说明:
添加库级复制映射
SP_RPS_ADD_DB_MAP(‘REPB2C’, 0);

15. SP_RPS_DROP_DB_MAP
定义:
SP_RPS_DROP_DB_MAP(
REP_NAME VARCHAR(128)
);
功能说明:
删除库级复制映射
参数说明:
REP_NAME:复制关系名
返回值:

举例说明:
删除库级复制映射
SP_RPS_DROP_DB_MAP(‘REPB2C’);

16. SP_RPS_SET_BEGIN
定义:
SP_RPS_SET_BEGIN(
GRP_NAME VARCHAR(128),
);
功能说明:
开始复制设置
参数说明:
GRP_NAME:复制组名
返回值:

备注:
开始对指定复制组进行属性设置。创建/删除复制关系与创建/删除复制映射等接口都必须在此接口调用后执行,否则会报错“错误的复制设置序列”。同一会话中也不能同时开始多个复制设置。
举例说明:
复制组REPB2C开始复制
SP_RPS_SET_BEGIN(‘ REP_GRP_B2C’);

17. SP_RPS_SET_APPLY
定义:
SP_RPS_SET_APPLY ();
功能说明:
提交复制设置,保存并提交本次设置的所有操作。如果需要继续设置,则必须重新调用SP_RPS_SET_BEGIN
参数说明:

返回值:

举例说明:
提交复制设置
SP_RPS_SET_APPLY ();
18. SP_RPS_SET_CANCEL
定义:
SP_RPS_SET_CANCEL ();
功能说明:
放弃复制设置,放弃本次设置的所有操作。如果需要重新设置,则必须再次调用SP_RPS_SET_BEGIN
参数说明:

返回值:

举例说明:
放弃复制设置
SP_RPS_SET_CANCEL();

DM 的数据复制可以在表级,模式级和库级进行配置,本篇我们看下表级数据复制的配置过程。
下面举一个简单的例子来说明数据复制的配置。
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.t1表,从数据库上存在与主数据库hy.t1表结构完全相同的wy.t1表,现需要创建一个主数据库上hy.t1表到从数据库上wy.t1表的同步复制关系,其名称为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: 16.792(ms). Execute id is 3.

SQL> select * from SYSREP.RPS_GROUPS;

LINEID     NAME          ID          DESC$       
---------- ------------- ----------- ------------
1          REP_GRP_hy2wy 1           主从同步复制

used time: 1.599(ms). Execute id is 4.

开始设置

SQL> SP_RPS_SET_BEGIN('REP_GRP_hy2wy');
DMSQL executed successfully
used time: 1.081(ms). Execute id is 6.

添加复制关系

SQL> SP_RPS_ADD_REPLICATION ('REP_GRP_hy2wy', 'REPhy2wy', 'hy到wy的同步复制', 'hy', 'wy', NULL, '/dm_home/dmdba/dmdbms/dmreplog');
DMSQL executed successfully
used time: 3.807(ms). Execute id is 7.

添加复制映射, 注意这里用户名和表名要大写,否则会提示对象不存在

SQL> SP_RPS_ADD_TAB_MAP('REPhy2wy', 'HY', 'T1', 'WY', 'T1', 0);
DMSQL executed successfully
used time: 4.495(ms). Execute id is 10.

提交设置

SQL> SP_RPS_SET_APPLY();
DMSQL executed successfully
used time: 00:00:05.038. Execute id is 12.
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 1           1           1           2           /dm_home/dmdba/dmdbms/dmreplog -1            0           NULL                        1           NULL       hy到wy的同步复制

used time: 0.534(ms). Execute id is 13.
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        1           1           -1            0           NULL                        0              NULL
2          wy        1           2           -1            0           NULL                        0              NULL

used time: 0.499(ms). Execute id is 14.
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          1           HY        T1        150995951   1297        WY        T1        150995951   1296        0

used time: 0.523(ms). Execute id is 15.
SQL> select * from SYSREP.RPS_FAULT_HISTORY;
no rows

used time: 1.136(ms). Execute id is 16.
SQL> select * from SYSREP.RPS_CONFLICTS;
no rows

used time: 1.336(ms). Execute id is 17.
SQL> select * from SYSREP.RPS_TIMERS;
no rows

used time: 0.987(ms). Execute id is 18.

至此,表复制完成。注意一点,DM的复制配置必须在开始复制配置之前执行SP_RPS_SET_BEGIN,配置完成之后执行SP_RPS_SET_APPLY提交。
验证同步
主库的逻辑日志:

[root@jydm2 dmreplog]# ls -lrt
总用量 4
-rw-r--r-- 1 dmdba dinstall 48 10月 21 08:24 llog_arch_file_20141021082409.log

主库对T1表插入数据:

[dmdba@jydm2 bin]$ ./disql hy/hy
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 6.047(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT 
Connected to: DM 7.1.6.46
SQL> select * from t1;
no rows

used time: 0.998(ms). Execute id is 4.
S SQL> insert into t1 values(2,'hy2');
affect rows 1

used time: 0.777(ms). Execute id is 8.
SQL> commit;
executed successfully
used time: 1.141(ms). Execute id is 9.
SQL> select * from t1;

LINEID     ID USERNAME
---------- -- --------
1          1  hy
2          2  hy2

used time: 0.403(ms). Execute id is 10.

从库查询: 同步成功,主库之前的数据无法同步过来,只对后来操作的数据有效

[dmdba@jydm3 bin]$ ./disql wy/wy

Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 5.844(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT 
Connected to: DM 7.1.6.46
SQL> select * from t1;     

LINEID     ID USERNAME
---------- -- --------
1          1  hy
2          2  hy2

used time: 0.618(ms). Execute id is 9.

在主库中更新记录

SQL> update t1 set username='hy1' where id=1;
affect rows 1

used time: 1.427(ms). Execute id is 11.
SQL> commit;
executed successfully
used time: 0.869(ms). Execute id is 12.
SQL> select * from t1;

LINEID     ID USERNAME
---------- -- --------
1          1  hy1
2          2  hy2

used time: 0.339(ms). Execute id is 13.

查看从库记录

SQL> select * from t1; 

LINEID     ID USERNAME
---------- -- --------
1          1  hy1
2          2  hy2

used time: 1.272(ms). Execute id is 12.

主库删除T1表的所有数据:

SQL> truncate table t1;
executed successfully
used time: 3.283(ms). Execute id is 14.

从库的所有数据也删除了

SQL> select * from t1;
no rows

used time: 0.793(ms). Execute id is 15.

整个复制的环境中,逻辑日志仅存在主库中。
我们配置的是同步的复制,如果想改成异步同步可以添加个计时器,比如:
SP_RPS_ADD_TIMER(‘hy2wy_TIMER’,’从hy到wy定时复制’,1,0,0,0,’23:18:33′,NULL,’2019-12-18 23:18:33′,NULL,1);
SP_RPS_REP_RESET_TIMER(‘REPhy2wy’,’hy2wy_TIMER’);

若需要删除复制组,则该复制组不能处于配置阶段,即该组的配置已经提交或取消。
监控数据复制
配置完成后复制服务器RPS虽然不参与复制的具体执行,但是在复制过程中,还是建议保持RPS的运行来对复制进行监控。
复制系统内,状态分为复制节点的状态和复制关系的状态。具体内容见下表。

复制节点的系统状态在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          REPhy2wy 1           1           1           2           /dm_home/dmdba/dmdbms/dmreplog -1            0           NULL                        1           NULL       hy到wy的同步复制

used time: 1.339(ms). Execute id is 23.
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        1           1           -1            0           NULL                        0              NULL
2          wy        1           2           -1            0           NULL                        0              NULL

used time: 0.574(ms). Execute id is 24.

复制系统的配置信息可以通过在复制RPS上查询系统表来实现。在RPS上,复制相关的信息都在SYSREP模式中。
复制的监视按复制组为单位进行,RPS每隔1分钟轮询探查所有的复制组,在每个复制组内,依次探测各个复制节点,要求其返回复制节点本身的状态和其所涉及的复制的状态。
这里需要特别说明的是节点的系统异常状态是指该节点在复制环境中的状态,是一个推测值。当RPS无法得到节点的返回消息,其他节点的返回消息中所有涉及到该节点的复制关系都是异常时,RPS就认为该节点系统异常。
若复制结点或复制关系发生异常,这些异常都会记录在SYSREP.RPS_FAULT_HISTORY表中。若其END_TIME字段为NULL,表示该故障还没有结束,管理员需尽快检查复制节点的状态及其网络连接。

SQL> select * from SYSREP.RPS_CONFLICTS;
no rows

used time: 1.336(ms). Execute id is 17.

DM7并没有特意设置对错误历史的管理接口,管理员可以通过对SYSREP.RPS_FAULT_HISTORY表的删除和查询来实现错误记录的管理。
至此,复制环境配置完成。以上的例子只是一个最简单的复制环境。复制的配置灵活,在同一个复制组内,一个主服务器可以有多个从服务器,一个复制节点可以既是主服务器又是从服务器。管理员可以根据实际需要,配置出对称、一对多、多对一、级联、循环的复制环境。
在配置过程中或配置完成后,可以对复制的配置进行修改。修改包括复制组、复制关系、复制对象的删除和复制关系属性的修改。这些修改操作都必须在开始复制SP_RPS_SET_BEGIN和提交复制SP_RPS_SET_APPLY之间进行。若需要删除复制组,则该复制组不能处于配置阶段,即该组的配置已经提交或取消。
添加一个定时器,将同步复制修改为异步复制

SQL> SP_RPS_ADD_TIMER('hy2wy_TIMER','从hy到wy定时复制',1,0,0,0,'23:18:33',NULL,'2019-12-18 23:18:33',NULL,1);
SP_RPS_ADD_TIMER('hy2wy_TIMER','从hy到wy定时复制',1,0,0,0,'23:18:33',NULL,'2019-12-18 23:18:33',NULL,1);
[-8702]:group not set begin.
used time: 33.874(ms). Execute id is 0.

提示复制组设置没有开始所以不能进行修改

SQL> SP_RPS_SET_BEGIN('REP_GRP_hy2wy');
DMSQL executed successfully
used time: 0.481(ms). Execute id is 26.

设置时间开始时间为2019-12-18 23:38:33

SQL> SP_RPS_ADD_TIMER('hy2wy_TIMER','从hy到wy定时复制',1,0,0,0,'23:38:33',NULL,'2019-12-18 23:38:33',NULL,1);
DMSQL executed successfully
used time: 13.217(ms). Execute id is 29.
SQL> SP_RPS_REP_RESET_TIMER('REPhy2wy','hy2wy_TIMER');
DMSQL executed successfully
used time: 0.790(ms). Execute id is 30.
SQL> SP_RPS_SET_APPLY();
DMSQL executed successfully
used time: 24.494(ms). Execute id is 31.

现在在主库中插入数据

SQL> select * from t1;

LINEID     ID USERNAME
---------- -- --------
1          1  hy

used time: 2.296(ms). Execute id is 4.
SQL> insert into t1 values(2,'hy2');
affect rows 1

used time: 1.519(ms). Execute id is 5.
SQL> commit;
executed successfully
used time: 1.430(ms). Execute id is 6.
SQL> select * from t1;

LINEID     ID USERNAME
---------- -- --------
1          1  hy
2          2  hy2

used time: 0.512(ms). Execute id is 8.

在从库中查询记录

SQL> select * from t1;

LINEID     ID USERNAME
---------- -- --------
1          1  hy

used time: 0.337(ms). Execute id is 8.
SQL> select sysdate;

LINEID     SYSDATE                    
---------- ---------------------------
1          2019-12-18 23:38:37.570259

used time: 0.263(ms). Execute id is 9.

可以看到在时间2019-12-18 23:38:37.570259时间点表数据还没有同步到从库

SQL> select sysdate;

LINEID     SYSDATE                    
---------- ---------------------------
1          2019-12-18 23:39:05.629576

used time: 0.432(ms). Execute id is 12.
SQL> select * from t1;

LINEID     ID USERNAME
---------- -- --------
1          1  hy
2          2  hy2

used time: 0.458(ms). Execute id is 13.

可以看到在时间2019-12-18 2019-12-18 23:39:05.629576时间点表数据已经同步到从库

删除复制映射

SQL> SP_RPS_DROP_TAB_MAP('REPhy2wy', 'HY', 'T1', 'WY', 'T1');
DMSQL executed successfully
used time: 1.485(ms). Execute id is 36.

修改复制的错误超时时间,超时的时间单位是秒

SQL> SP_RPS_SET_ROUTE_FAULT_TIMEOUT('REPhy2wy', 60);
DMSQL executed successfully
used time: 0.791(ms). Execute id is 37.

删除复制关系

SQL> SP_RPS_DROP_REPLICATION('REPhy2wy');
DMSQL executed successfully
used time: 1.807(ms). Execute id is 38. 

删除整个复制组

SQL> SP_RPS_DROP_GROUP('REP_GRP_hy2wy');
DMSQL executed successfully
used time: 1.807(ms). Execute id is 39. 

删除数据复制所使用的用户和系统表

SQL> SP_INIT_REP_SYS(0);
DMSQL executed successfully
used time: 160.803(ms). Execute id is 51.
SQL> select * from SYSREP.RPS_INSTANCES;
select * from SYSREP.RPS_INSTANCES;
[-2103]:Error in line: 1
Invalid schema name [SYSREP].
used time: 0.735(ms). Execute id is 0.

另外,在配置或修改配置时想要取消操作,可以使用如下系统过程结束配置。

SQL> SP_RPS_SET_CANCEL();
DMSQL executed successfully
used time: 0.749(ms). Execute id is 40.

Oracle 11G RAC One Node’s Instance Arise ORA-01105 ORA-01606

生产环境,Oracle Linux 6.4 RAC 11.2.4.0,今天出现了grid集群因为OCR磁盘组不能访问而不能通过命令来显示集群状态信息,在手动mount OCR磁盘组后,准备重启节点2时出现了ORA-01105,ORA-01606错误,具体信息如下:

SQL> startup
ORACLE instance started.

Total System Global Area 5.3447E+10 bytes
Fixed Size                  2265864 bytes
Variable Size            1.3019E+10 bytes
Database Buffers         4.0265E+10 bytes
Redo Buffers              160698368 bytes
ORA-01105: mount is incompatible with mounts by other instances
ORA-01606: parameter not identical to that of another mounted instance

查看错误详细说明,根据错误描述可知是由于2号实例与1号实例由于某些参数设置一样所导致的

[oracle@db2 dbs]$ oerr ora 1105
01105, 00000, "mount is incompatible with mounts by other instances"
// *Cause:  An attempt to mount the database discovered that another instance
//         mounted a database by the same name, but the mount is not
//         compatible. Additional errors are reported explaining why.
// *Action: See accompanying errors.
[oracle@db2 dbs]$ oerr ora 1606
01606, 00000, "parameter not identical to that of another mounted instance"
// *Cause:  A parameter was different on two instances.
// *Action: Modify the initialization parameter and restart.

使用spfile文件来创建文本格式的pfile文件

SQL> create pfile='rlcs.ora' from spfile;

File created.

[oracle@db2 dbs]$ cat rlcs.ora

*._serial_direct_read='AUTO'
*._swrf_mmon_flush=TRUE
*._use_adaptive_log_file_sync='FALSE'
*.audit_file_dest='/u01/app/oracle/admin/RL/adump'
*.audit_trail='NONE'
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.control_files='+DATA/rl/controlfile/current.260.926786537','+ARCH/rl/controlfile/current.256.926786537'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_file_name_convert='+data/rl/','+data/rldg/'
*.db_name='RL'
*.db_recovery_file_dest='+ARCH'
*.db_recovery_file_dest_size=10737418240
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=RLZYXDB)'
*.fal_server='yb_st'
RL1.instance_number=1
RL2.instance_number=2
*.listener_networks=''
*.log_archive_config='dg_config=(rl,rldg)'
*.log_archive_dest_1='location=+ARCH  valid_for=(all_logfiles,all_roles) db_unique_name=rl'
*.log_archive_dest_2='service=yb_st valid_for=(online_logfiles,primary_role) db_unique_name=rldg'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arch'
*.log_file_name_convert='+data/rl/','+data/rldg/','+arch/rl/','+arch/rldg/'
*.open_cursors=300
*.parallel_adaptive_multi_user=TRUE
*.parallel_degree_policy='AUTO'
*.parallel_force_local=FALSE
*.pga_aggregate_target=21474836480
*.processes=2000
*.remote_listener='scan-ip:1521'
*.remote_login_passwordfile='exclusive'
*.service_names='rl'
*.sessions=2205
*.sga_max_size=53687091200
*.sga_target=53687091200
*.standby_file_management='manual'
RLZY2.thread=2
RLZY1.thread=1
*.undo_retention=7200
RLZY2.undo_tablespace='UNDOTBS2'
RLZY1.undo_tablespace='UNDOTBS1'
*.utl_file_dir='/rmanbak/utl'
从文本参数文件看不出来有什么参数是两个实例不一致的。

通过执行下面的语句来查看2号实例与gc相关的参数
SQL> set linesize 333
SQL> col name for a35
SQL> col description for a66
SQL> col value for a30
SQL> SELECT   i.ksppinm name,  
  2     i.ksppdesc description,  
  3     CV.ksppstvl VALUE
  4  FROM   sys.x$ksppi i, sys.x$ksppcv CV  
  5     WHERE   i.inst_id = USERENV ('Instance')  
  6     AND CV.inst_id = USERENV ('Instance')  
  7     AND i.indx = CV.indx  
  8     AND i.ksppinm LIKE '/_gc%' ESCAPE '/'  
  9  ORDER BY   REPLACE (i.ksppinm, '_', '');  

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_affinity_locking                if TRUE, enable object affinity                                    TRUE
_gc_affinity_locks                  if TRUE, get affinity locks                                        TRUE
_gc_affinity_ratio                  dynamic object affinity ratio                                      50
_gc_async_memcpy                    if TRUE, use async memcpy                                          FALSE
_gc_bypass_readers                  if TRUE, modifications bypass readers                              TRUE
_gc_check_bscn                      if TRUE, check for stale blocks                                    TRUE
_gc_coalesce_recovery_reads         if TRUE, coalesce recovery reads                                   TRUE
_gc_cpu_time                        if TRUE, record the gc cpu time                                    FALSE
_gc_cr_server_read_wait             if TRUE, cr server waits for a read to complete                    TRUE
_gc_defer_ping_index_only           if TRUE, restrict deferred ping to index blocks only               TRUE
_gc_defer_time                      how long to defer pings for hot buffers in milliseconds            0

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_delta_push_compression          if delta >= K bytes, compress before push                          3072
_gc_delta_push_max_level            max delta level for delta push                                     100
_gc_delta_push_objects              objects which use delta push                                       0
_gc_disable_s_lock_brr_ping_check   if TRUE, disable S lock BRR ping check for lost write protect      TRUE
_gc_down_convert_after_keep         if TRUE, down-convert lock after recovery                          TRUE
_gc_element_percent                 global cache element percent                                       110
_gc_escalate_bid                    if TRUE, escalates create a bid                                    TRUE
_gc_fg_merge                        if TRUE, merge pi buffers in the foreground                        TRUE
_gc_flush_during_affinity           if TRUE, flush during affinity                                     TRUE
_gc_fusion_compression              compress fusion blocks if there is free space                      1024
_gc_global_checkpoint_scn           if TRUE, enable global checkpoint scn                              TRUE

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_global_cpu                      global cpu checks                                                  TRUE
_gc_global_lru                      turn global lru off, make it automatic, or turn it on              AUTO
_gc_global_lru_touch_count          global lru touch count                                             5
_gc_global_lru_touch_time           global lru touch time in seconds                                   60
_gc_integrity_checks                set the integrity check level                                      1
_gc_keep_recovery_buffers           if TRUE, make single instance crash recovery buffers current       TRUE
_gc_latches                         number of latches per LMS process                                  8
_gc_log_flush                       if TRUE, flush redo log before a current block transfer            TRUE
_gc_long_query_threshold            threshold for long running query                                   0
_gc_max_downcvt                     maximum downconverts to process at one time                        256
_gc_maximum_bids                    maximum number of bids which can be prepared                       0

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_no_fairness_for_clones          if TRUE, no fairness if we serve a clone                           TRUE
_gc_object_queue_max_length         maximum length for an object queue                                 0
_gc_override_force_cr               if TRUE, try to override force-cr requests                         TRUE
_gc_persistent_read_mostly          if TRUE, enable persistent read-mostly locking                     TRUE
_gc_policy_minimum                  dynamic object policy minimum activity per minute                  1500
_gc_policy_time                     how often to make object policy decisions in minutes               10
_gc_read_mostly_flush_check         if TRUE, optimize flushes for read mostly objects                  FALSE
_gc_read_mostly_locking             if TRUE, enable read-mostly locking                                FALSE
_gcr_enable_high_cpu_kill           if TRUE, GCR may kill foregrounds under high load                  FALSE
_gcr_enable_high_cpu_rm             if TRUE, GCR may enable a RM plan under high load                  FALSE
_gcr_enable_high_cpu_rt             if TRUE, GCR may boost bg priority under high load                 FALSE

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gcr_high_cpu_threshold             minimum amount of CPU process must consume to be kill target       10
_gcr_use_css                        if FALSE, GCR wont register with CSS nor use any CSS feature       TRUE
_gc_sanity_check_cr_buffers         if TRUE, sanity check CR buffers                                   FALSE
_gcs_disable_remote_handles         disable remote client/shadow handles                               FALSE
_gcs_disable_skip_close_remastering if TRUE, disable skip close optimization in remastering            FALSE
_gc_serve_high_pi_as_current        if TRUE, use a higher clone scn when serving a pi                  TRUE
_gcs_fast_reconfig                  if TRUE, enable fast reconfiguration for gcs locks                 TRUE
_gcs_latches                        number of gcs resource hash latches to be allocated per LMS proces 64
                                    s

_gcs_pkey_history                   number of pkey remastering history                                 4000

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gcs_process_in_recovery            if TRUE, process gcs requests during instance recovery             TRUE
_gcs_resources                      number of gcs resources to be allocated
_gcs_res_per_bucket                 number of gcs resource per hash bucket                             4
_gcs_shadow_locks                   number of pcm shadow locks to be allocated
_gc_statistics                      if TRUE, kcl statistics are maintained                             TRUE
_gcs_testing                        GCS testing parameter                                              0
_gc_transfer_ratio                  dynamic object read-mostly transfer ratio                          2
_gc_undo_affinity                   if TRUE, enable dynamic undo affinity                              TRUE
_gc_undo_block_disk_reads           if TRUE, enable undo block disk reads                              TRUE
_gc_use_cr                          if TRUE, allow CR pins on PI and WRITING buffers                   TRUE
_gc_vector_read                     if TRUE, vector read current buffers                               TRUE

64 rows selected.

查看1号实例与gc相关的参数

SQL> set linesize 333
SQL> col name for a35
SQL> col description for a66
SQL> col value for a30
SQL> SELECT   i.ksppinm name,  
  2     i.ksppdesc description,  
  3     CV.ksppstvl VALUE
  4  FROM   sys.x$ksppi i, sys.x$ksppcv CV  
  5     WHERE   i.inst_id = USERENV ('Instance')  
  6     AND CV.inst_id = USERENV ('Instance')  
  7     AND i.indx = CV.indx  
  8     AND i.ksppinm LIKE '/_gc%' ESCAPE '/'  
  9  ORDER BY   REPLACE (i.ksppinm, '_', '');  

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_affinity_locking                if TRUE, enable object affinity                                    TRUE
_gc_affinity_locks                  if TRUE, get affinity locks                                        TRUE
_gc_affinity_ratio                  dynamic object affinity ratio                                      50
_gc_async_memcpy                    if TRUE, use async memcpy                                          FALSE
_gc_bypass_readers                  if TRUE, modifications bypass readers                              TRUE
_gc_check_bscn                      if TRUE, check for stale blocks                                    TRUE
_gc_coalesce_recovery_reads         if TRUE, coalesce recovery reads                                   TRUE
_gc_cpu_time                        if TRUE, record the gc cpu time                                    FALSE
_gc_cr_server_read_wait             if TRUE, cr server waits for a read to complete                    TRUE
_gc_defer_ping_index_only           if TRUE, restrict deferred ping to index blocks only               TRUE
_gc_defer_time                      how long to defer pings for hot buffers in milliseconds            0

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_delta_push_compression          if delta >= K bytes, compress before push                          3072
_gc_delta_push_max_level            max delta level for delta push                                     100
_gc_delta_push_objects              objects which use delta push                                       0
_gc_disable_s_lock_brr_ping_check   if TRUE, disable S lock BRR ping check for lost write protect      TRUE
_gc_down_convert_after_keep         if TRUE, down-convert lock after recovery                          TRUE
_gc_element_percent                 global cache element percent                                       110
_gc_escalate_bid                    if TRUE, escalates create a bid                                    TRUE
_gc_fg_merge                        if TRUE, merge pi buffers in the foreground                        TRUE
_gc_flush_during_affinity           if TRUE, flush during affinity                                     TRUE
_gc_fusion_compression              compress fusion blocks if there is free space                      1024
_gc_global_checkpoint_scn           if TRUE, enable global checkpoint scn                              TRUE

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_global_cpu                      global cpu checks                                                  TRUE
_gc_global_lru                      turn global lru off, make it automatic, or turn it on              AUTO
_gc_global_lru_touch_count          global lru touch count                                             5
_gc_global_lru_touch_time           global lru touch time in seconds                                   60
_gc_integrity_checks                set the integrity check level                                      1
_gc_keep_recovery_buffers           if TRUE, make single instance crash recovery buffers current       TRUE
_gc_latches                         number of latches per LMS process                                  8
_gc_log_flush                       if TRUE, flush redo log before a current block transfer            TRUE
_gc_long_query_threshold            threshold for long running query                                   0
_gc_max_downcvt                     maximum downconverts to process at one time                        256
_gc_maximum_bids                    maximum number of bids which can be prepared                       0

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gc_no_fairness_for_clones          if TRUE, no fairness if we serve a clone                           TRUE
_gc_object_queue_max_length         maximum length for an object queue                                 0
_gc_override_force_cr               if TRUE, try to override force-cr requests                         TRUE
_gc_persistent_read_mostly          if TRUE, enable persistent read-mostly locking                     TRUE
_gc_policy_minimum                  dynamic object policy minimum activity per minute                  1500
_gc_policy_time                     how often to make object policy decisions in minutes               10
_gc_read_mostly_flush_check         if TRUE, optimize flushes for read mostly objects                  FALSE
_gc_read_mostly_locking             if TRUE, enable read-mostly locking                                TRUE
_gcr_enable_high_cpu_kill           if TRUE, GCR may kill foregrounds under high load                  FALSE
_gcr_enable_high_cpu_rm             if TRUE, GCR may enable a RM plan under high load                  FALSE
_gcr_enable_high_cpu_rt             if TRUE, GCR may boost bg priority under high load                 FALSE

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gcr_high_cpu_threshold             minimum amount of CPU process must consume to be kill target       10
_gcr_use_css                        if FALSE, GCR wont register with CSS nor use any CSS feature       TRUE
_gc_sanity_check_cr_buffers         if TRUE, sanity check CR buffers                                   FALSE
_gcs_disable_remote_handles         disable remote client/shadow handles                               FALSE
_gcs_disable_skip_close_remastering if TRUE, disable skip close optimization in remastering            FALSE
_gc_serve_high_pi_as_current        if TRUE, use a higher clone scn when serving a pi                  TRUE
_gcs_fast_reconfig                  if TRUE, enable fast reconfiguration for gcs locks                 TRUE
_gcs_latches                        number of gcs resource hash latches to be allocated per LMS proces 64
                                    s

_gcs_pkey_history                   number of pkey remastering history                                 4000

NAME                                DESCRIPTION                                                        VALUE
----------------------------------- ------------------------------------------------------------------ ------------------------------
_gcs_process_in_recovery            if TRUE, process gcs requests during instance recovery             TRUE
_gcs_resources                      number of gcs resources to be allocated
_gcs_res_per_bucket                 number of gcs resource per hash bucket                             4
_gcs_shadow_locks                   number of pcm shadow locks to be allocated
_gc_statistics                      if TRUE, kcl statistics are maintained                             TRUE
_gcs_testing                        GCS testing parameter                                              0
_gc_transfer_ratio                  dynamic object read-mostly transfer ratio                          2
_gc_undo_affinity                   if TRUE, enable dynamic undo affinity                              TRUE
_gc_undo_block_disk_reads           if TRUE, enable undo block disk reads                              TRUE
_gc_use_cr                          if TRUE, allow CR pins on PI and WRITING buffers                   TRUE
_gc_vector_read                     if TRUE, vector read current buffers                               TRUE

64 rows selected.

通过对比发现_gc_read_mostly_locking参数在1号实例中为true,2号实例为false

将所有实例中的_gc_read_mostly_locking参数设置为true

SQL> alter system set "_gc_read_mostly_locking"=true scope=spfile sid='*';

System altered.

重启2号实例成功

SQL> shutdown immediate
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 5.3447E+10 bytes
Fixed Size                  2265864 bytes
Variable Size            1.3019E+10 bytes
Database Buffers         4.0265E+10 bytes
Redo Buffers              160698368 bytes
Database mounted.
Database opened.

原因是因为之前有人修改过_gc_read_mostly_locking隐藏参数,只是只修改了1号实例。

mysqld –skip-grant-tables

mysqld的–skip-grant-tables选项
这个选项会导致不使用权限系统来启动服务器,它将让任何用户可以访问服务器并且不受限制的访问所有数据库。在不使用授权表启动服务器后可以通过shell来执行mysqladmin flush-privileges或mysqladmin reload命令或者在连接到服务器后执行flush privileges语句来让正在运行的服务器再次使用授权表。

使用–skip-grant-tables选项启动服务器

[root@localhost mysql]# service mysqld stop
Shutting down MySQL. SUCCESS! 


[root@localhost mysql]# service mysqld start --skip-grant-tables
Starting MySQL.. SUCCESS! 

现在就可以不使用用户和密码就可以登录服务器

[mysql@localhost ~]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

现在可以执行mysqladin flush-privileges命令让正在运行的服务器再次使用授权表

[mysql@localhost ~]$ mysqladmin  flush-privileges

现在不使用用户和密码就不能登录服务器了,必须使用用户和密码才能登录了

[mysql@localhost ~]$ mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)


[mysql@localhost ~]$ mysql -uroot -pabcd mysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

再次使用–skip-grant-tables选项启动服务器

[root@localhost mysql]# service mysqld stop
Shutting down MySQL.. SUCCESS! 

[root@localhost mysql]# service mysqld start --skip-grant-tables
Starting MySQL.. SUCCESS! 

现在就可以不使用用户和密码就可以登录服务器

[mysql@localhost ~]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

现在可以执行mysqladin reload命令让正在运行的服务器再次使用授权表

mysql@localhost ~]$ mysqladmin reload

现在不使用用户和密码就不能登录服务器了,必须使用用户和密码才能登录了

[mysql@localhost ~]$ mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[mysql@localhost ~]$ mysql -uroot -pabcd mysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

再次使用–skip-grant-tables选项启动服务器

[root@localhost mysql]# service mysqld stop
Shutting down MySQL. SUCCESS! 


[root@localhost mysql]# service mysqld start --skip-grant-tables
Starting MySQL.. SUCCESS! 

现在就可以不使用用户和密码就可以登录服务器

[mysql@localhost ~]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

现在可以执行flush privileges语句让正在运行的服务器再次使用授权表

mysql> flush privileges;
Query OK, 0 rows affected (0.12 sec)

现在不使用用户和密码就不能登录服务器了,必须使用用户和密码才能登录了

[mysql@localhost ~]$ mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[mysql@localhost ~]$ mysql -uroot -pabcd mysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

–skip-grant-tables选项也可以在选项文件my.cnf中进行设置。这个选项还会导致服务器在启动过程中禁止加载用户定义函数(udf),调度事件和安装插件语句中安装的插件。为了以任何方式来加载插件,使用–plugin-load选项。–skip-grant-tables选项也会导致disabled_storage_engines系统变量失效。

flush privileges语句可以在服务器启动后通过执行其它操作来隐式执行。例如在升级过程中mysql_upgrade程序就会刷新权限。

Proudly powered by WordPress | Indrajeet by Sus Hill.