在线修改表结构必须慎重 ,在业务系统运行的过程中随意修改、删改字段,会造成重大事故,而且在修改之前,必须对表做备份。
常规的做法是业务停机,维护表结构。(比如半夜做系统维护更新,12306、淘宝等…)
但是不影响正常业务的表结构是运行在线修改的。(比如INT不够用换成BIGINT,或者某个字段有唯一性约束,现在去掉唯一性约束,但是也多多少少也会影响性能 )
这些修改表是属于DDL语句
Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性、检查重复索引、定位IO占用高的表文件、在线DDL等。
今天我们就用 pt-online-schema-change 进行在线修改表结构。
安装第三方依赖包
yum install -y perl-DBI
yum install -y perl-DBD-mysql
yum install -y perl-IO-Socket-SSL
yum install -y perl-Digest-MD5
yum install -y perl-TermReadKey
在线下载地址: https://www.percona.com/downloads/percona-toolkit/LATEST/
wget https://downloads.percona.com/downloads/percona-toolkit/3.3.1/binary/redhat/7/x86_64/percona-toolkit-3.3.1-1.el7.x86_64.rpm
rpm -ivh *.rpm
pt-online-schema-change OPTIONS DSN
| 参数 | 实际含义 |
|---|---|
| –host | IP地址 |
| –user | 用户名 |
| –password | 密码 |
| –port | 端口号 |
| –alert | 修改语句 |
| –execute | 执行修改 |
| –dry-run | 测试执行 |
| 打印过程 | |
| t | 数据表 |
| D | 逻辑库 |
sql举例1: my_shop库中的品牌表custom_address中的name字段varchar(200)改成varchar(20)
pt-online-schema-change --host=192.168.10.101 --port=3306 --user=root --password=123456 --alter "MODIFY `name` VARCHAR(20) NOT NULL COMMENT '名称'" D=my_shop,t=t_brand --print --execute
最后一个参数execute是真正修改执行,而--dry-run只是模拟执行的意思。
mysql8.0以下无需执行,在执行之前还要执行以下2个sql语句:
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password by '123456'
为什么要执行呢?
因为在pt工具中连接mysql数据库用的是老的连接方式,mysql8.0引入了新的密码认证方式,PT工具是暂时不支持的,所以只能在数据库端做手脚,把数据库密码验证方式改成旧的认证方式。
再执行:
pt-online-schema-change --host=192.168.10.101 --port=3306 --user=root --password=123456 --alter "MODIFY name VARCHAR(20) NOT NULL COMMENT '收货人'" D=my_shop,t=t_customer_address --print --execute

出现Successsfully就代表成功了 。
再看数据库发现修改成功,过程中都没有锁表。
更多PT修改字段操作
#添加字段
--alter "add age varchar(10) NOT NULL DEFAULT '' COMMENT '年龄'"
#修改默认值
-alter status set DEFAULT '0'
#删除列
drop age
反正跟mysql的DDL操作语句一样
怎么在不锁表正常修改表结构的呢?比如我现在想修改订单表的结构。
