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

本站公眾號
   歡迎關注本站公眾號,獲取更多信息