在线修改表结构必须慎重
-
在业务系统 运行 过程中随意删改字段,会 造成重大事故。
-
常规的做法是:业务停机,再 维护表结构
比如:12306 凌晨 0 点到早上 7 点是停机维护 -
如果是不影响正常业务的表结构是允许在线修改的。
比如:int 类型不够用了,要缓存 bigint、有唯一性约束,要去掉。这不会影响线上的正在执行的数据
alter table 修改表结构的弊端
- 表级锁
修改表结构会锁表,因此在修改表结构时,影响表的写入操作;
数据越多,锁表时间越长。 - 修改失败,还原表结构,耗时长
如果修改表结果失败,必须还原表结构,所以耗时更长;
比如:添加一个唯一性约束,结果发现很多数据有控制,无法添加进来了,这个时候就只能还原表结构 - 大数据表记录多,修改表结构锁表时间很久
使用 PerconaTookit 工具
由于 alter table 线上修改表结构有诸多弊端,但是 PerconaTookit 提供了一个开源的线上修改表结构的工具。
其中一个名为 pt-online-schema-change 的工具可以完成在线修改表结构。
在线修改表结构的原理
pt-online-schema-change 是如何做到不锁表修改表结构的?
我要修改 order 表的结构, pt-online-schema-change 会这样做:
1.复制一份 order 表结构
2.在这个新表的修改表结构
3.同步执行数据拷贝
修改完成之后,会在原来表上增加触发器,新的操作数据增删改查都会同步到新的表中,
同时会把原来表的数据拷贝到新表中。
当数据拷贝完之后,且原表没有新的数据写入时,把原表删除,把新表名称修改为原表名称
安装 PerconaTookit 依赖包
安装第三方依赖包
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
安装 PerconaTookit 工具
rpm -ivh percona-toolkit-3.0.13-1.el7.x86_64.rpm
rpm -ivh percona-toolkit-debuginfo-3.0.13-1.el7.x86_64.rpm
pt-online-schema-change 用法
pt-online-schema-change OPTIONS DSN
实践
在执行前还需要修改下密码认证方式,因为该工具不支持 MySQL8 新的默认认证方式,将认证方式改成低版本的方式
alter user 'root'@'%' identified by 'password' password expire never;
alter user 'root'@'%' identified with mysql_native_password by '123456';
把客户收货地址表中的 name 字段改成 varchar(20)
pt-online-schema-change --host=192.168.121.142 --port=3306 --user=root --password=123456 --alter "modify name varchar(20) not null comment '收货人'" D=neti,t=t_customer_address --print --execute