全部產品
Search
文件中心

PolarDB:搶佔式DDL

更新時間:Aug 29, 2024

PolarDB MySQL版新增搶佔式DDL(Preemptive DDL)功能。Preemptive DDL解決了在執行DDL的過程中,由於唯讀節點的表上存在大查詢和長事務而導致的DDL執行失敗的問題。

問題現象

PolarDB MySQL版資料庫中執行DDL操作時提示擷取不到MDL鎖,報錯資訊如下:

ERROR HY000: Fail to get MDL on replica during DDL synchronize
ERROR HY000: Fail to get table lock on replica; you can 'set polar_support_mdl_sync_preemption = ON' and try restarting transaction

前提條件

PolarDB MySQL版叢集版本需為:

  • 5.6版本且修訂版本為5.6.1.0.43及以上。

  • 5.7版本且修訂版本為5.7.1.0.34及以上。

  • 8.0.1版本且修訂版本為8.0.1.1.39及以上。

  • 8.0.2版本且修訂版本為8.0.2.2.14及以上。

如何查看叢集版本,請參見查詢版本號碼

使用限制

目前僅唯讀節點支援搶佔式DDL功能,讀寫節點暫不支援。

注意事項

  • 開啟搶佔式DDL功能可能會導致唯讀節點上訪問當前表的串連中斷或者當前表上未執行完的SQL復原,請您謹慎操作。

  • loose_replica_lock_wait_timeout參數的值 >(loose_polar_mdl_sync_preempt_after_wait_second參數的值+5)時,搶佔式DDL功能才生效。

  • MySQL 8.0.1MySQL 8.0.2,rename路徑下此功能不生效,推薦使用alter table rename語句代替。

背景資訊

PolarDB MySQL版採用共用儲存的架構,使用者在執行DDL操作時,首先會在讀寫節點上擷取MDL-X鎖,然後再通知唯讀節點擷取MDL-X鎖。若此時唯讀節點的表上存在訪問表的事務,MDL鎖同步線程便會被阻塞。如果在逾時時間內,唯讀節點始終無法獲得MDL-X鎖,用戶端則會返回錯誤ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize。對於含有多個唯讀節點的PolarDB MySQL版叢集,經常會出現MDL鎖同步失敗導致DDL執行失敗的問題,為此新增搶佔式DDL功能。

使用方法

您可以先通過loose_polar_support_mdl_sync_preemption參數開啟搶佔式DDL功能,並通過loose_polar_mdl_sync_preempt_after_wait_second參數設定搶佔過程中等待逾時的時間。具體操作請參見設定叢集參數和節點參數。參數說明如下:

參數

層級

說明

loose_polar_support_mdl_sync_preemption

Session

搶佔式DDL功能開關。取值範圍如下:

  • ON:開啟搶佔式DDL功能。

  • OFF(預設):關閉搶佔式DDL功能。

loose_polar_mdl_sync_preempt_after_wait_second

Global

設定同步MDL鎖阻塞時,等待逾時的時間。到達此時間還未成功同步MDL鎖,則開始搶佔線程。

取值範圍:1~31536000。單位為秒。預設值為10。

使用樣本

關閉搶佔式DDL功能

  1. 首先在唯讀節點上查詢test.t1

    mysql> use test;
    Database changed
    #大查詢,執行100s
    mysql> select sleep(100) from t1;
  2. 然後在讀寫節點上進行加列操作。

    mysql > alter table t1 add column c int;
    ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize

    通過上述樣本,可以看出在關閉搶佔式DDL功能的情況下,由於唯讀節點上存在長事務,同步MDL鎖失敗,讀寫節點上的DDL操作被阻塞,從而導致執行DDL操作失敗。

    image..png

開啟搶佔式DDL功能

  1. 首先在唯讀節點上查詢test.t1

    mysql> use test;
    Database changed
    #大查詢,執行100s
    mysql> select sleep(100) from t1;
  2. 然後在讀寫節點上進行加列操作。

    mysql> alter table t1 add column c int;
    Query OK, 0 rows affected (11.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    通過上述樣本,可以看出在開啟搶佔式DDL功能的情況下,由於唯讀節點上存在長事務,同步MDL鎖被阻塞。等待一段時間後,開始搶佔線程,DDL操作成功。

    image..png

聯絡我們

若您對DDL操作有任何疑問,請聯絡我們