全部產品
Search
文件中心

PolarDB:Online DDL

更新時間:Oct 16, 2024

線上DDL(Online Data Definition Language,Online DDL)是指資料庫系統可以允許DDL操作與其他事務並發執行,減少對錶的鎖定時間,提高了資料庫的並發效能,本文將詳細介紹Online DDL的執行特性。

前提條件

Online DDL特性概述

PolarDB-X中存在兩類DDL:

  • 物理執行:直接下推到儲存節點執行物理DDL,如CREATE LOCAL INDEXALTER/ADD COLUMNCREATE/DROP TABLE,此類DDL的計算節點只進行分區級的物理語句轉寄、協調和元資訊管理,其實現原理及Online特徵與MySQL DDL基本保持一致。

  • 邏輯執行:由計算節點自行實現完整的DDL執行操作,如GLOBAL INDEXCREATE/DROP PARTITIONCREATE/DROP PRIMARY KEY無鎖變更列類型(OMC),此類DDL的實現方式為執行個體中冗餘一份暫存資料表用於回填存量資料和追趕增量資料,然後切流到新表。計算節點處理完整的資料回填、增量多寫和元資訊管理流程,此類DDL均不會鎖表。

根據對業務SQL的影響,可以從以下三個維度進一步分析Online DDL的特性:

  • 是否鎖表

    • Online DDL只會在切表時秒級阻塞DML操作,其餘執行時間均可執行DML操作。

    • 非Online DDL則會在執行過程中全程鎖表,不可進行DML操作。

  • 是否需要回填資料

    • 對於只涉及中繼資料修改的DDL(如INSTANT ADD COLUMNRENAME TABLE等),此類操作秒級時間內即可完成,無需回填資料。

    • 對於DROP TABLEDROP INDEX,此類操作只需要修改中繼資料和刪除相關物理檔案,執行時間較短,無須回填資料。

    • 對於非INSTANT操作、非刪除表、非刪除索引的DDL,需要在物理執行或者邏輯執行過程中拷貝原有資料,寫入新的聚簇或者二級索引,在執行過程中佔用一定量的叢集資源,執行時間與表的資料量、並發度、執行個體資源規格等相關。

  • 是否需要同步多寫

    • 對於邏輯執行且需回填資料的DDL,在資料回填期間需要將線上DML流量同步多寫到目標暫存資料表上,可能與回填流量之間出現資料衝突,並且由於多寫採用分散式交易保證原子性,下推執行的DML將轉變為邏輯執行,線上流量的效能將出現一定程度的下跌PolarDB-X對於包括MOVE/SPLIT PARTITION無鎖變更列類型(OMC)REBALANCE在內的邏輯執行DDL均實現了非同步多寫最佳化,將DML的多寫流量緩衝到資料回填階段後非同步執行,以最大的降低多寫衝突和效能下降的期間(在本文Online DDL特性詳述章節中將對此類DDL標註“是否支援非同步多寫最佳化”屬性)。

    • 對於物理執行、回填資料且不鎖表的DDL,即對於儲存節點的原生Online DDL,均已預設通過Online Log實現了原生的非同步多寫(在本文Online DDL特性詳述章節中將不對此類DDL標註“是否支援非同步多寫最佳化”屬性)。

    • 其他類型DDL不需要多寫。(在本文Online DDL特性詳述章節中將不對此類DDL標註“是否支援非同步多寫最佳化”屬性)。

Online DDL特性詳述

重要

在通過DDL語句進行表操作和列操作時,特別是在MODIFY COLUMNCHANGE COLUMN語句中,需要聲明完整的列屬性,避免遺漏屬性從而造成非預期的列修改行為。

索引操作

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

建立局部二級索引

No

No

No

Yes

-

刪除局部二級索引

No

No

No

No

-

重新命名局部二級索引

No

No

No

No

-

建立全域二級索引

Yes

No

Yes

Yes

No

刪除全域二級索引

Yes

No

No

No

-

重新命名全域二級索引

Yes

No

No

No

-

表操作

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

修改(ROW_FORMAT)

No

No

Yes

Yes

-

OPTIMIZE TABLE

No

No

Yes

Yes

-

重新命名表

No

No

No

No

-

修改表的預設字元集

No

No

Yes

Yes

-

轉換字元集

No

Yes

Yes

Yes

-

清理表(TRUNCATE TABLE WITHOUT GSI)

No

No

Yes

No

-

清理帶有GSI的表(TRUNCATE TABLE WITH GSI)

Yes

No

Yes

No

-

分區操作

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

遷移分區

Yes

No

Yes(僅重建相應分區)

Yes

Yes

說明
  • 邏輯表和全域二級索引都具備顯式或隱式主鍵支援此項最佳化。

  • 全域唯一二級索引不支援此項最佳化,因為其預設沒有主鍵。

分裂分區

Yes

No

Yes(僅重建相應分區)

Yes

合并分區

Yes

No

Yes(僅重建相應分區)

Yes

No

增加分區

說明

Yes

No

No

No

-

刪除分區

說明
  • RANGE分區RANGE COLUMNS分區定義的分區刪除最後一個分區,不需要資料回填。刪除其他分區時需要資料回填。

  • LIST分區LIST COLUMNS分區沒有定義DEFAULT分區的情況下,刪除分區操作不需要資料回填,存在DEFAULT定義,刪除分區操作則需要資料回填。

Yes

No

No

No

-

重組分區

Yes

No

Yes(僅重建相應分區)

Yes

No

清空分區

Yes

No

No

No

-

重新命名分區

Yes

No

No

No

-

修改分區

Yes

No

Yes(僅重建相應分區)

Yes

No

說明

表組和表級分區操作的Online特性完全相同,均可參照上表。

Sequence變更操作

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

建立Sequence

Yes

No

No

No

-

刪除Sequence

Yes

No

No

No

-

修改Sequence屬性

Yes

No

No

No

-

轉換Sequence類型

Yes

No

No

No

-

一般列操作

重要

列操作分為一般列操作(即非主鍵、非分區鍵、非產生列的列操作)、主鍵和分區鍵變更操作、產生列操作,可通過SHOW FULL CREATE TABLE TABLE_NAME查看完整的列屬性,以確定列操作所屬的範疇。

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

加列(說明請參見說明一

No

No

Yes

Yes

-

減列

No

No

Yes

Yes

-

重新命名列

No

No

No

No

-

修改列的順序

No

No

Yes

Yes

-

修改列的預設值

No

No

No

No

-

刪除列的預設值

No

No

No

No

-

修改列的資料類型

No

Yes

Yes

Yes

-

延長varchar類型列的長度(說明請參見說明二說明三

No

No

No

No

-

延長char類型列的長度(說明請參見說明三

No

Yes

Yes

Yes

-

修改列為NULL

No

No

Yes

Yes

-

修改列為NOT NULL

說明

SQL_MODE含有strict_trans_tablesstrict_all_tables標誌時,此操作為Online操作,否則將會降級為COPY演算法直接鎖表拷貝資料。

No

No

Yes

Yes

-

說明

  1. PolarDB-X對於加列操作單獨支援INSTANT演算法,可在僅修改中繼資料的情況下執行。對於部分改列操作,可採用邏輯執行線上完成,在分別顯式聲明ALGORITHM=INSTANTALGORITHM=OMC前提下,其Online執行特徵如下:

    操作類型

    是否邏輯執行

    是否鎖表

    是否重建表

    是否需要回填資料

    是否支援非同步多寫最佳化

    秒級加列

    No

    No

    No

    No

    -

    線上變更列類型

    Yes

    No

    Yes

    Yes

    Yes

  2. 延長VARCHAR類型列的長度,PolarDB-X5.7版本的儲存節點(8.0版本儲存節點不支援)上預設支援INPLACE演算法,其長度在255個位元組以下時間長度度需要一個位元組儲存,256個位元組及以上需要兩個位元組儲存,如果該列長度由小於等於255位元組延長至大於等於256位元組,則不支援僅修改中繼資料,反之則支援僅修改中繼資料。

    操作類型

    是否邏輯執行

    是否鎖表

    是否重建表

    是否需要回填資料

    是否支援非同步多寫最佳化

    延長VARCHAR類型列的長度且位元組長度跨越256

    No

    No

    Yes

    Yes

    -

  3. 延長CHAR列長度操作,PolarDB-X5.7版本的儲存節點(8.0版本儲存節點不支援)上預設支援INPLACE演算法,其Online執行特徵如下:

    操作類型

    是否邏輯執行

    是否鎖表

    是否重建表

    是否需要回填資料

    是否支援非同步多寫最佳化

    延長CHAR類型列的長度

    No

    No

    Yes

    Yes

    -

主鍵與拆分列變更操作

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

添加主鍵

Yes

No

Yes

Yes

No

刪除原有主鍵並添加新主鍵

Yes

No

Yes

Yes

No

修改拆分方式、分區數或者拆分欄位

Yes

No

Yes(重建變更拆分的GSI或者主表)

Yes

No

修改涉及GSI或者主表拆分列的定義

Yes

No

Yes(重建以變更列為拆分鍵的GSI或者主表)

Yes

No

產生列操作

操作類型

是否邏輯執行

是否鎖表

是否重建表

是否需要回填資料

是否支援非同步多寫最佳化

增加虛擬列(VIRTUAL Column

No

No

No

No

-

刪除虛擬列(VIRTUAL Column

No

No

No

No

-

增加儲存列(STORED Column

No

Yes

Yes

Yes

-

刪除儲存列(STORED Column

No

No

Yes

Yes

-

增加邏輯列(LOGICAL Column

Yes

No

Yes

Yes

No

刪除邏輯列(LOGICAL Column

Yes

No

Yes

Yes

-

如何控制online執行特性

PolarDB-X支援通過下面的方式指定online執行特徵:

  • 對於加列,可通過聲明ALGORITHM=INSTANT指定採用intant add column方式。

  • 對於線上修改列,可以通過聲明ALGORITHM=OMC方式指定採用邏輯執行方式。

  • 對於邏輯執行的DDL, 預設均為online執行方式,不需要任何特殊聲明。

  • 對於物理執行的一般列操作和本地索引操作DDL,可通過聲明ALGORITHM=INPLACE指定online執行方式,如不支援則會直接報錯,如支援則會直接執行。