
# pt-osc工具连接RDS for MySQL主备实例卡住
#### 场景描述
使用pt-osc工具（pt-online-schema-change）进行online DDL操作时，会遇到连接本地单机实例执行命令成功，但连接云上RDS for MySQL主备实例会卡住的情况，如下图所示，没有输出：
![](https://support.huaweicloud.com/trouble-rds-mysql/zh-cn_image_0000002247222421.png "点击放大")
#### 原因分析
pt-osc的工作原理：
1. 创建一个与原表结构相同的空表，表名是 _new 后缀。
2. 修改[1]创建的空表的表结构。
3. 在原表上加三个触发器：delete/update/insert，用于复制数据过程中，将原表中要执行的语句在新表中执行。
4. 将原表数据以数据块（chunk）的形式复制到新表。
5. **rename** 原表为旧表，并把新表**rename**为原表名，然后删除旧表。
6. 删除触发器。
因为涉及大量数据复制，对于有备库的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官方文档](https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html)。
本案例场景中：
- pt-osc工具连接云上RDS for MySQL主备实例卡住，是因为存在主从复制时延导致工具停止复制数据。配置项"--recursion-method=none"表示忽略主从延迟，添加该配置项可以解决问题。
- 忽略主从延迟，会导致复制数据比较快，当需要尽可能的对服务产生小的影响，可以设置"--max-load"配置项。
 
#### 解决方案
pt-osc工具加上"--recursion-method=none"配置项，忽略复制时延，即可解决问题。
pt-osc常见命令参考：
- 增加字段
  ```
  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官方文档](https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html)。
