在MySQL生態中,DDL操作複雜且耗時,稍有不慎,就會影響正常業務。PolarDB MySQL版新增EXPLAIN DDL功能。您可以在執行DDL前瞭解執行細節,從而正確評估DDL操作對當前業務的影響。
功能介紹
在MySQL生態中,DDL操作非常複雜,不僅耗時間長度、消耗硬體資源,而且涉及鎖表操作,若操作不當可能會影響正常業務,甚至造成災難性後果。此外,不同的DDL操作具有不同的執行特點,例如,添加欄位不需要重建表,通常可以在秒級內完成,而修改欄位類型則需要全表重建,並且在執行期間無法進行寫操作。
為了協助您深入瞭解和評估執行DDL所需的各方面資訊,例如當前是否存在鎖衝突、DDL操作是否需要重建表等,PolarDB MySQL版新增提供了EXPLAIN DDL功能。與EXPLAIN SQL類似,您可以在執行DDL前對DDL語句進行EXPLAIN,從而擷取DDL操作的執行細節。
版本說明
PolarDB MySQL版資料庫引擎版本支援如下:
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.49及以上。
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.27及以上。
注意事項
EXPLAIN DDL操作僅支援使用InnoDB儲存引擎的表。
EXPLAIN DDL操作不會發生任何實際資料變動,您可以放心執行。
主節點和唯讀節點均可執行EXPLAIN DDL操作,但是Possible blocked MDLs欄位僅展示當前節點存在的潛在鎖衝突。
使用說明
參數說明
您可以先通過loose_polar_enable_explain_ddl參數開啟EXPLAIN DDL功能,並通過loose_polar_max_collect_thd_num_in_explain_ddl參數設定收集的潛在MDL阻塞線程的數量。具體操作請參見設定叢集參數和節點參數。參數說明如下:
參數名 | 層級 | 說明 |
loose_polar_enable_explain_ddl | Global | EXPLAN DDL功能開關。取值範圍如下:
|
loose_polar_max_collect_thd_num_in_explain_ddl | Global | 控制收集的潛在MDL阻塞線程的數目。 取值範圍:[1-512],預設值為16。 |
文法說明
{ EXPLAIN | DESCRIBE | DESC } ALTER TABLE ...輸出結果中,各個欄位的含義如下:
欄位 | 含義 | 取值範圍 |
Error No | 錯誤碼。 |
|
Algorithm | DDL操作將使用的執行演算法。 |
|
Metadata Only | DDL操作是否僅需修改元資訊,無需修改表中資料。 |
|
Rebuilt table | DDL操作是否需要表重建。 |
|
Parallel Support | DDL操作是否支援使用並行DDL進行加速。 |
|
Parallel Degree | DDL操作將使用的線程數。 |
|
Concurrent DML | 在DDL操作期間是否支援並發讀寫。 |
|
Possible blocked MDLs | 可能阻塞DDL操作的其他事務。此處記錄事務所在串連的Process ID。 | 由Process ID拼接的字串。各個ID之間以逗號(,)分隔。 |
Error Msg | 與Error No對應,表示當前DDL操作的錯誤資訊。 | 字串。 |
Suggest Info | 當前DDL操作的建議資訊。 | 字串。 說明 包括但不限於如下內容:
|
Statement | 當前語句。 | DDL語句。 |
樣本
查詢DDL操作的執行特徵
通過分析EXPLAIN DDL返回結果中的Algorithm、Metadata Only、Rebuilt Table和Concurrent DML欄位,您可以方便地瞭解當前DDL操作的執行特徵。
當
Concurrent DML欄位為Yes時,表示當前DDL執行期間支援並發的讀寫操作,不會阻塞業務的讀寫請求。當
Rebuilt Table欄位為Yes時,表示當前DDL操作需要對整表進行重建。當資料表空間較大時,通常需要較長時間,因此建議選擇業務低峰期執行此類DDL。當
Metadata Only欄位為Yes時,表示當前DDL操作無需修改表中的資料。此類操作可以無視表大小,通常能在秒級完成,對資料庫負載影響不大。
以下是一些DDL操作的執行樣本:
測試表結構如下:
SHOW CREATE TABLE t1\G *************************** 1. row *************************** Table: t1 CREATE TABLE: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` char(1) DEFAULT NULL, `c` char(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)對添加欄位操作進行EXPLAIN:
EXPLAIN ALTER TABLE t1 ADD COLUMN d INT;執行結果如下:
*************************** 1. row *************************** Error No: 0 Algorithm: INSTANT Metadata Only: Yes Rebuilt table: No Parallel Support: Not Need Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: Statement: EXPLAIN ALTER TABLE t1 ADD COLUMN d int 1 row in set (0.00 sec)結果顯示,Algorithm欄位值為INSTANT,表示加列操作支援INSTANT演算法;Metadata Only欄位值為Yes,表示加列操作僅修改中繼資料,無需表重建;Concurrent DML欄位值為Yes,表示加列操作支援並發的DML訪問。此類DDL可以秒級內完成,對業務影響較小。
對修改表名操作進行EXPLAIN:
EXPLAIN ALTER TABLE t1 rename t1_rn;執行結果如下:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: Yes Rebuilt table: No Parallel Support: Not Need Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: Statement: EXPLAIN ALTER TABLE t1 rename t1_rn 1 row in set (0.01 sec)結果顯示,Algorithm欄位值為INPLACE,表示修改表名操作支援INPLACE演算法;Metadata Only欄位值為Yes,表示修改表名操作僅修改中繼資料,無需表重建; Concurrent DML欄位值為Yes,表示修改表名操作支援並發的DML訪問。此類DDL操作無需修改表中資料,對業務影響較小。
對修改列定義操作進行EXPLAIN:
EXPLAIN ALTER TABLE t1 modify COLUMN a char(1);執行結果如下:
*************************** 1. row *************************** Error No: 0 Algorithm: COPY Metadata Only: No Rebuilt table: Yes Parallel Support: No Parallel Degree: 1 Concurrent DML: No Possible blocked MDLs: Error Msg: Suggest Info: Statement: EXPLAIN ALTER TABLE t1 modify COLUMN a char(1) 1 row in set (0.01 sec)結果顯示,Algorithm欄位值為COPY,表示修改列定義操作僅支援COPY演算法;Metadata Only欄位值為No,表示修改列定義操作需要發生資料重建; Concurrent DML欄位值為No,表示修改列定義操作不支援並發的DML訪問。此類DDL操作對業務影響較大,需要謹慎執行。
對重建表操作進行EXPLAIN:
EXPLAIN ALTER TABLE t1 engine= innodb;執行結果如下:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: Yes Parallel Support: Yes But Not Enable Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: 1. This DDL operation could use Parallel DDL to speed up. Statement: EXPLAIN ALTER TABLE t1 engine= innodb結果顯示,Algorithm欄位值為INPLACE,表示重建表操作支援INPLACE演算法;Rebuilt Table欄位值為Yes,表示重建表操作需要重建全表資料;Concurrent DML欄位值為Yes,表示重建表操作支援並發的DML訪問。此類DDL操作雖然執行期間支援業務訪問,但是由於全表重建會消耗較多資料庫資源,因此建議在業務低峰期執行。
查詢當前DDL操作是否支援並行DDL加速
PolarDB MySQL版支援使用並行DDL功能對DDL操作進行加速。藉助於EXPLAIN DDL執行結果中的Parallel Support和Parallel Degree欄位,可以瞭解當前DDL操作是否支援使用並行DDL功能進行加速。
若當前DDL操作支援並行DDL,但是叢集未開啟並行DDL功能,Suggest Info欄位會展示如下提示資訊This DDL operation could use Parallel DDL to speed up.,此時,您可以參見並行DDL開啟並行DDL功能。
若當前DDL操作支援並行DDL,且叢集已開啟並行DDL功能,EXPLAIN DDL會根據當前叢集的負載,給出推薦的並行度配置。此時Suggest Info欄位展示的提示資訊如下This DDL operation can be accelerated by increasing the value of 'innodb_polar_parallel_ddl_threads'.The recommended value is 8. 您可以參見提示的並行度對
innodb_polar_parallel_ddl_threads參數進行調整,以擷取更大的加速效果。
下面展示了兩個執行樣本:
關閉並行DDL功能,對添加二級索引操作進行EXPLAIN:
MySQL [test]> SHOW variables LIKE "%parallel_ddl_threads%"; +----------------------------------------------------+-------+ | Variable_name | Value | +----------------------------------------------------+-------+ | innodb_polar_innovate_default_parallel_ddl_threads | 1 | | innodb_polar_parallel_ddl_threads | 1 | +----------------------------------------------------+-------+ 2 rows in set (0.03 sec)結果顯示,當前叢集暫未開啟並行DDL功能。此時,對添加二級索引操作進行EXPLAIN:
EXPLAIN ALTER TABLE t1 ADD index k_a(a);結果如下:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: No Parallel Support: Yes But Not Enable Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: 1. This DDL operation could use Parallel DDL to speed up. Statement: EXPLAIN ALTER TABLE t1 ADD index k_a(a) 1 row in set (0.01 sec)當關閉並行DDL功能時,對添加二級索引操作進行EXPLAIN。結果顯示,Parallel Support欄位值為Yes But Not Enable,表示雖然當前DDL操作支援使用並行DDL功能進行加速,但是由於叢集並未開啟並行DDL功能,因此,此DDL操作未實際使用並行DDL功能進行加速。同時,在Suggest Info欄位中,也給出了建議開啟並行DDL的提示。
開啟並行DDL功能,對添加二級索引操作進行EXPLAIN:
將當前並行DDL的並行度設定為2:
MySQL [test]> SET innodb_polar_parallel_ddl_threads = 2 ; Query OK, 0 rows affected (0.00 sec)對添加二級索引操作進行EXPLAIN:
EXPLAIN ALTER TABLE t1 ADD index k_a(a);執行結果如下:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: No Parallel Support: Yes Parallel Degree: 2 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: 1. This DDL operation can be accelerated BY increasing the VALUE OF 'innodb_polar_parallel_ddl_threads'. The recommended VALUE IS 8. Statement: explain ALTER TABLE t1 ADD index k_a(a) 1 row in set (0.01 sec)
當開啟並行DDL功能後,再次對添加二級索引操作進行EXPLAIN。此時可以看到 ,Parallel Degree欄位值為2,表示當前DDL操作將使用2個線程執行。同時,由於當前叢集負載較低,因此在Suggest Info欄位中,給出了將並行度提升為8,以獲得更大的加速效果的建議。
潛在的MDL阻塞檢測
DDL在執行期間,如果目標表上存在未提交的事務,此時DDL操作會被阻塞。極端情況下可能會導致串連數堆積,進而導致叢集發生“雪崩”。藉助於EXPLAIN DDL執行結果中的Possible blocked MDLs欄位,可以提前判斷當前DDL操作是否存在潛在的鎖阻塞問題。當存在潛在的鎖衝突時,Possible blocked MDLs欄位會列出未提交事務所在串連的Process ID。您可以使用KILL或KILL QUERY命令手動結束該事務,避免DDL操作被阻塞。
下面展示了一個簡單的樣本:在串連1中,對t1表進行訪問,且未提交當前事務。此時在串連2中對t1表執行EXPLAIN DDL操作。在執行結果中,Possible blocked MDLs 欄位列出了未提交事務所在串連的Process ID,同時在Suggest Info中也給出了相應的提示資訊。
Connection 1:
對t1表進行訪問,且未提交當前事務:
MySQL [test]> begin; Query OK, 0 rows affected (0.00 sec) MySQL [test]> select * from t1; Empty set (0.00 sec)Connection 2:
對t1表執行EXPLAIN DDL操作:
EXPLAIN ALTER TABLE t1 engine= innodb; *************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: Yes Parallel Support: Yes But Not Enable Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: 18 Error Msg: Suggest Info: 1. This DDL operation may be blocked BY the threads listed under 'Possible blocked MDLs'. 2. This DDL operation could use Parallel DDL TO speed up. Statement: EXPLAIN ALTER TABLE t1 engine= innodb