在线修改大表结构pt-online-schema-change

使用场景

  • 在线数据库的维护中,总会涉及到研发修改表结构的状况,修改一些小表影响很小,而修改大表时,每每影响业务的正常运转,如表数据量超过500W,1000W,甚至过亿时

在线修改大表的可能影响

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

pt-online-schema-change介绍

pt-online-schema-change是percona公司开发的一个工具,在percona-toolkit包里面能够找到这个功能,它能够在线修改表结构html

原理:mysql

  • 首先它会新建一张如出一辙的表,表名通常是_new后缀
  • 而后在这个新表执行更改字段操做
  • 而后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
  • 最后将原表的数据拷贝到新表中,而后替换掉原表

使用pt-online-schema-change执行SQL的日志
SQL语句:
ALTER TABLE tmp_task_user ADD support tinyint(1) unsigned NOT NULL DEFAULT '1';sql

sh pt.sh tmp_task_user "ADD COLUMN support tinyint(1) unsigned NOT NULL DEFAULT '1'"数据库

tmp_task_user
ADD COLUMN support tinyint(1) unsigned NOT NULL DEFAULT '1'
No slaves found.  See --recursion-method if host h=127.0.0.1,P=3306 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test_db`.`tmp_task_user`...
Creating new table...
Created new table test_db._tmp_task_user_new OK.
Altering new table...
Altered `test_db`.`_tmp_task_user_new` OK.
2018-05-14T18:14:21 Creating triggers...
2018-05-14T18:14:21 Created triggers OK.
2018-05-14T18:14:21 Copying approximately 6 rows...
2018-05-14T18:14:21 Copied rows OK.
2018-05-14T18:14:21 Analyzing new table...
2018-05-14T18:14:21 Swapping tables...
2018-05-14T18:14:21 Swapped original and new tables OK.
2018-05-14T18:14:21 Dropping old table...
2018-05-14T18:14:21 Dropped old table `test_db`.`_tmp_task_user_old` OK.
2018-05-14T18:14:21 Dropping triggers...
2018-05-14T18:14:21 Dropped triggers OK.
Successfully altered `test_db`.`tmp_task_user`.

好处:bash

  • 下降主从延时的风险
  • 能够限速、限资源,避免操做时MySQL负载太高

建议:服务器

  • 在业务低峰期作,将影响降到最低

pt-online-schema-change安装

1.去官网下载对应的版本,官网下载地址:https://www.percona.com/downl...app

2.下载解压以后就能够看到pt-online-schema-change工具

clipboard.png

3.该工具须要一些依赖包,直接执行不成功时通常会有提示,这里能够提早yum安装性能

yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL

pt-online-schema-change使用

1.参数
./bin/pt-online-schema-change --help 能够查看参数的使用,咱们只是要修改个表结构,只须要知道几个简单的参数就能够了阿里云

--user=        链接mysql的用户名
--password=    链接mysql的密码
--host=        链接mysql的地址
P=3306         链接mysql的端口号
D=             链接mysql的库名
t=             链接mysql的表名
--alter        修改表结构的语句
--execute      执行修改表结构
--no-version-check  不检查版本,在阿里云服务器中通常加入此参数,不然会报错

2.为避免每次都要输入一堆参数,写个脚本复用一下,pt.sh

#!/bin/bash
table=$1
alter_conment=$2

cnn_host='127.0.0.1'
cnn_user='user'
cnn_pwd='password'
cnn_db='database_name'

echo "$table"
echo "$alter_conment"
/root/percona-toolkit-2.2.19/bin/pt-online-schema-change --no-version-check --user=${cnn_user} --password=${cnn_pwd} --host=${cnn_host}  P=3306,D=${cnn_db},t=$table --alter 
"${alter_conment}" --execute

3.添加表字段
如添加表字段SQL语句为:
ALTER TABLE tb_test ADD COLUMN column1 tinyint(4) DEFAULT NULL;
那么使用pt-online-schema-change则能够这样写
sh pt.sh tb_test "ADD COLUMN column1 tinyint(4) DEFAULT NULL"

4.修改表字段
SQL语句:
ALTER TABLE tb_test MODIFY COLUMN num int(11) unsigned NOT NULL DEFAULT '0';

pt-online-schema-change工具:
sh pt.sh tb_test "MODIFY COLUMN num int(11) unsigned NOT NULL DEFAULT '0'"

5.修改表字段名
SQL语句:
ALTER TABLE tb_test CHANGE COLUMN age adress varchar(30);

pt-online-schema-change工具:
sh pt.sh tb_test "CHANGE COLUMN age address varchar(30)"

6.添加索引
SQL语句:
ALTER TABLE tb_test ADD INDEX idx_address(address);
pt-online-schema-change工具:
sh pt.sh tb_test "ADD INDEX idx_address(address)"

其余

  • pt-online-schema-change工具还有不少其余的参数,能够有不少限制,好比限制CPU、线程数量、从库状态等等,不过我作过一个超过6000W表的结构修改,发现几乎不影响性能,很稳定很流畅的就修改了表结构,因此,对以上常规参数的使用基本能知足业务
  • 必定要在业务低峰期作,这样才能确保万无一失

文档

1.官方参考:https://www.percona.com/doc/p...
2.官方下载:https://www.percona.com/downl...

相关文章
相关标签/搜索