達夢資料複制(DATA REPLICATION)是一個分擔系統通路壓力、加快異地通路響應速度、提高資料可靠性的解決方案。将一個伺服器執行個體上的資料變更複制到另外的伺服器執行個體。可以用于解決大、中型應用中出現的因來自不同地域、不同部門、不同類型的資料通路請求導緻資料庫伺服器超負荷運作、網絡阻塞、遠端使用者的資料響應遲緩的問題。
重要概念
-
資料庫狀态
伺服器的狀态,在不同的狀态下,對能夠進行的操作有不同的限制。詳見資料守護部分。
-
主伺服器
發起複制操作的伺服器,稱為主伺服器。
-
從伺服器
接收主伺服器發送的資料并進行複制的伺服器,稱為從伺服器。
-
複制節點
涉及到複制的伺服器,主服務和從服務的統稱。一個節點既可以是主伺服器也可以是從伺服器。
-
複制伺服器(RPS)
在資料複制環境中,負責配置複制環境,定義複制關系的伺服器。RPS有且僅有一台,它隻負責配置和監控,并不參與到複制過程中。
-
複制關系
複制關系指明主伺服器和從伺服器以何種方式進行複制。按照複制的方式,複制關系分為同步複制和異步複制。
-
同步複制關系
主伺服器資料更新立即複制到從伺服器。
-
異步複制關系
主伺服器和從伺服器在某段時間内資料可能是不同的,主伺服器資料更新不會立刻同步到從伺服器,而是在經過一段時間後才進行複制。異步複制的同步時機由指定的定時器确定。
-
邏輯日志
記錄産生資料變化的邏輯操作的日志。記錄的邏輯操作包括INSERT、UPDATE、DELETE、TRUNCATE、ROLLBACK和COMMIT。
-
複制源對象
主伺服器上作為複制資料源的對象,可以是庫、模式或表。在該對象上的操作都會被記錄成邏輯日志,發送給從伺服器進行複制操作。
-
複制目标對象
從伺服器上作為複制資料目标的對象。從伺服器接收到邏輯日志後,将複制源對象的變化複制到複制目标對象中。
-
複制對象映射
一對複制源對象和複制目标對象構成一個複制對象映射。構成映射的源對象和目标對象必須是同一類型的對象。根據對象的類型,複制映射分為庫級、模式級和表級三個級别。其中表級要求源表和目标表結構完全一緻,庫級和模式級沒有要求。庫級和模式級複制映射會将其DDL也進行複制。複制映射包括隻讀模式和非隻讀模式。對于隻讀模式的映射,映射的目的表禁止使用者更新。
-
複制組
一組邏輯相關的複制關系可以構造成為複制組。通過複制組,可以構造出一對多複制、多對一複制、級聯複制、對稱複制、循環複制等複雜的邏輯複制環境。
體系構架
資料複制系統由以下部件構成:
- 複制伺服器;
- 複制節點;
-
各執行個體站點間通訊的MAL系統。
除了系統管理者通過複制伺服器定義複制和處理異常外,其他部分的處理及主從伺服器之間複制操作對于使用者是透明的。整個複制環境的配置境況如下圖所示。
在整個環境中有且僅有一台複制伺服器(RPS),使用者通過RPS定義複制及複制環境,但RPS并不參與到複制過程中。
DM7中,将複制邏輯日志按照配置歸檔到本站點指定目錄稱為本地歸檔,将日志的發送稱為日志的遠端歸檔。
複制節點上,與複制相關的配置檔案有dmtimer.ini、dmllog.ini、dmrep.ini。各個配置檔案在複制中的功能如下表所示
這些檔案均是RPS依據使用者配置通過MAL系統自動生成或修改的,管理者不需要手動進行管理。
在資料複制過程中,除了配置檔案,其他的重要檔案如下表。
這些檔案都是流式檔案,主伺服器在執行過程中,邏輯日志先記錄到邏輯日志檔案中,并根據配置的資訊,将邏輯日志分别分發歸檔到不同的邏輯日志歸檔檔案中,并在恰當的時機将邏輯日志歸檔檔案的内容發送給從伺服器。
從伺服器接收到一批資料就産生一個複制資料檔案将資料存儲其中,防止從伺服器複制速度低導緻複制資料的丢失。
邏輯日志檔案大小限制為32M,兩個檔案交替使用。
歸檔路徑内每個邏輯日志歸檔檔案大小限制為32M,檔案寫滿後增加新檔案來存放新的記錄。在dmllog.ini中有配置歸檔路徑内所有檔案總的空間限制,若達到限制的空間,則會删除之前的檔案;若配置為無空間限制,則管理者可根據複制情況進行删除。
複制資料檔案是從伺服器一次接收的複制資料的臨時檔案,其大小不會超過32K;在其資料複制結束後會被自動删除。
配置資料複制在RPS上進行,與資料複制相關的過程如下:
-
SP_INIT_REP_SYS*
定義:
SP_INIT_REP_SYS(
CREATE_FLAG INT
);
功能說明:
建立或删除資料複制所需的系統表
參數說明:
CREATE_FLAG:為1表示建立複制所需系統表;為0表示删除這些系統表
傳回值:
無
舉例說明:
建立複制所需的系統表
SP_INIT_REP_SYS(1);
- 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','主從同步複制');
- SP_RPS_DROP_GROUP
SP_RPS_DROP_GROUP(
GROUP_NAME VARCHAR(128)
删除複制組
GROUP_NAME:複制組名稱
删除複制組REP_GRP_B2C
SP_RPS_DROP_GROUP ('REP_GRP_B2C');
- 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');
- SP_RPS_DROP_REPLICATION
SP_RPS_DROP_REPLICATION (
REP_NAME VARCHAR(128)
删除複制關系
REP_NAME:複制名稱
SP_RPS_DROP_REPLICATION ('REPB2C');
- SP_RPS_SET_ROUTE_FAULT_TIMEOUT
SP_RPS_SET_ROUTE_FAULT_TIMEOUT (
TIMEOUTS INT
設定複制路徑故障逾時
REP_NAME:複制關系名。
TIMEOUTS:故障逾時值,以秒為機關。0為立即逾時;-1表示無逾時限制傳回值:
該接口用于設定複制路徑故障處理政策。設定後,RPS如檢測到複制路徑産生故障,且故障持續超過設定的逾時值後,則需要取消故障的複制關系。
SP_RPS_SET_ROUTE_FAULT_TIMEOUT ('REPB2C',10);
- SP_RPS_SET_INST_FAULT_TIMEOUT
SP_RPS_SET_INST_FAULT_TIMEOUT (
INST_NAME VARCHAR(128),
設定複制節點故障逾時
INST_NAME:複制節點執行個體名
TIMEOUTS:故障逾時值,以秒為機關。0為立即逾時;-1表示無逾時限制
SP_RPS_SET_INST_FAULT_TIMEOUT ('B',10);
- 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);
- 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');
- SP_RPS_ADD_TAB_MAP
SP_RPS_ADD_TAB_MAP(
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);
- SP_RPS_DROP_TAB_MAP
SP_RPS_DROP_TAB_MAP(
删除表級複制映射
SP_RPS_DROP_TAB_MAP('REPB2C', 'USER1', 'T1', 'USER2', 'T2');
- SP_RPS_ADD_SCH_MAP
SP_RPS_ADD_SCH_MAP(
MSCH VARCHAR(128),
SSCH VARCHAR(128),
添加模式級複制映射
MSCH:主模式名
SSCH: 從表模式名
SP_RPS_ADD_SCH_MAP('REPB2C', 'USER1', 'USER2', 0);
- SP_RPS_DROP_SCH_MAP
SP_RPS_DROP_SCH_MAP(
SSCH VARCHAR(128)
删除模式級複制映射
SSCH:從模式名
SP_RPS_DROP_SCH_MAP('REPB2C', 'USER1', 'USER2');
- SP_RPS_ADD_DB_MAP
SP_RPS_ADD_DB_MAP(
添加庫級複制映射
SP_RPS_ADD_DB_MAP('REPB2C', 0);
- SP_RPS_DROP_DB_MAP
SP_RPS_DROP_DB_MAP(
删除庫級複制映射
SP_RPS_DROP_DB_MAP('REPB2C');
- SP_RPS_SET_BEGIN
SP_RPS_SET_BEGIN(
開始複制設定
開始對指定複制組進行屬性設定。建立/删除複制關系與建立/删除複制映射等接口都必須在此接口調用後執行,否則會報錯“錯誤的複制設定序列”。同一會話中也不能同時開始多個複制設定。
複制組REPB2C開始複制
SP_RPS_SET_BEGIN(' REP_GRP_B2C');
- SP_RPS_SET_APPLY
SP_RPS_SET_APPLY ();
送出複制設定,儲存并送出本次設定的所有操作。如果需要繼續設定,則必須重新調用SP_RPS_SET_BEGIN
送出複制設定
- SP_RPS_SET_CANCEL
SP_RPS_SET_CANCEL ();
放棄複制設定,放棄本次設定的所有操作。如果需要重新設定,則必須再次調用SP_RPS_SET_BEGIN
放棄複制設定
SP_RPS_SET_CANCEL();
DM 的資料複制可以在表級,模式級和庫級進行配置,本篇我們看下表級資料複制的配置過程。
下面舉一個簡單的例子來說明資料複制的配置。
-
準備工作
參與複制的複制執行個體的資訊如下表所示。
資料庫 執行個體名 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。
-
參數設定
修改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: 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');
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');
used time: 3.807(ms). Execute id is 7.
添加複制映射, 注意這裡使用者名和表名要大寫,否則會提示對象不存在
SQL> SP_RPS_ADD_TAB_MAP('REPhy2wy', 'HY', 'T1', 'WY', 'T1', 0);
used time: 4.495(ms). Execute id is 10.
送出設定
SQL> SP_RPS_SET_APPLY();
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;
used time: 1.336(ms). Execute id is 17.
SQL> select * from SYSREP.RPS_TIMERS;
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
login used time: 6.047(ms)
SQL> select * from t1;
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.
LINEID ID USERNAME
---------- -- --------
1 1 hy
2 2 hy2
used time: 0.403(ms). Execute id is 10.
從庫查詢: 同步成功,主庫之前的資料無法同步過來,隻對後來操作的資料有效
[dmdba@jydm3 bin]$ ./disql wy/wy
login used time: 5.844(ms)
SQL> select * from t1;
used time: 0.618(ms). Execute id is 9.
在主庫中更新記錄
SQL> update t1 set username='hy1' where id=1;
used time: 1.427(ms). Execute id is 11.
used time: 0.869(ms). Execute id is 12.
1 1 hy1
used time: 0.339(ms). Execute id is 13.
檢視從庫記錄
SQL> select * from t1;
used time: 1.272(ms). Execute id is 12.
主庫删除T1表的所有資料:
SQL> truncate table t1;
used time: 3.283(ms). Execute id is 14.
從庫的所有資料也删除了
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;
used time: 1.339(ms). Execute id is 23.
used time: 0.574(ms). Execute id is 24.
複制系統的配置資訊可以通過在複制RPS上查詢系統表來實作。在RPS上,複制相關的資訊都在SYSREP模式中。
複制的監視按複制組為機關進行,RPS每隔1分鐘輪詢探查所有的複制組,在每個複制組内,依次探測各個複制節點,要求其傳回複制節點本身的狀态和其所涉及的複制的狀态。
這裡需要特别說明的是節點的系統異常狀态是指該節點在複制環境中的狀态,是一個推測值。當RPS無法得到節點的傳回消息,其他節點的傳回消息中所有涉及到該節點的複制關系都是異常時,RPS就認為該節點系統異常。
若複制結點或複制關系發生異常,這些異常都會記錄在SYSREP.RPS_FAULT_HISTORY表中。若其END_TIME字段為NULL,表示該故障還沒有結束,管理者需盡快檢查複制節點的狀态及其網絡連接配接。
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);
used time: 33.874(ms). Execute id is 0.
提示複制組設定沒有開始是以不能進行修改
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);
used time: 13.217(ms). Execute id is 29.
SQL> SP_RPS_REP_RESET_TIMER('REPhy2wy','hy2wy_TIMER');
used time: 0.790(ms). Execute id is 30.
used time: 24.494(ms). Execute id is 31.
現在在主庫中插入資料
used time: 2.296(ms). Execute id is 4.
SQL> insert into t1 values(2,'hy2');
used time: 1.519(ms). Execute id is 5.
used time: 1.430(ms). Execute id is 6.
used time: 0.512(ms). Execute id is 8.
在從庫中查詢記錄
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時間點表資料還沒有同步到從庫
1 2019-12-18 23:39:05.629576
used time: 0.432(ms). Execute id is 12.
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');
used time: 1.485(ms). Execute id is 36.
修改複制的錯誤逾時時間,逾時的時間機關是秒
SQL> SP_RPS_SET_ROUTE_FAULT_TIMEOUT('REPhy2wy', 60);
used time: 0.791(ms). Execute id is 37.
SQL> SP_RPS_DROP_REPLICATION('REPhy2wy');
used time: 1.807(ms). Execute id is 38.
删除整個複制組
SQL> SP_RPS_DROP_GROUP('REP_GRP_hy2wy');
used time: 1.807(ms). Execute id is 39.
删除資料複制所使用的使用者和系統表
SQL> SP_INIT_REP_SYS(0);
used time: 160.803(ms). Execute id is 51.
select * from SYSREP.RPS_INSTANCES;
Invalid schema name [SYSREP].
used time: 0.735(ms). Execute id is 0.
另外,在配置或修改配置時想要取消操作,可以使用如下系統過程結束配置。
SQL> SP_RPS_SET_CANCEL();
used time: 0.749(ms). Execute id is 40.