天天看點

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。

  1. 參數設定

    修改3台DM資料庫的dm.ini 檔案,添加如下内容:

資料庫 dm.ini 設定

複制資料庫 INSTANCE_NAME = jydm

PORT_NUM = 5236

MAL_INI = 1

主資料庫 INSTANCE_NAME = hy

從資料庫 INSTANCE_NAME = wy

配置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_HOST = 10.10.10.184

[MAL_wy]

MAL_INST_NAME =wy

MAL_HOST = 10.10.10.185

MAL_PORT = 5243

MAL_INST_HOST =10.10.10.185

[dmdba@shard1 jydm]$ cat dmmal.ini

[dmdba@jydm2 hy]$ cat dmmal.ini

[dmdba@jydm3 wy]$ cat dmmal.ini

對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);

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), // 複制名

REP_ID INT, // 複制ID,全局唯一

MINST_ID INT, // 主節點執行個體編号

SINST_ID INT, // 從節點執行個體編号

ARCH_DIR VARCHAR(256), // 主節點歸檔日志路徑

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

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', '主從同步複制');

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');

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');

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);

used time: 1.738(ms). Execute id is 0.

SQL> SP_RPS_ADD_SCH_MAP('REPhy2wy','HY','WY',0);

used time: 3.126(ms). Execute id is 6.

送出設定

SQL> SP_RPS_SET_APPLY();

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.

從庫查詢,同步成功:

used time: 2.538(ms). Execute id is 5.

在主庫上的hy使用者下建立一個測試表t2

SQL> create table t2 as select * from sysobjects;

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

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

可以看到建立表的DDL語句已經同步到wy使用者下。

因為我這裡的複制從庫是0級,就是非隻讀的,删除後重新添加1級,即隻讀模式在測試:

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

SQL> SP_RPS_DROP_SCH_MAP('REPhy2wy','HY','WY');

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

SQL> SP_RPS_ADD_SCH_MAP('REPhy2wy','HY','WY',1);

used time: 2.820(ms). Execute id is 14.

used time: 00:00:05.039. Execute id is 15.

再測試

從主庫的hy使用者中建立表t3

SQL> create table t3 as select * from sysobjects;

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

SQL> select count(*) from t3;

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

在從庫上的wy使用者下查詢表t3顯示不存在

select count(*) from t3;

Invalid table or view name [T3].

used time: 0.774(ms). Execute id is 0.

從測試結果可以看到在隻讀模式下的模式級複制不能同步DDL操作。