Mysql异步DDL修改

解决问题

Mysql5.6以前,对表结构的修改,多会锁表,十分影响业务

解决方案

  • pt-online-schema-change

  • gh-ost

  • 对比(参考)

    image-20220428142408820

pt-online

下载

官方下载最新版

image-20220428142637291

插件安装

使用时需要几个插件

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

解压

image-20220428150121329

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修改操作有几秒钟延迟就可以了

  1. 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秒
  1. 执行java循环

不用toolkit工具

  1. 执行SQL
ALTER TABLE `table`   
  ADD COLUMN `add1` INT(1) NULL AFTER `column1`;
  1. 观察java输出,循环会卡住,什么时候SQL执行完了,什么时候继续循环,会阻塞业务

用toolkit工具

  1. 执行Shell脚本

    sh shell.sh table "ADD COLUMN add1 INT(1) NULL AFTER column1"
    
  2. 观察java输出,循环会继续,不会阻塞业务

toolkit其他选项说明

见官方文档

参考

posted @ 2022-04-28 15:22  RollBack2010  阅读(66)  评论(0编辑  收藏  举报