全部產品
Search
文件中心

:DDL複製

更新時間:Jul 12, 2024

本文介紹全球資料庫網路(Global Database Network,簡稱GDN)的DDL複製操作。

通過高效的DML複製,可以實現GDN上下遊叢集之間資料表內容的一致性,而DDL複製,則是保證GDN主從叢集之間Schema一致性的核心能力。GDN主從叢集之間Schema的一致性不僅僅局限於表結構的一致,而且體現在所有資料庫物件之間的一致,這樣才能保證在發生主從切換時從叢集有能力承載應用的流量。否則,即使丟失一個索引,也可能引發嚴重的效能問題。

DDL類型

PolarDB-X支援多種類型的資料庫物件,包括常見的相容MySQL的表、列、索引、視圖、函數等,以及TableGroupSequence全域二級索引(GSI)列存索引(CCI)自訂函數等各種自訂的物件類型。此外,還提供了許多自訂的擴充文法,如TTLLocality無鎖變更列類型(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 TABLEGROUPDROP 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複製的一致性。

image.png

使用限制

限制一

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無法保證這些資料也會被寫入到從叢集的相同分區。