ITPub博客

首页 > 数据库 > MySQL > 阿里云数据管理DMS的无锁变更功能主要原理和适用场景介绍

阿里云数据管理DMS的无锁变更功能主要原理和适用场景介绍

MySQL 作者:chenfeng 时间:2021-12-21 10:27:39 0 删除 编辑

阿里云数据管理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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
交流MySQL,PolarDB/PolarDB-X,PostgreSQL,MongoDB和Redis技术。

注册时间:2015-12-07

  • 博文量
    784
  • 访问量
    2689162