Mysql异步DDL修改
解决问题
Mysql5.6以前,对表结构的修改,多会锁表,十分影响业务
解决方案
-
pt-online-schema-change
-
gh-ost
-
对比(参考)
pt-online
下载
官方下载最新版
插件安装
使用时需要几个插件
yum -y install perl-DBI
yum -y install perl-DBD-MySQL
yum -y install perl-Time-HiRes
yum -y install perl-IO-Socket-SSL
yum -y install perl-Digest-MD5
解压
Shell
- 要给执行权限
- shell可根据业务动态调整
#!/bin/bash
#要操作的表名
table=$1
#DDL-sql
alter_conment=$2
#mysql连接
cnn_host='192.168.0.101'
cnn_user='root'
cnn_pwd='123'
cnn_db='sh_db'
#执行toolkit
/usr/local/pt-online/percona-toolkit-3.3.1/bin/pt-online-schema-change --charset=utf8 --no-version-check --user=${cnn_user} --password=${cnn_pwd} --host=${cnn_host} P=3306,D=${cnn_db},t=$table --alter "${alter_conment}" --execute
测试
将要修改的表插入10W条数据,数据没有标准,什么时候DDL修改操作有几秒钟延迟就可以了
- java代码
for (int i = 0; i <60 ; i++) {
System.out.println(i);
TimeUnit.SECONDS.sleep(1);
Model model=new Model();
modelService.insert(model);
}
//每秒钟insert一条,循环60次,共持续60秒
- 执行java循环
不用toolkit工具
- 执行SQL
ALTER TABLE `table`
ADD COLUMN `add1` INT(1) NULL AFTER `column1`;
- 观察java输出,循环会卡住,什么时候SQL执行完了,什么时候继续循环,会阻塞业务
用toolkit工具
-
执行Shell脚本
sh shell.sh table "ADD COLUMN add1 INT(1) NULL AFTER column1"
-
观察java输出,循环会继续,不会阻塞业务