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從庫,主備切換,再改原主庫工具