背景
记得之前有个前同事在前同事群里突然发来一个消息,求教如何给大表增加字段。她们当时试图给一个线上大表直接通过Alter Table的方式增加字段。但是,由于数据量过大,怎么也升级不成功,情急之下发消息出来求教。
确实,企业级应用中的数据库库表的数据量往往都比较大,针对这些大表的表结构升级(DDL)会对线上系统造成较大的影响。比如,给一张百万级别数据量的表增加一个字段,在没有任何工具辅助的情况下,往往会锁表几分钟到几十分钟不等,导致长时间的业务功能不可用。
当时,有人给前同事出招,提出拷贝出来一张新表,在新表上增加字段,完成后再覆盖老表(通过该表名的方式)。这种方案能解决升级的时候不影响线上使用,但是它存在升级过程中如果有新数据进来的时候这部门新数据会丢失的问题。
那有没有更好的解决方案呢?答案是有的。针对大表的DDL操作,可以借助Percona Toolkit实现,具体方式如下。
方案
CentOS安装Percona Toolkit
检查安装所需的依赖包是否已安装,如果未安装或安装的不全,则执行第二步中的yum install命令进行安装
rpm -qa perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
安装依赖(缺失的情况下才执行安装)
yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL
安装Percona Release
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
安装Percona Yum仓库,这里安装MySQL5.6对应的仓库
sudo percona-release enable ps-56 release
更多仓库与具体数据库版本对应关系
Repository | Product Packages |
---|---|
ps-56 | Percona Server for MySQL 5.6 |
ps-57 | Percona Server for MySQL 5.7 |
ps-80 | Percona Server for MySQL 8.0 |
安装Percona Toolkit
sudo yum install percona-toolkit
安装成功后,就可以使用Percona Toolkit来执行在线扩展数据库
实践
- 在线添加索引
pt-online-schema-change -uroot -h192.168.10.8 -p'your password' -S /tmp/mysql.sock --alter='add fulltext index `full_sys_shop_goods_product_name`(`product_name`)' --execute D=test,t=sys_shop_goods
Percona 执行过程中的一些现象,拷贝出来了一张表
在老表上添加了三个触发器
- 在线添加字段
pt-online-schema-change -uroot -h192.168.10.8 -p'your password' -S /tmp/mysql.sock --alter='add column new_field varchar(100) not null default '' comment "xxxxxxxx"' --execute D=test,t=sys_shop_goods