使用 pt-online-schema-change 在线修改表结构

一、安装percona-toolkit

pt-online-schema-change 是percona-toolkit 工具组件中的一个,因此要使用pt-online-schema-change,就要安装percona-toolkit。

percona-toolkit 的安装详见:https://www.haveyb.com/article/1545

 

二、使用 pt-online-schema-change 在线修改表结构

安装好percona-toolkit后,就可以直接使用pt-online-schema-change了。

使用实例:
# 原表结构
CREATE TABLE `inventory` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int unsigned DEFAULT NULL COMMENT '商品ID',
  `warehouse_id` int unsigned DEFAULT NULL COMMENT '仓库ID',
  `num` int unsigned DEFAULT NULL COMMENT '库存数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

1、当前需求:

在原库存表上添加一个 is_deleted字段

2、正常操作语句是:
ALTER TABLE inventory ADD COLUMN is_deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '该条记录是否已经被逻辑删除';

但是由于是在线上,如果直接修改表结构可能造成大面积的锁表,进而造成大量的事务锁、主从延迟等情况,因此这里需要采用 pt-online-schema-change 来在线修改表结构。

3、为什么使用pt-online-schema-change修改表结构,而不直接在线操作修改表结构SQL语句说明:

使用 pt-online-schema-change 的优点是,它不会直接操作原表,而是根据原表和我们的SQL语句新建一张新表,并将原表数据分批复制进来,然后再将新创建的数据表重命名为原表。这样操作,只有在重命名数据表的时候会造成一会的锁表。

4、使用pt-online-schema-change 在线修改表结构

可以通过命令 pt-online-schema-change --help 来查看所有支持的命令和功能。

(1)如果直接在MySQL客户端执行
ALTER TABLE inventory ADD COLUMN is_deleted TINYINT UNSIGNED NOT NULL DEFAULT 0;
(2)如果在pt-online-schema-change上执行则变为:
pt-online-schema-change \
--alter="ADD COLUMN is_deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '该条记录是否已经被逻辑删除'" \
--charset=utf8mb4 \
D=test_57,t=inventory,u=root,p=123456,h=192.168.78.102,P=3306 \
--execute
参数解释:
--alter 后面跟执行的SQL语句
--charset=utf8mb4  指定字符集,否则会出现执行后表中的字段注释乱码的情况
D 后面跟数据库名称
t 后面跟数据表名称
u 后面跟用户名
p 后面跟用户密码(小写p)
h 后面跟MySQL所在ip
P 后面跟MySQL端口号(大写P)
--execute 执行命令

注意:

当前pt-online-schema-change还没有适配MySQL8.0,因此只能在MySQL5.6、5.7版本中直接使用。

但如果想在MySQL8.0中使用也不是没有办法,只要把执行命令的用户的认证插件从MySQL8.0默认的caching_sha2_password 改为 mysql_native_password 即可。