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操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2669574/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DM7資料複製之資料庫級複製資料庫
- 資料庫複製(一)–複製介紹資料庫
- Day 7.5 資料型別總結 + 複製 淺複製 深複製資料型別
- 資料共享(淺複製)與資料獨立(深複製)
- MySQL主從複製之GTID複製MySql
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- MySQL主從複製之半同步複製MySql
- MySQL主從複製之非同步複製MySql非同步
- 線上將傳統模式複製改為GTID複製模式模式
- Java引用複製、淺複製、深複製Java
- Redis的資料複製Redis
- JS物件複製:深複製和淺複製JS物件
- 複製和引用複製
- python複製資料夾到一個目錄,或者按目錄層級建立複製Python
- poi操作excel,複製sheet,複製行,複製單元格,複製styleExcel
- 設計模式-原型模式(Prototype)【重點:淺複製與深複製】設計模式原型
- 淺複製與深複製
- python複製之坑Python
- MySQL 8 複製(三)——延遲複製與部分複製MySql
- 資料複製策略綜述
- 資料庫主從複製資料庫
- GoldenGate異種資料庫之間的複製Go資料庫
- mysql資料庫的主從複製和主主複製實踐MySql資料庫
- mysql複製--主從複製配置MySql
- python 淺複製、深複製坑Python
- python 深複製和淺複製Python
- JavaScript 淺複製和深複製JavaScript
- 複製
- mysql 資料表的複製案例MySql
- MongoDB複製集資料同步流程MongoDB
- Azure Data Factory(二)複製資料
- MySQL-主從複製之同步主從資料MySql
- MySQL-主從複製之搭建從資料庫MySql資料庫
- MySQL-主從複製之搭建主資料庫MySql資料庫
- js 實現深複製/深複製JS
- MySQL 8 複製(一)——非同步複製MySql非同步
- MySQL 8 複製(二)——半同步複製MySql
- MySQL 8 複製(四)——GTID與複製MySql