pt-osc工具连接RDS for MySQL主备实例卡住
场景描述
使用pt-osc工具(pt-online-schema-change)进行online DDL操作时,会遇到连接本地单机实例执行命令成功,但连接云上RDS for MySQL主备实例会卡住的情况,如下图所示,没有输出:
原因分析
pt-osc的工作原理:
- 创建一个与原表结构相同的空表,表名是 _new 后缀。
- 修改1创建的空表的表结构。
- 在原表上加三个触发器:delete/update/insert,用于复制数据过程中,将原表中要执行的语句在新表中执行。
- 将原表数据以数据块(chunk)的形式复制到新表。
- rename原表为旧表,并把新表rename为原表名,然后删除旧表。
- 删除触发器。
因为涉及大量数据复制,对于有从库的MySQL,必然会带来主备复制延迟,可能影响从库业务。考虑从库延迟情况,pt-osc工具提供以下几个控制选项:
- --max-lag
- --check-interval
- --recursion-method
- --check-slave-lag
因此,从库延迟超过max-lag,则停止复制数据,等待check-interval秒后再开始复制数据;check-slave-lag指定slave的机器,只会对比这台slave的延迟情况。recursion-method是主库寻找从库的方法:processlist(默认值,关注从库延迟)、hosts、dsn、none(忽略从库延迟)。更多信息,请参见pt-osc官方文档。
本案例场景中:
- pt-osc工具连接云上RDS for MySQL主备实例卡住,是因为存在主从复制延迟导致工具停止复制数据。配置项“--recursion-method=none”表示忽略主从延迟,添加该配置项可以解决问题。
- 忽略主从延迟,会导致复制数据比较快,当需要尽可能的对服务产生小的影响,可以设置“--max-load”配置项。
解决方案
pt-osc工具加上“--recursion-method=none”配置项,忽略复制延迟,即可解决问题。
- 增加字段
pt-online-schema-change --user=root --password=xxx --host=xxx --alter “ADD COLUMN content text” D=aaa,t=tmp_test --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --print --execute
- 删除字段
pt-online-schema-change --user=root --password=xxx --host=xxx --alter "DROP COLUMN content " D=aaa,t=tmp_test --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --quiet --execute
- 修改字段
pt-online-schema-change --user=root --password=xxx --host=xxx --alter “MODIFY COLUMN age TINYINT NOT NULL DEFAULT 0” D=aaa,t=tmp_test --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --quiet --execute
- 字段改名
pt-online-schema-change --user=root --password=xxx --host=xxx --alter “CHANGE COLUMN age address varchar(30)” D=aaa,t=tmp_test --no-check-alter --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --quiet --execute
- 增加索引
pt-online-schema-change --user=root --password=xxx --host=xxx --alter “ADD INDEX idx_address(address)” D=aaa,t=tmp_test --no-check-alter --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --print --execute
- 删除索引
pt-online-schema-change --user=root --password=xxx --host=xxx --alter “DROP INDEX idx_address” D=aaa,t=tmp_test --no-check-alter --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --print --execute
如果业务需要关注复制延迟,可以根据业务需要调整如下参数:max-lag、check-interval、recursion-method、check-slave-lag。更多信息,请参见pt-osc官方文档。