使用pt-osc工具避免DDL引起的主从延迟
直接使用ALERT
语句修改表结构时,如果表特别大,那么执行时间将很久,并且会引发主从延迟,根据经验,大概每GB导致100秒延迟。
为了避免该问题,尝试使用pt-online-schema-change
工具,该工具支持检测所有从库的延迟,如果达到指定的延迟时间则暂停数据复制进行等待。使用该工具还有一个优势,即其修改表结构时不会阻塞该表的写操作。
据说还有文艺青年用该工具来消除某些表主从数据不一致问题。
该工具常用参数实例如下:
$ pt-online-schema-change -u root --ask-pass -h 172.16.x.x D=database,t=table --alter "CHANGE test test varchar(32) NOT NULL DEFAULT '' AFTER id, ADD COLUMN name VARCHAR(16) NOT NULL DEFAULT '' AFTER test" --chunk-size=100k --chunk-time=5 --max-lag=100s --check-interval=1m --nodrop-old-table --print --dry-run
- 参数具体值需要根据具体信息进行调整,首先执行上述语句确定修改语句没有硬伤,之后将
--dry-run
替换成--execute
进行实际执行。 - 由于使用了
--nodrop-old-table
,原始表会保留,确认语句成功后手工删除原始表。 - 如果某列指定为
NOT NULL
,那么一定需要默认值,这个问题dry-run
的时候不会报错,但实际执行就失败了。 - 这种方法比直接修改表结构慢一点,每GB数据大约2.5分钟。
- 由于执行时间很长,为了防止网络中断引发风险,建议通过
nohup
或者screen
执行。