Skip to content

首先不影响正常业务的表结构是允许在线修改的,例如主键int不够用了,我们改成bigint。那影响业务的呢?

常见方法:业务停机,维护表结构。例如王者荣耀,每次大更新时都会停止系统。还有12306,每天晚上进行系统维护,直到第二天才可以正常使用。

TIP

我们先来分析一下ALTER TABLE修改表结构的弊病

  1. 由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作
  2. 如果修改表结构失败,必须还原表结构,所以耗时更长,例如不能为空,但是表中有空值,约束加不上去
  3. 大数据表记录多,修改表结构锁表时间很久

既然不能使用ALTER TABLE修改表结构,那我们应该使用什么呢?答:PerconaTookit 工具

我们先来安装依赖环境,注:我的安装环境是centos7

shell
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

点击下载 将压缩包解压,上传里面的两个rpm文件,切换到上传的文件夹下,输入命令 rmp -ivh *.rpm

使用 PerconaTookit

来看一下如何使用,下面是命令和参数

shell
pt-online-schema-change OPTIONS DSN
参数实际含义参数实际含义
--hostIP地址t数据表
--user用户名--alter修改语句
--password密码--execute执行修改
--port端口号--dry-run测试执行
D逻辑库--print打印过程

来看一个具体的例子

shell
pt-online-schema-change --host=192.168.99.202 --port=3306 --user=root --password=root --alter "MODIFY name VARCHAR(20) NOT NULLCOMMENT'收货人'" D=neti, t=t_customer_address --print --execute

TIP

原理:工具包会创建一个新的表来修改表结构,并且在修改的过程中持续写入新的数据,对原来的表不会涉及锁表操作,因此不好影响线上业务,然后将原来的表给删除,新建的表重命名为原来的表名。