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.1和MySQL 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功能開關。取值范圍如下:
|
loose_polar_mdl_sync_preempt_after_wait_second | Global | 設置同步MDL鎖阻塞時,等待超時的時間。到達此時間還未成功同步MDL鎖,則開始搶占線程。 取值范圍:1~31536000。單位為秒。默認值為10。 |
使用示例
關閉搶占式DDL功能
首先在只讀節點上查詢
test.t1
。mysql> use test; Database changed #大查詢,執行100s mysql> select sleep(100) from t1;
然后在讀寫節點上進行加列操作。
mysql > alter table t1 add column c int; ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize
通過上述示例,可以看出在關閉搶占式DDL功能的情況下,由于只讀節點上存在長事務,同步MDL鎖失敗,讀寫節點上的DDL操作被阻塞,從而導致執行DDL操作失敗。
開啟搶占式DDL功能
首先在只讀節點上查詢
test.t1
。mysql> use test; Database changed #大查詢,執行100s mysql> select sleep(100) from t1;
然后在讀寫節點上進行加列操作。
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操作成功。
聯系我們
若您對DDL操作有任何疑問,可通過釘釘搜索群號入群咨詢。您可以直接@群內專家,并附上您要咨詢的問題;同時群內也有PolarDB MySQL版小助手24*7小時在線回答您的問題。釘釘群號:15375044501。