阿里云数据管理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博客 ” ,链接:https://blog.itpub.net/15498/viewspace-2848605/ ,如需转载,请注明出处,否则将追究法律责任。