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功能
開啟搶佔式DDL功能
聯絡我們
若您對DDL操作有任何疑問,請聯絡我們。