在运维线上 MySQL 数据库时,咱们总会对数据表进行 DDL 变更,批改增加字段或者索引。在对表进行 DDL 时,会锁表,当表比拟小比方小于 1w 上时,对前端影响较小,过后遇到千万级别的表就会影响前端利用对表的写操作。
pt-online-schema-change 是 percona 公司开发的一个工具,在 percona-toolkit 包外面能够找到这个性能,它是一个在线 DDL 工具,能够实现在线数据表 DDL 操作。
应用办法
比方须要运行 SQL 的 DDL 语句
ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status
能够通过如下命令进行
nohup pt-online-schema-change \
--charset=utf8 \
--no-version-check \
--user="数据库用户" \
--password="数据库明码" \
--host="数据库地址" \
P=3306,D="数据库",t="数据表" \
--alter "ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status" \
--execute &
参数阐明
--user= 连贯 mysql 的用户名
--password= 连贯 mysql 的明码
--host= 连贯 mysql 的地址
P=3306 连贯 mysql 的端口号
D= 连贯 mysql 的库名
t= 连贯 mysql 的表名
--alter 批改表构造的语句
--execute 执行批改表构造
--charset=utf8 应用 utf8 编码,防止中文乱码
--no-version-check 不查看版本,在阿里云服务器中个别退出此参数,否则会报错
工作过程
1. 创立一个和要执行 alter 操作的表一样的新的空表构造(是 alter 之前的构造)
2. 在新表执行 alter table 语句(速度应该很快)
3. 在原表中创立触发器 3 个触发器别离对应 insert, update, delete 操作
4. 以肯定块大小从原表拷贝数据到长期表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的长期表
5.Rename 原表到 old 表中,在把长期表 Rename 为原表
6. 如果有参考该表的外键,依据 alter-foreign-keys-method 参数的值,检测外键相干的表,做相应设置的解决
7. 默认最初将旧原表删除
装置办法
仅供参考(CentOS 7 验证)
sudo yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey.x86_64
sudo rpm -ivh percona-toolkit-3.1.0-2.el7.x86_64.rpm
参考资料
https://www.percona.com/doc/p…