線上DDL(Online Data Definition Language,Online DDL)是指資料庫系統可以允許DDL操作與其他事務並發執行,減少對錶的鎖定時間,提高了資料庫的並發效能,本文將詳細介紹Online DDL的執行特性。
前提條件
Online DDL特性概述
在PolarDB-X中存在兩類DDL:
物理執行:直接下推到儲存節點執行物理DDL,如
CREATE LOCAL INDEX
、ALTER/ADD COLUMN
、CREATE/DROP TABLE
,此類DDL的計算節點只進行分區級的物理語句轉寄、協調和元資訊管理,其實現原理及Online特徵與MySQL DDL基本保持一致。
邏輯執行:由計算節點自行實現完整的DDL執行操作,如
GLOBAL INDEX
、CREATE/DROP PARTITION
、CREATE/DROP PRIMARY KEY
、無鎖變更列類型(OMC),此類DDL的實現方式為執行個體中冗餘一份暫存資料表用於回填存量資料和追趕增量資料,然後切流到新表。計算節點處理完整的資料回填、增量多寫和元資訊管理流程,此類DDL均不會鎖表。
根據對業務SQL的影響,可以從以下三個維度進一步分析Online DDL的特性:
是否鎖表:
Online DDL只會在切表時秒級阻塞DML操作,其餘執行時間均可執行DML操作。
非Online DDL則會在執行過程中全程鎖表,不可進行DML操作。
是否需要回填資料:
對於只涉及中繼資料修改的DDL(如
INSTANT ADD COLUMN
、RENAME TABLE
等),此類操作秒級時間內即可完成,無需回填資料。對於
DROP TABLE
、DROP 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 COLUMN
和CHANGE 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 | - |
刪除分區 說明
| 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 | - |
No | No | No | No | - | |
延長char類型列的長度(說明請參見說明三) | No | Yes | Yes | Yes | - |
修改列為NULL | No | No | Yes | Yes | - |
修改列為NOT NULL 說明 當 | No | No | Yes | Yes | - |
PolarDB-X對於加列操作單獨支援INSTANT演算法,可在僅修改中繼資料的情況下執行。對於部分改列操作,可採用邏輯執行線上完成,在分別顯式聲明
ALGORITHM=INSTANT
和ALGORITHM=OMC
前提下,其Online執行特徵如下:操作類型
是否邏輯執行
是否鎖表
是否重建表
是否需要回填資料
是否支援非同步多寫最佳化
No
No
No
No
-
線上變更列類型
Yes
No
Yes
Yes
Yes
延長
VARCHAR
類型列的長度,PolarDB-X在5.7版本的儲存節點(8.0版本儲存節點不支援)上預設支援INPLACE
演算法,其長度在255個位元組以下時間長度度需要一個位元組儲存,256個位元組及以上需要兩個位元組儲存,如果該列長度由小於等於255位元組延長至大於等於256位元組,則不支援僅修改中繼資料,反之則支援僅修改中繼資料。操作類型
是否邏輯執行
是否鎖表
是否重建表
是否需要回填資料
是否支援非同步多寫最佳化
延長
VARCHAR
類型列的長度且位元組長度跨越256No
No
Yes
Yes
-
延長
CHAR
列長度操作,PolarDB-X在5.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執行方式,如不支援則會直接報錯,如支援則會直接執行。