pt-online-schema-change

1、背景

MySQL大字段的DDL操做:加减字段、索引、修改字段属性等,在5.1以前都是很是耗时耗力的,特别是会对MySQL服务产生影响。在5.1以后随着Plugin Innodb的出如今线加索引的提升了不少,可是还会影响(时间缩短了),主要是在更改期间,会生成一个互斥锁,阻塞对整个表的全部操做。不过MySQL 5.6能够避免上面的状况,支持在线DDL操做了。但目前大部分在用的版本都是5.6以前的,因此DDL操做一直是运维人员头疼的事。那如何在不锁表的状况下安全快速地更新表结构?如今来讲明下percona-toolkit的pt-online-schema-change(简称:OSC)的使用说明,能够很好的解决上述的问题。php

在咱们的之前作法中,为了避免影响线上业务,咱们通常采用:先在线下从库更改表结构,而后替换线上从库,这样一台台的修改,最后作一下主库切换,这个过程会耗费很长时间,而且在作主库切换时,风险也很是的大,咱们怎样才能让时间更短,且能不阻塞读写状况下在线修改呢?早在2008年Shlomi Noach 就利用触发器的原理,开发了python版本oak-online-alter-table在线更改表结构脚本,最近,Percona公司在本身的percona-toolkit脚本集合中也发布了在线更改表结构的perl版本脚本pt-online-schema-change,Facebook公司也开发本身的在线更改表结构php版本脚本OnlineSchemaChange.php,而它们最底层的实现原理都为触发器。由于oak-online-alter-table不肯定是否在被开发与支持,而OnlineSchemaChange.php的使用比较复杂,且有不少功能不支持如:表结构中若是有外键的状况,故在此我就Percona公司的脚本作详细的剖析。python

在线修改大表的可能影响

  • 在线修改大表的表结构执行时间每每不可预估,通常时间较长
  • 因为修改表结构是表级锁,所以在修改表结构时,影响表写入操做
  • 若是长时间的修改表结构,中途修改失败,因为修改表结构是一个事务,所以失败后会还原表结构,在这个过程当中表都是锁着不可写入
  • 修改大表结构容易致使数据库CPU、IO等性能消耗,使MySQL服务器性能下降
  • 在线修改大表结构容易致使主从延时,从而影响业务读取

pt-online-schema-change的安装

#安装依赖
yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL
# 切换目录
cd /usr/local/src
# 下载
wget percona.com/get/percona-toolkit.tar.gz
# 解压
tar -zvxf percona-toolkit.tar.gz
cd percona-toolkit-3.0.13/
# 安装perl依赖
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
perl Makefile.PL
# 编译安装
make
make install
# 验证
pt-online-schema-change

验证后报错mysql

 

 缺乏perl-Digest-MD5包, 安装perl-Digest-MD5便可解决sql

yum -y install perl-Digest-MD5

出现以下结果,成功。数据库

 

建立测试数据:安全

 

mysql -h localhost -uroot -p123456

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
 
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
 
mysql> use test;
Database changed
mysql> CREATE TABLE users (id int(11) NOT NULL AUTO_INCREMENT COMMENT '用户主键',name varchar(20)  DEFAULT '' COMMENT '用户名',PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
Query OK, 0 rows affected (0.04 sec)
mysql> insert into users(name) values('test1'),('test2'),('test3');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)
 
mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)
mysql> exit;

 

添加一个字段:服务器

sql语句:
alter table users add age varchar(10) NOT NUll DEFAULT '' COMMENT '年龄';

pt-online-schema-change写法:
pt-online-schema-change --alter="add age varchar(10) NOT NUll DEFAULT '' COMMENT '年龄' ;"  --execute --print --max-lag=5 D=test,t=users,u=root,p=123456,S=/tmp/mysql.sock --no-check-replication-filters --max-load="Threads_running=100" --critical-load="Threads_running=120" --charset=utf8   --chunk-size=100

 

使用 pt-osc原生 5.6 online ddl相比,如何选择运维

online ddl在必须copy table时成本较高,不宜采用 pt-osc工具在存在触发器时,不适用 修改索引、外键、列名时,优先采用online ddl,并指定 ALGORITHM=INPLACE 其它状况使用pt-osc,虽然存在copy data pt-osc比online ddl要慢一倍左右,由于它是根据负载调整的 不管哪一种方式都选择的业务低峰期执行 特殊状况须要利用主从特性,先alter从库,主备切换,再改原主库工具

本站公众号
   欢迎关注本站公众号,获取更多信息