Appearance
首先不影响正常业务的表结构是允许在线修改的,例如主键int
不够用了,我们改成bigint
。那影响业务的呢?
常见方法:业务停机,维护表结构。例如王者荣耀,每次大更新时都会停止系统。还有12306,每天晚上进行系统维护,直到第二天才可以正常使用。
TIP
我们先来分析一下ALTER TABLE修改表结构的弊病
- 由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作
- 如果修改表结构失败,必须还原表结构,所以耗时更长,例如不能为空,但是表中有空值,约束加不上去
- 大数据表记录多,修改表结构锁表时间很久
既然不能使用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
参数 | 实际含义 | 参数 | 实际含义 |
---|---|---|---|
--host | IP地址 | t | 数据表 |
--user | 用户名 | --alter | 修改语句 |
--password | 密码 | --execute | 执行修改 |
--port | 端口号 | --dry-run | 测试执行 |
D | 逻辑库 | 打印过程 |
来看一个具体的例子
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
原理:工具包会创建一个新的表来修改表结构,并且在修改的过程中持续写入新的数据,对原来的表不会涉及锁表操作,因此不好影响线上业务,然后将原来的表给删除,新建的表重命名为原来的表名。