龙空技术网

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

运维笔谈 270

前言:

此时姐妹们对“mysql在表中添加字段”大概比较关怀,兄弟们都想要知道一些“mysql在表中添加字段”的相关知识。那么小编也在网络上网罗了一些有关“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-DBIyum install perl-DBD-MySQLyum install perl-Time-HiResyum install perl-IO-Socket-SSL

2.安装percona-toolkit

yum install  update percona-releaseyum 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千万行大约执行了不到两个小时完成,相对原生在线添加字段还是很快的。

标签: #mysql在表中添加字段