阿里雲資料管理DMS的無鎖變更功能主要原理和適用場景介紹

chenfeng發表於2021-12-21

阿里雲資料管理DMS的無鎖變更功能支援DML無鎖變更與DDL無鎖變更。


大表變更

當您進行大表更新時,可能會因單條SQL影響多條行數而出現日誌超過引數閥值而執行失敗,或因SQL不走索引導致鎖表等。

結構變更

在MySQL5.5以及之前的版本中,MySQL的DDL僅提供Table-Copy和In-Place(MySQL5.5開始提供)兩種執行演算法。

MySQL5.6及後續版本提供了Innodb-OnlineDDL能力

覆蓋了大範圍的DDL型別(新增列、刪除列、列名修改、新增索引、修改索引等),但仍然有些常見的DDL型別無法

覆蓋(修改列的型別、修改列的長度、修改字符集等)。

為解決上述問題,DMS提供無鎖變更功能,支援DML無鎖變更與DDL無鎖變更,您可以透過該功能執行變更

操作,規避大量風險。

當業務累積了大量資料時,需要對線上資料與歷史資料進行分隔管理,或定期清除表中資料。常見的現象有:

單條SQL影響行數非常多(會出現日誌超過引數閥值而執行失敗)

SQL不使用索引(會導致鎖表,增加資料庫負載甚至導致業務故障)

此類問題通常可透過分批執行的方法解決,但是仍存在風險,例如:

研發寫程式分批處理,如果分批的方式不當,例如直接用 LIMIT 進行分批,可能仍會鎖表;若分批執

行的頻率沒有很好控制,會造成主備延遲過大。這些都會對資料庫造成影響,進而影響業務。

DBA提取目標資料手動拆分:人工拆分非常繁瑣,工作量大,且易出錯,並且很難進行動態調整。


主要原理

1. 建立臨時表:CREATE TABLE tmp_table_table LIKE table_name

2. 變更臨時表結構: ALTER TABLE tmp_table_table XXXX

3. 全量複製資料:INSERT IGNORE INTO tmp_table_table (SELECT %s FROM table_name FORCE INDEX

(%s) WHERE xxx

4. 增量資料Binlog同步: UPDATE/INSERT/DELETE tmp_table_name

5. 切換新舊錶: RENAME TABLE table_name to old_tmp_table_table, tmp_table_name to

table_name

適用場景

變更資料庫表結構。

變更表的字符集、校驗集,調整時區等。

規避Optimize Table操作回收表空間、降低碎片率時引起的鎖表


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2848605/,如需轉載,請註明出處,否則將追究法律責任。

相關文章