全部產品
Search
文件中心

PolarDB:EXPLAIN DDL

更新時間:Jan 06, 2026

在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功能開關。取值範圍如下:

  • ON(預設):開啟EXPLAIN DDL功能。

  • OFF:關閉EXPLAIN DDL功能。

loose_polar_max_collect_thd_num_in_explain_ddl

Global

控制收集的潛在MDL阻塞線程的數目。

取值範圍:[1-512],預設值為16。

文法說明

{ EXPLAIN | DESCRIBE | DESC } 	ALTER TABLE ...

輸出結果中,各個欄位的含義如下:

欄位

含義

取值範圍

Error No

錯誤碼。

  • 0:執行成功。

  • other:對應錯誤的錯誤碼。

Algorithm

DDL操作將使用的執行演算法。

  • Unknown:未知。

  • INSTANT:使用INSTANT演算法。

  • INPLACE:使用INPLACE演算法。

  • COPY:使用COPY演算法。

Metadata Only

DDL操作是否僅需修改元資訊,無需修改表中資料。

  • Unknown:未知。

  • Yes:僅修改中繼資料。

  • No:需要修改表中資料。

Rebuilt table

DDL操作是否需要表重建。

  • Unknown:未知。

  • Yes:需要重建表。

  • No:不需要重建表。

Parallel Support

DDL操作是否支援使用並行DDL進行加速。

  • Unknown:未知。

  • No:不支援。

  • Not Need:無需修改資料,無需使用並行DDL加速。

  • Yes:已啟用並行DDL對當前DDL進行加速。

  • Yes But Not Enable:DDL操作支援使用並行DDL功能進行加速,但是並未開啟並行DDL功能。

Parallel Degree

DDL操作將使用的線程數。

  • -1:未知。

  • [1-128]:DDL並行線程數。

Concurrent DML

在DDL操作期間是否支援並發讀寫。

  • Unknown:未知。

  • Yes:支援並發讀寫。

  • No:不支援並發讀寫。

Possible blocked MDLs

可能阻塞DDL操作的其他事務。此處記錄事務所在串連的Process ID

由Process ID拼接的字串。各個ID之間以逗號(,)分隔。

Error Msg

Error No對應,表示當前DDL操作的錯誤資訊。

字串。

Suggest Info

當前DDL操作的建議資訊。

字串。

說明

包括但不限於如下內容:

  • 當Possible blocked MDLs欄位不為空白時,提示解決潛在的鎖衝突。

  • 支援並行DDL時,給出相關調優參數,以進一步加速。

Statement

當前語句。

DDL語句。

樣本

查詢DDL操作的執行特徵

通過分析EXPLAIN DDL返回結果中的AlgorithmMetadata OnlyRebuilt TableConcurrent 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