之前写过一篇,内容还是比较笼统,特重写一篇,以说明。原文地址:【MYSQL ddl原理及千万级表修改不停服解决方案】

一、本质上解决的是修改语句阻塞问题,时间上肯定更长,但是不影响正常的业务使用。

二、具体流程

1、创建和源表同结构的新表
2、在新表执行DDL语句
3、在源表创建三个触发器分别对应insert、update、delete操作
4、从源表拷贝数据到新表,拷贝过程中源表通过触发器把新的DML操作更新到新表中(chunk-size, chunk-time参数)
5、rename源表到old表中,把新表rename为源表,默认最后删除源表

三、限制

1、必须有主键或唯一键
2、原表上不能有triggers,因为工具要建立三个修改触发器
3、机器负载不能太高
4、外键要–alter-foreign-keys-method特殊设置
5、表引擎必须是innodb

四、测试

以测试表score,300w+数据为例,具体信息如下:

mysql> desc score;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(11)          | NO   | PRI | NULL    | auto_increment |
| name   | varchar(128)     | NO   |     |         |                |
| age    | int(11)          | NO   |     | 0       |                |
| sex    | varchar(16)      | NO   |     |         |                |
| grade  | int(11)          | NO   |     | 0       |                |
| grade1 | int(11) unsigned | NO   |     | 0       |                |
| grade2 | int(11) unsigned | NO   |     | 0       |                |
| grade3 | int(11) unsigned | NO   |     | 0       |                |
| grade4 | int(11) unsigned | NO   |     | 0       |                |
| grade5 | int(11) unsigned | NO   |     | 0       |                |
+--------+------------------+------+-----+---------+----------------+
10 rows in set (0.00 sec)mysql> select count(*) from score;
+----------+
| count(*) |
+----------+
|  3145732 |
+----------+

pt-osc shell

pt-online-schema-change \--host="localhost" \--port=3306 \--user="root" \--password="root" \D="test",t="score" \--alter="add column grade6 int(11) unsigned not null default 0" \--print \--execute

执行流程

[@bx~]# ./pt
No slaves found.  See --recursion-method if host bx16-77-246 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:analyze_table, 10, 1copy_rows, 10, 0.25create_triggers, 10, 1drop_triggers, 10, 1swap_tables, 10, 1update_foreign_keys, 10, 1
Altering `test`.`score`...
Creating new table... #创建新表
CREATE TABLE `test`.`_score_new` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(128) NOT NULL DEFAULT '',`age` int(11) NOT NULL DEFAULT '0',`sex` varchar(16) NOT NULL DEFAULT '',`grade` int(11) NOT NULL DEFAULT '0',`grade1` int(11) unsigned NOT NULL DEFAULT '0',`grade2` int(11) unsigned NOT NULL DEFAULT '0',`grade3` int(11) unsigned NOT NULL DEFAULT '0',`grade4` int(11) unsigned NOT NULL DEFAULT '0',`grade5` int(11) unsigned NOT NULL DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3407835 DEFAULT CHARSET=utf8
Created new table test._score_new OK.
Altering new table... #修改新表结构,此处为增加字段
ALTER TABLE `test`.`_score_new` add column grade6 int(11) unsigned not null default 0
Altered `test`.`_score_new` OK.
2021-04-24T08:37:20 Creating triggers... #建立三个after触发器,是指在原表操作后触发
-----------------------------------------------------------
Event : DELETE
Name  : pt_osc_test_score_del
SQL   : CREATE TRIGGER `pt_osc_test_score_del` AFTER DELETE ON `test`.`score` FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR 1146 begin end; DELETE IGNORE FROM `test`.`_score_new` WHERE `test`.`_score_new`.`id` <=> OLD.`id`; END
Suffix: del
Time  : AFTER
-----------------------------------------------------------
-----------------------------------------------------------
Event : UPDATE
Name  : pt_osc_test_score_upd
SQL   : CREATE TRIGGER `pt_osc_test_score_upd` AFTER UPDATE ON `test`.`score` FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR 1146 begin end; DELETE IGNORE FROM `test`.`_score_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `test`.`_score_new`.`id` <=> OLD.`id`; REPLACE INTO `test`.`_score_new` (`id`, `name`, `age`, `sex`, `grade`, `grade1`, `grade2`, `grade3`, `grade4`, `grade5`) VALUES (NEW.`id`, NEW.`name`, NEW.`age`, NEW.`sex`, NEW.`grade`, NEW.`grade1`, NEW.`grade2`, NEW.`grade3`, NEW.`grade4`, NEW.`grade5`); END
Suffix: upd
Time  : AFTER
-----------------------------------------------------------
-----------------------------------------------------------
Event : INSERT
Name  : pt_osc_test_score_ins
SQL   : CREATE TRIGGER `pt_osc_test_score_ins` AFTER INSERT ON `test`.`score` FOR EACH ROW BEGIN DECLARE CONTINUE HANDLER FOR 1146 begin end; REPLACE INTO `test`.`_score_new` (`id`, `name`, `age`, `sex`, `grade`, `grade1`, `grade2`, `grade3`, `grade4`, `grade5`) VALUES (NEW.`id`, NEW.`name`, NEW.`age`, NEW.`sex`, NEW.`grade`, NEW.`grade1`, NEW.`grade2`, NEW.`grade3`, NEW.`grade4`, NEW.`grade5`);END
Suffix: ins
Time  : AFTER
-----------------------------------------------------------
2021-04-24T08:37:20 Created triggers OK.
2021-04-24T08:37:20 Copying approximately 3133167 rows...
INSERT LOW_PRIORITY IGNORE INTO `test`.`_score_new` (`id`, `name`, `age`, `sex`, `grade`, `grade1`, `grade2`, `grade3`, `grade4`, `grade5`) SELECT `id`, `name`, `age`, `sex`, `grade`, `grade1`, `grade2`, `grade3`, `grade4`, `grade5` FROM `test`.`score` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) AND ((`id` <= ?)) LOCK IN SHARE MODE /*pt-online-schema-change 25729 copy nibble*/
SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`score` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) ORDER BY `id` LIMIT ?, 2 /*next chunk boundary*/2021-04-24T08:37:48 Copied rows OK.
2021-04-24T08:37:48 Analyzing new table...
2021-04-24T08:37:48 Swapping tables...
RENAME TABLE `test`.`score` TO `test`.`_score_old`, `test`.`_score_new` TO `test`.`score`
2021-04-24T08:37:49 Swapped original and new tables OK.
2021-04-24T08:37:49 Dropping old table...
DROP TABLE IF EXISTS `test`.`_score_old`
2021-04-24T08:37:49 Dropped old table `test`.`_score_old` OK.
2021-04-24T08:37:49 Dropping triggers...
DROP TRIGGER IF EXISTS `test`.`pt_osc_test_score_del`
DROP TRIGGER IF EXISTS `test`.`pt_osc_test_score_upd`
DROP TRIGGER IF EXISTS `test`.`pt_osc_test_score_ins`
2021-04-24T08:37:49 Dropped triggers OK.
Successfully altered `test`.`score`.

参考文档
1 pt-osc document

【工具】pt-online-schema-change相关推荐

  1. AppBoxFuture(四). 随需而变-Online Schema Change

      需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...

  2. Doris之Schema Change

    Doris之Schema Change 用户可以通过 Schema Change 操作来修改已存在表的 Schema.目前 Doris 支持以下几种修改: 增加.删除列 修改列类型 调整列顺序 增加. ...

  3. Hot Redeploy:schema change not implemented

    Hot Swap failed          Server Debug: schema change not implemented; Server Debug: Operation not su ...

  4. Bytebase数据库 Schema 变更管理工具

    Bytebase 是一个开源数据库 DevOps 工具,它相当于在整个应用程序开发生命周期中管理数据库的 GitLab,它为 DBA 和开发人员提供了一个基于 Web 的工作空间,以安全有效地协作和管 ...

  5. Java开源数据库管理工具

    SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...

  6. gh-ost —— GitHub Online DDL 工具使用详解

    目录 1.简介 2.为什么不用触发器 ? 3.命名由来 4.亮点 5.使用 6.它是如何工作的? 7.工作模式 7.1.模式1 -- 连上从库,在主库上修改 7.2.模式2 -- 直接在主库上修改 7 ...

  7. 【MySQL】Schema与数据类型优化

    目录 选择优化的数据类型 整数类型 实数类型 字符串类型 日期和时间类型 位置据类型 选择标识符 特殊类型数据 MySQL schema 设计中的陷阱 范式和反范式 缓存表和汇总表 加快 ALTER ...

  8. TiDB Online DDL 在 TiCDC 中的应用丨TiDB 工具分享

    引言 TiCDC 作为 TiDB 的数据同步组件,负责直接从 TiKV 感知数据变更同步到下游.其中比较核心的问题是数据解析正确性问题,具体而言就是如何使用正确的 schema 解析 TiKV 传递过 ...

  9. java mysql工具_Java开源数据库管理工具

    SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...

  10. 【硬刚大数据】大数据同步工具之FlinkCDC/Canal/Debezium对比

    欢迎关注博客主页:微信搜:import_bigdata,大数据领域硬核原创作者_王知无(import_bigdata)_CSDN博客 欢迎点赞.收藏.留言 ,欢迎留言交流! 本文由[王知无]原创,首发 ...

最新文章

  1. c语言已知先序还原二叉树,(c++ 递归)先序 中序 还原二叉树
  2. 【建模必备】遗传算法的基本原理与步骤(编码/解码)
  3. PHP tcp短链接,http请求怎样实现TCP长连接、短连接
  4. 在Windows2016中回到DOS时代用tt练习打字
  5. 想要提升网站曝光率应避免哪些错误设置的出现?
  6. java/php/c#版rsa签名以及java验签实现--转
  7. 第02课:深度学习 Python 必备知识点
  8. 如何看懂dtd文档?
  9. java从控制台读取数据_Java不同版本从控制台读取数据方法及优缺点分析
  10. cad页面布局快捷键_炸裂“图纸集”功能、高手都在偷偷用的CAD图纸管理神器
  11. vscode如何添加头部注释、作者注释
  12. python实现句子反转
  13. java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表
  14. scratch 3 下载和安装
  15. 网络爬虫---微信爬虫
  16. 查看linux系统日志某一天,linux系统日志查看
  17. 队列同步器(AbstractQueuedSynchronizer)源码简析
  18. 浅谈LED芯片库存信息化管理
  19. zblog php 调用缩略图,zblog调用文章缩略图的方法
  20. 计算机初中几年级考,2021年小升初考试时间(2021小升初考试是几月几号 )

热门文章

  1. 微信小程序框架--weui
  2. python中dateutil库用法详解
  3. 群晖linux怎么进入u盘,超级简单,群晖系统的U盘制作和安装指导,实现家庭云...
  4. VS2022开发Arduino(提供Visual.Micro.Processing.Sketch.dll)
  5. java连接mysql,报错Could not create connection to database server.
  6. 深入理解ext4文件系统
  7. Python数据分析与应用(一)
  8. iOS简单人脸检测的实现
  9. unity3d学习笔记-特效(1.粒子系统)
  10. 土木想往土木软件开发方向发展,应该如何准备