玖叶教程网

前端编程开发入门

使用pt-osc Mysql大表在线添加字段

背景

最近遇到一个加字段的需求,阿里云的RDS支持在线加字段,查看了该表的count数,此表快7000万行了,这加字段得持续到啥时候啊[捂脸]

有一个思路是,新建一个空表,然后把字段加好,再把旧表的数据导入到新表里,然后再对比下数据增量,再修改下表名。思路是好的,操作起来比较麻烦,那么有没有对应的DBA工具来达到同样的目的呢?使用pt-online-schema-change.

pt-online-schema-change是percona公司开发的一个工具,在percona-toolkit包里面可以找到这个功能,它可以在线修改表结构,特别那种大表的修改效率很高。

原理

  • 首先它会新建一张一模一样的表,表名一般是_new后缀
  • 然后在这个新表执行更改字段操作
  • 然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
  • 最后将原表的数据拷贝到新表中,然后替换掉原表

我们看到pt-osc的原理和我们修改大表的思路一致,并且这么多的步骤只要一个命令行就可以操作。

安装pt-osc

以centos平台为例

1.先安装依赖

yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL

2.安装percona-toolkit

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum update percona-release
yum install percona-toolkit

percona-toolkit包含了pt-online-schema-change

实操

阿里云RDS需要指定参数 --no-version-check

pt-online-schema-change --no-version-check \
    --execute \
    --alter "ADD COLUMN step_num int(0)" \
    h=rm-******.mysql.rds.aliyuncs.com,P=3306,u=dev,p=******,D=ilisten,t=x,A=utf8mb4
  • h=xxx.mysql.rds.aliyuncs.com:RDS实例地址。
  • P=3306:RDS实例端口。
  • u=dev:RDS实例用户。
  • p=xxx:RDS实例用户密码。
  • D=ilisten:RDS实例数据库。
  • t=x:RDS实例表名称。
  • A=utf8mb4: 指定编码。
  • execute:执行
  • alter:执行添加字段,修改字段,添加索引等操作

注意点

我实际运行的时候添加了下面两个参数--channel 和 --no-check-replication-filters

--channel=db_dbsync 使用复制通道连接到服务器时使用的通道名称。假设您有两个 master,master_a 在端口 12345,master_b 在端口 1236 和一个 slave 使用通道 chan_master_a 和 chan_master_b 连接到两个 master。如果你想运行 pt-table-sync 来同步 slave 与 master_a,pt-table-sync 将无法确定什么是正确的 master,因为 SHOW SLAVE STATUS 将返回 2 行。在这种情况下,您可以使用 –channel=chan_master_a 指定要在 SHOW SLAVE STATUS 命令中使用的频道名称。

--no-check-replication-filters 存在过滤情况,处理的时候忽略过滤

生产环境建议业务低峰期执行,7千万行大约执行了不到两个小时完成,相对原生在线添加字段还是很快的。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言