MySQL在线修改表结构
在线修改表结构
- 在业务系统运行的过程中随意删改字段,会造成重大事故。
- 常规的做法是业务停机,维护表结构
- 但是不影响正常业务的表结构是允许在线修改的。
ALTER TABLE 修改表结构的弊病
- 由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作
- 如果修改表结构失败,必须还原表结构,所以耗时更长
- 大数据表记录多,修改表结构锁表时间很久
使用Percona-Toolkit工具
这个工具是一个mysql免费维护工具包。
Percona程序实现不锁表并且正常修改数据表结构的原理,类似写时复制。
比如说要想修改订单表的结构,这个工具会先拷贝订单表的结构,创建一个新的数据表。然后在这个新的数据表里边做结构上的修改,在这之后Percona程序会在原来的订单表上创建触发器,只要原来的数据表有数据添加,修改和删除就会同步到新的订单表。那么Percona程序还会把原来订单表里边的数据拷贝到新的订单表里边。等到数据都同步过来之后,而且原订单表也没有数据写入的时候,Percona程序就会删除原来的订单表。然后把这个新的订单表的名字改回成原来的程序,这就完成了在线修改表结构的任务。
pt-online-schema-change 命令使用
Percona-Toolkit工具安装
-
安装第三方依赖包
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
-
安装Percona-Toolkit
# 下载percona-toolkit-3.0.13-1.el7.x86_64.rpm 和 percona-toolkit-debuginfo-3.0.13-1.el7.x86_64.rpm 安装包 #进入到Percona-Tookit离线文件所在的目录 rpm -ivh *.rpm
-
Percona使用的是旧的连接方式,使用mysql8这需要执行以下sql
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.88.164 --port=3306 --user=root --password=123456 --alter "MODIFY name VARCHAR(20) NOT NULL COMMENT '收货人'" D=neti,t=t_customer_address --print --execute