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
#安装依赖 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从库,主备切换,再改原主库工具