pt-online-schema-change 记录

2017-12-20  本文已影响177人  richard520

最近有程序需要对表添加列 自己手动在客户端添加 由于数据表过大无法完成 程序在不知道这个的危险情况下这样操作很可怕,知道后建议程序对大表的ddl操作都有我这边完成。使用pt-osc来修改 这个工具的原理是:新建一张修改后的表将旧表的数据拷贝到新表 也会创建触发器来完成拷贝过程中数据的写入保证数据的一致性,修改的表最好有主键或者唯一索引 在数据的拷贝过程中 它是分段拷贝,可根据主键和唯一索引,数据一致后删除旧表。这样的操作我一般是在业务低谷执行,在对一张2000w数据表的修改中用时2.5个小时。在操作过程中遇到的2个小问题。
1.在添加有中文备注的列时没有使用 --charset=utf8 参数导致表所有的表结构注释乱码 在改完变后查看,表结构注释乱码,这个可直接使用客户端软件修改回去,修改注释不影响什么。
2.一次意外的操作终止,--critical-load 这个由于超过了Threads_running的设置 默认是50 这个SHOW GLOBAL STATUS如果超过这个这50 则终止执行,这个当时是因为一个程序的小伙伴在跑数据 叫他停止之后我在执行 执行完成 表正常。

使用的加列语句
pt-online-schema-change --user=root --password=xxxxxxxx --socket=/data1/mysql/33777/mysql.sock --alter "ADD COLUMN contacts_total mediumint(5) UNSIGNED NULL DEFAULT 0 COMMENT '联系人总数' AFTER lat" D=dbxxx_com,t=customer --charset=utf8 --print --execute

pt-osc的缺点:
1、更容易导致主从数据延迟
2、如果运行过程中报错了,无法从上一个位置继续进行,需要从头开始
3、pt 创建trigger 或者删除trigger 的时候 有坑
4、不支持5.7的虚拟列功能
两个列,值相同,但分别为int、char 类型,且无索引,效率对比

参考文档
http://www.ttlsa.com/mysql/pt-online-schema-change-mysql-structure/
https://www.percona.com/doc/percona-toolkit/2.0/pt-online-schema-change.html

上一篇下一篇

猜你喜欢

热点阅读