文章摘要

文章介绍了在MySQL中修改线上大表结构的方法和注意事项。首先,文章分析了直接修改大表结构可能带来的性能问题和风险。接着,提出了几种优化方案,如使用pt-online-schema-change工具、分批次修改数据、创建新表并迁移数据等。文章详细解释了每种方法的操作步骤和适用场景,帮助读者在不影响线上业务的情况下安全高效地修改大表结构。

场景

在线数据库的维护中,总会涉及到研发修改表结构的情况,修改一些小表影响很小,而修改大表时,往往影响业务的正常运转,如表数据量超过500W,1000W,甚至过亿时

影响:

  • 在线修改大表的表结构执行时间往往不可预估,一般时间较长
  • 由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作
  • 如果长时间的修改表结构,中途修改失败,由于修改表结构是一个事务,因此失败后会还原表结构,在这个过程中表都是锁着不可写入
  • 修改大表结构容易导致数据库CPU、IO等性能消耗,使MySQL服务器性能降低
  • 在线修改大表结构容易导致主从延时,从而影响业务读取

工具说明

pt-online-schema-change

Github 开源地址:

https://github.com/percona/percona-toolkit/blob/3.x/bin/pt-online-schema-change

pt-online-schema-change是percona公司开发的一个开源数据库工具,在percona-toolkit包里面可以找到这个功能,它可以在不锁表的情况下,在线修改表结构

原理:

  • 首先它会新建一张一模一样的表,表名一般是_new后缀
  • 然后在这个新表执行更改字段操作
  • 然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
  • 最后将原表的数据拷贝到新表中,然后替换掉原表

好处:

  • 降低主从延时的风险
  • 可以限速、限资源,避免操作时MySQL负载过高

建议:

  • 在业务低峰期做,将影响降到最低

安装

安装 Percona Toolkit

Mac下使用 homebrew安装

brew install percona-toolkit
pt-online-schema-change --version # 可以看到版本输出说明安装成功

CentOS 下安装

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm # 添加Percona仓库 
sudo yum install percona-toolkit # 安装Percona Toolkit

使用Percona官方二进制包安装

  1. 下载Percona Toolkit:访问 Percona Toolkit下载页面 并下载适用于你系统的二进制包。
  2. 解压下载的包tar -xzf percona-toolkit-*.tar.gz
  3. 进入解压后的目录cd percona-toolkit-*
  4. 安装Percona Toolkitsudo ./install

使用

1.参数
./bin/pt-online-schema-change –help 可以查看参数的使用,我们只是要修改个表结构,只需要知道几个简单的参数就可以了–user= 连接mysql的用户名 –password= 连接mysql的密码 –host= 连接mysql的地址 P=3306 连接mysql的端口号 D= 连接mysql的库名 t= 连接mysql的表名 –alter 修改表结构的语句 –execute 执行修改表结构 –charset=utf8 使用utf8编码,避免中文乱码 –no-version-check 不检查版本,在阿里云服务器中一般加入此参数,否则会报错

2.为避免每次都要输入一堆参数,写个脚本复用一下,pt.sh#!/bin/bash table=$1 alter_conment=$2 cnn_host=’127.0.0.1′ cnn_user=’user’ cnn_pwd=’password’ cnn_db=’database_name’ echo “$table” echo “$alter_conment” /root/percona-toolkit-2.2.19/bin/pt-online-schema-change –charset=utf8 –no-version-check –user=${cnn_user} –password=${cnn_pwd} –host=${cnn_host} P=3306,D=${cnn_db},t=$table –alter “${alter_conment}” –execute

3.添加表字段
如添加表字段SQL语句为:
ALTER TABLE tb_test ADD COLUMN column1 tinyint(4) DEFAULT NULL;
那么使用pt-online-schema-change则可以这样写
sh pt.sh tb_test “ADD COLUMN column1 tinyint(4) DEFAULT NULL”

4.修改表字段
SQL语句:
ALTER TABLE tb_test MODIFY COLUMN num int(11) unsigned NOT NULL DEFAULT ‘0’;

pt-online-schema-change工具:
sh pt.sh tb_test “MODIFY COLUMN num int(11) unsigned NOT NULL DEFAULT ‘0’”

5.修改表字段名
SQL语句:
ALTER TABLE tb_test CHANGE COLUMN age adress varchar(30);

pt-online-schema-change工具:
sh pt.sh tb_test “CHANGE COLUMN age address varchar(30)”

6.添加索引
SQL语句:
ALTER TABLE tb_test ADD INDEX idx_address(address);
pt-online-schema-change工具:
sh pt.sh tb_test “ADD INDEX idx_address(address)”

注意事项

  • pt-online-schema-change工具还有很多其他的参数,可以有很多限制,比如限制CPU、线程数量、从库状态等等
  • 一定要在业务低峰期做,这样才能确保万无一失
  • 备份数据:在执行任何表结构变更之前,确保你已经备份了数据。
  • 测试环境:在生产环境中执行变更之前,建议先在测试环境中进行测试。
  • 权限:确保你有足够的权限来执行表结构变更。

官方文档:

https://docs.percona.com/percona-toolkit/pt-online-schema-change.html