日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

DDL操作指南

本文介紹了PolarDB-X中DDL的執行邏輯和執行方式。

背景知識

PolarDB-X的架構如下:

image.png

PolarDB-X在執行DDL時,幾乎各個組件都需要參與,以保證DDL的正確性。

  • 元數據服務節點(GMS)維護了Table/Schema、Statistic等元數據信息;

  • 計算節點(CN)提供了分布式DDL執行、全局索引維護等能力;

  • 存儲節點(DN)維護了所有Table/Schema的物理數據,并且具有DDL下推能力(例如ALTER TABLE等DDL操作的下推)。

為了便于說明,本文將用戶發送到PolarDB-X實例(由計算節點接收)的DDL稱為用戶DDL,而在用戶DDL執行過程中由計算節點下推發送到存儲節點的DDL稱為物理 DDL。

DDL執行方式

PolarDB-X中,DDL按照執行方式主要分為兩類,物理執行的DDL和邏輯執行的DDL。

物理執行

物理執行的DDL指的是主要依賴存儲節點物理DDL下推能力完成的DDL。物理執行的DDL在執行過程中,計算節點僅維護元數據信息的變化,真正的結構變更由存儲節點完成。例如Create Table、Drop Table、Create Local Index以及常用的Alter Table等。

原子性

PolarDB-X中,一張邏輯表往往對應了多個物理表(分片),且這些分片往往分布在多個存儲節點中。在對一張邏輯表做DDL變更時,如果是物理執行方式,那么計算節點會將用戶DDL先轉換為物理DDL,然后下推到相應的存儲節點執行,并且記錄各個分片的完成情況,在所有分片完成物理DDL變更后,計算節點再進行元數據的最終變更。

物理執行的DDL在執行過程中是可以并發的,因此在執行過程中,計算節點不僅會記錄各個分片的執行情況,還需要保證所有分片變更的原子性,確保所有分片可以一起完成變更,詳情請參見DDL原子性

執行算法

物理執行的DDL在執行過程中是否鎖表(允許并發DML)、是否需要重建表(持續時間長短)以及是否僅修改元數據(秒級完成)完全依賴存儲節點執行物理DDL的執行算法。

存儲節點執行物理DDL的執行算法主要有以下三種:

  • INSTANT算法,僅需修改數據字典中的元數據,不需要修改或復制存量數據,也不需要重建物理表,物理DDL可以秒級完成;

  • INPLACE算法,物理表中的數據需要復制和重建,但是復制和重建都在存儲引擎內部完成,通常允許并發讀寫訪問,對業務影響較小;

  • COPY算法,需要將物理表中所有的數據復制到新表中,數據復制期間會阻塞所有寫操作(鎖表),對業務影響較大。

不同的DDL支持的執行算法會有所不同,詳情請參見Online DDL

邏輯執行

邏輯執行的DDL指的是主要依賴計算節點Online Schema Change能力完成的DDL。邏輯執行通常需要經歷創建新的臨時表,拷貝存量數據,同步增量數據,并進行元數據切換等步驟,一般執行時間較長,但是全程Online無需鎖表,例如:Create Global Index、Drop Global Index、Online Modify Column、Add Primary Key以及分區變更相關DDL等;也存在一些邏輯執行的DDL可以通過直接修改元數據并進行同步方式完成,例如:Rename Table、Rename Global Index等。

邏輯執行的DDL通常擁有以下幾個特點:

  • 在線變更,無需鎖表,對用戶業務影響較小;

  • 通常需要重建表,存在數據拷貝,執行時間相對較長;

  • 保證原子性,不會出現部分分片執行成功,部分分片執行失敗的情況。

并行度調整

邏輯執行的DDL通常需要拷貝存量數據,這是一個耗時較長的過程,在計算節點和存儲節點不存在CPU、IO等瓶頸的情況下,可以調整存量數據回填的并行度以及數據回填的限速,來提升DDL執行效率。

例如,在創建全局二級索引的過程中,主表的存量數據需要回填到全局二級索引表中,如果計算節點和存儲節點的CPU、IO等資源都不存在瓶頸,可以調整數據回填的并行度以及數據回填的限速,來提升數據回填的速度。

-- 設置數據回填的全局并行度,默認值為32,根據經驗這個值一般無需調整
set global BACKFILL_PARALLELISM = 32;

-- 物理分片數據回填的并行度,默認值為4,物理分片數據量較大時推薦調整
set global PHYSICAL_TABLE_BACKFILL_PARALLELISM = 8;

-- 設置數據回填的限速,默認值為150000 rows/s
set global GSI_BACKFILL_SPEED_LIMITATION = 250000;

由于不同的表結構、拓撲以及數據量都不盡相同,因此除了上面給出的參數外還有一些其他參數可以調整,詳情請參見并行DDL

如何判斷DDL執行方式

PolarDB-X中,可以通過explain語句來判斷DDL的執行方式。如果explain的結果與原本DDL語句類似,則為物理執行的DDL;如果explain的結果中包含類似Create Table語句,則為邏輯執行的DDL。

示例

  • PolarDB-X實例中,創建一張邏輯表t1,其結構如下:

+-------+--------------------------------------------------------------------------+
| Table | Create Table                                                             |
+-------+--------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
        `a` int(11) DEFAULT NULL,
        `b` int(11) DEFAULT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4                                        |
+-------+--------------------------------------------------------------------------+
  • 使用EXPLAIN語句來判斷“給邏輯表t1添加一個局部索引”這個DDL操作是邏輯執行還是物理執行,其執行結果如下,可以看到,執行方式為物理執行。

explain alter table t1 add local index idx(b);
+----------------------------------------------------------------------------------+
| EXECUTION PLAN                                                                   |
+----------------------------------------------------------------------------------+
| ALTER_TABLE( tables="t1", shardCount=16, sql="ALTER TABLE ? ADD INDEX idx (b)" ) |
| EXCLUDE_RESOURCE( wumu.t1, wumu.tg17 )                                           |
| SHARE_RESOURCE( wumu.t1, wumu.tg17 )                                             |
+----------------------------------------------------------------------------------+
  • 使用explain語句來判斷“將邏輯表t1的分區算法修改為partition by key(a)”這個DDL操作是邏輯執行還是物理執行,其執行結果如下,可以看到,執行方式為邏輯執行。

explain alter table t1 partition by key(a);
+----------------------------------------------------------------------------------+
| EXECUTION PLAN                                                                   |
+----------------------------------------------------------------------------------+
| CREATE_TABLE( tables="t1_msfg", shardCount=16, sql="CREATE TABLE ? (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `_drds_implicit_id_` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`_drds_implicit_id_`),
  INDEX `auto_shard_key_a` USING BTREE(`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4" )                                      |
| DROP_TABLE( tables="t1_msfg", shardCount=16, sql="DROP TABLE IF EXISTS ?" )       |
| EXCLUDE_RESOURCE( wumu.t1, wumu.t1_msfg, wumu.tg17 )                              |
| SHARE_RESOURCE( wumu.t1, wumu.t1_msfg, wumu.tg17 )                                |
+-----------------------------------------------------------------------------------+

如何異步執行DDL

PolarDB-X中,默認使用同步的方式執行DDL,與MySQL保持一致。在同步執行DDL時,在執行期間如果連接發生中斷可能導致DDL執行被暫停,如果預期DDL執行時間過長,可以考慮使用異步的方式執行DDL。

可以通過在要執行的DDL前添加hint的方式來開啟異步執行DDL,示例如下:

/*+TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true)*/ alter table t1 add global index gsi_a(a) partition by key(a);

更多信息,請參見DDL異步執行語法擴展