本文介紹全球資料庫網路(Global Database Network,簡稱GDN)的DDL複製操作。
通過高效的DML複製,可以實現GDN上下遊叢集之間資料表內容的一致性,而DDL複製,則是保證GDN主從叢集之間Schema一致性的核心能力。GDN主從叢集之間Schema的一致性不僅僅局限於表結構的一致,而且體現在所有資料庫物件之間的一致,這樣才能保證在發生主從切換時從叢集有能力承載應用的流量。否則,即使丟失一個索引,也可能引發嚴重的效能問題。
DDL類型
PolarDB-X支援多種類型的資料庫物件,包括常見的相容MySQL的表、列、索引、視圖、函數等,以及TableGroup、Sequence、全域二級索引(GSI)、列存索引(CCI)、自訂函數等各種自訂的物件類型。此外,還提供了許多自訂的擴充文法,如TTL、Locality、無鎖變更列類型(OMC)、本地索引(Local index)等。無論是在相容性還是分布式情境的複雜性方面,DDL複製都是一個相當具有挑戰性的能力。因此,PolarDB-X提供了內建的DDL複製能力,簡單、可靠且便於使用。
DDL類型支援情況說明:
類別 | 類型 | 是否支援 | 說明 |
DATABASE | CREATE_DATABASE | 是 | 請參見:資料庫。 說明 ALTER DATABASE目前不支援修改字元集,因此在複製情境下無法實現支援。 |
DROP_DATABASE | 是 | ||
ALTER_DATABASE | 否 | ||
MOVE_DATABASE | 否 | ||
TABLE | CREATE_TABLE | 是 | 請參見:資料表。 |
ALTER_TABLE | 是 | ||
DROP_TABLE | 是 | ||
TRUNCATE_TABLE | 是 | ||
RENAME_TABLE | 是 | ||
ANALYZE_TABLE | 是 | ||
PARTITION | 分區分裂 | 是 | 請參見:分區變更文法。 說明 暫不支援分區遷移,請參見限制一。 |
熱點分區分裂 | 是 | ||
分區合并 | 是 | ||
分區遷移 | 否 | ||
重新命名分區 | 是 | ||
增加分區 | 是 | ||
刪除分區 | 是 | ||
修改分區 | 是 | ||
重組分區 | 是 | ||
清空分區 | 是 | ||
TABLEGROUP | CREATE_TABLEGROUP | 是 | 請參見:表組。 |
DROP_TABLEGROUP | 是 | ||
ALTER_TABLEGROUP | 是 | ||
MERGE_TABLEGROUP | 是 | ||
ALTER_TABLEGROUP_ADD_TABLE | 是 | ||
ALTER_TABLE_SET_TABLEGROUP | 是 | ||
JOINGROUP | CREATE_JOINGROUP | 是 | |
ALTER_JOINGROUP | 是 | ||
DROP_JOINGROUP | 是 | ||
INDEX | CREATE_INDEX | 是 | 請參見:索引。 |
DROP_INDEX | 是 | ||
ALTER_INDEX | 是 | ||
ALTER_INDEX_VISIBILITY | 是 | ||
SEQUENCE | CREATE_SEQUENCE | 是 | 請參見:Sequence。 |
DROP_SEQUENCE | 是 | ||
ALTER_SEQUENCE | 是 | ||
RENAME_SEQUENCE | 是 | ||
CONVERT_ALL_SEQUENCES | 是 | ||
FUNCTION | CREATE_FUNCTION | 是 | 請參見:自訂函數。 |
DROP_FUNCTION | 是 | ||
ALTER_FUNCTION | 是 | ||
CREATE_JAVA_FUNCTION | 是 | ||
ALTER_JAVA_FUNCTION | 是 | ||
DROP_JAVA_FUNCTION | 是 | ||
PROCEDURE | CREATE_PROCEDURE | 是 | 請參見:預存程序。 |
ALTER_PROCEDURE | 是 | ||
DROP_PROCEDURE | 是 | ||
VIEW | CREATE_VIEW | 是 | 請參見:視圖。 |
DROP_VIEW | 是 | ||
ALTER_VIEW | 是 | ||
CREATE_MATERIALIZED_VIEW | 是 | ||
DROP_MATERIALIZED_VIEW | 是 | ||
USER | CREATE_USER | 是 | 請參見:帳號許可權管理。 |
DROP_USER | 是 | ||
SET_PASSWORD | 是 | ||
GRANT_PRIVILEGE_TO_USER | 是 | ||
REVOKE_PRIVILEGE_FROM_USER | 是 | ||
ROLE | CREATE_ROLE | 是 | 請參見:角色許可權管理。 |
DROP_ROLE | 是 | ||
GRANT_PRIVILEGE_TO_ROLE | 是 | ||
GRANT_ROLE_TO_USER | 是 | ||
SQL_SET_DEFAULT_ROLE | 是 | ||
REVOKE_PRIVILEGE_FROM_ROLE | 是 | ||
REVOKE_ROLE_FROM_USER | 是 | ||
SET | SET GLOBAL ... | 否 | PolarDB-X採取了和MySQL相同的策略,在主從複製鏈路中並未進行同步,這並非Schema變更。如需進行調整,請在主叢集和從叢集分別進行操作。 |
SQL限流 | * | 否 | SQL限流通常是一種臨時性操作,GDN不支援將限流規則複製到從叢集,如果需要,請在主叢集和從叢集分別進行操作。 |
目前不支援與列存索引相關的DDL複製(CREATE/DROP/ALTER COLUMNAR INDEX)。
表群組類型
PolarDB-X支援兩種類型的表組:顯式表組和隱式表組。
顯式表組允許使用者自訂,可以通過
CREATE TABLEGROUP進行建立,通過DROP TABLEGROUP進行刪除,通過ALTER TABLEGROUP進行變更,具體操作可參考表組。隱式表組由PolarDB-X隱式建立,當建立分區表、刪除分區表、變更表的分區類型時,可能會涉及隱式表組的建立、變更或刪除。隱式表組不支援通過
CREATE TABLEGROUP和DROP TABLEGROUP進行管理,但支援通過ALTER TABLEGROUP進行變更。隱式表組的名稱通過維護一個序號產生,如tg1、tg2、tg3...,以此類推。該序號的產生具有不確定性,例如並行建立兩張不同的分區表T1和T2,這兩張表對應的隱式表組的序號大小是隨機的;此外,序號還可能被跳過,例如對序號加1後產生了表組名稱,但DDL任務流出現了復原,則該序號被作廢。
隱式表組對PolarDB-X的主從複製帶來了挑戰。如果讓主叢集和從叢集按照預設的規則各自產生自己的隱式表組,可能會導致主從叢集中相同表的隱式表組名稱不一致,甚至可能出現所有隱式表組名稱完全混亂的情況。在GDN資料複製情境下,隱式表組的複製是通過擴充DDL SQL文法來實現的。當DDL操作涉及隱式表組的變更時,主叢集記錄到Binlog中的DDL都是經過擴充的DDL SQL。
樣本一
提交的建表SQL:
create table if not exists tb1 (
a int PRIMARY KEY,
b int,
c int,
d varchar(10) UNIQUE,
INDEX b(b),
INDEX b_2(b),
KEY b_3 (b),
KEY b_4 (b),
UNIQUE KEY b_5 (b),
UNIQUE KEY b_6 (b),
UNIQUE INDEX b_7 (b),
UNIQUE INDEX b_8 (b),
INDEX g1(b),
KEY g2 (b),
UNIQUE KEY g3 (b),
UNIQUE INDEX g4 (b)
) DEFAULT CHARACTER SET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci;樣本二
提交的變更分區的SQL:
ALTER TABLE tb1 MERGE PARTITIONS p1, p2 TO p12;記錄到Binlog中經過擴充後的SQL:
ALTER TABLE tb1 MERGE PARTITIONS p1, p2 TO p12 WITH TABLEGROUP=tg29 IMPLICIT;多流複製
在單流複製情境下,只需按照Binlog中的順序逐條執行複製主叢集的DDL SQL到從叢集。然而,在多流複製情境下,在進行DDL複製時,則需要考慮不同複製鏈路之間的協調一致。每條複製鏈路在收到某條DDL SQL後必須等待其它複製鏈路,只有當所有鏈路都收到該DDL SQL之後,才可以將DDL操作複製給從叢集,否則將導致DML流量和Schema之間的不一致,引發異常或資料錯誤。
針對多流複製,GDN提供了分布式DDL複製引擎(Distributed DDL Replication Engine),通過高效的多路協調演算法,實現分布式情境下DDL複製的一致性。

使用限制
限制一
PolarDB-X提供了支援通過LOCALITY指定儲存位置。該特性允許在DDL SQL中包含DN節點的執行個體id。然而,由於GDN目前暫不支援主從叢集間DN節點之間的關聯映射,因此在將包含此類SQL的DDL複製到下遊時,系統將會剔除SQL中涉及DN的相關內容。針對這一情況,您可登入從叢集並手動進行分區分布的調整。
樣本一
// 主叢集執行SQL: CREATE TABLE test_pg3 ( id int ) DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (1000) LOCALITY 'dn=xdevelop-240524092100-31ef-bngl-dn-1', PARTITION p1 VALUES LESS THAN (2000) LOCALITY 'dn=xdevelop-240524092100-31ef-bngl-dn-1' ) // 複製到從叢集的SQL: create table test_pg3 ( id int ) DEFAULT CHARACTER SET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (1000), PARTITION p1 VALUES LESS THAN (2000) ) WITH TABLEGROUP = tg3778 IMPLICIT樣本二
// 主叢集執行SQL: ALTER TABLE special_dml_test1 MOVE PARTITIONS (p2, p4, p6, p8) TO 'xdevelop-240524092100-31ef-bngl-dn-0'; // 複製到從叢集的SQL: ALTER TABLE special_dml_test1;
限制二
PolarDB-X提供了SET PARTITION_HINT命令,可以指定SQL語句在特定分區上執行。在GDN主從叢集複製情境下,目前不支援將該命令透傳到從叢集,也就是說,在主叢集通過該命令顯式將資料寫入指定分區後,GDN無法保證這些資料也會被寫入到從叢集的相同分區。