【工具】pt-online-schema-change
之前写过一篇,内容还是比较笼统,特重写一篇,以说明。原文地址:【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相关推荐
- AppBoxFuture(四). 随需而变-Online Schema Change
需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...
- Doris之Schema Change
Doris之Schema Change 用户可以通过 Schema Change 操作来修改已存在表的 Schema.目前 Doris 支持以下几种修改: 增加.删除列 修改列类型 调整列顺序 增加. ...
- Hot Redeploy:schema change not implemented
Hot Swap failed Server Debug: schema change not implemented; Server Debug: Operation not su ...
- Bytebase数据库 Schema 变更管理工具
Bytebase 是一个开源数据库 DevOps 工具,它相当于在整个应用程序开发生命周期中管理数据库的 GitLab,它为 DBA 和开发人员提供了一个基于 Web 的工作空间,以安全有效地协作和管 ...
- Java开源数据库管理工具
SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...
- gh-ost —— GitHub Online DDL 工具使用详解
目录 1.简介 2.为什么不用触发器 ? 3.命名由来 4.亮点 5.使用 6.它是如何工作的? 7.工作模式 7.1.模式1 -- 连上从库,在主库上修改 7.2.模式2 -- 直接在主库上修改 7 ...
- 【MySQL】Schema与数据类型优化
目录 选择优化的数据类型 整数类型 实数类型 字符串类型 日期和时间类型 位置据类型 选择标识符 特殊类型数据 MySQL schema 设计中的陷阱 范式和反范式 缓存表和汇总表 加快 ALTER ...
- TiDB Online DDL 在 TiCDC 中的应用丨TiDB 工具分享
引言 TiCDC 作为 TiDB 的数据同步组件,负责直接从 TiKV 感知数据变更同步到下游.其中比较核心的问题是数据解析正确性问题,具体而言就是如何使用正确的 schema 解析 TiKV 传递过 ...
- java mysql工具_Java开源数据库管理工具
SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...
- 【硬刚大数据】大数据同步工具之FlinkCDC/Canal/Debezium对比
欢迎关注博客主页:微信搜:import_bigdata,大数据领域硬核原创作者_王知无(import_bigdata)_CSDN博客 欢迎点赞.收藏.留言 ,欢迎留言交流! 本文由[王知无]原创,首发 ...
最新文章
- c语言已知先序还原二叉树,(c++ 递归)先序 中序 还原二叉树
- 【建模必备】遗传算法的基本原理与步骤(编码/解码)
- PHP tcp短链接,http请求怎样实现TCP长连接、短连接
- 在Windows2016中回到DOS时代用tt练习打字
- 想要提升网站曝光率应避免哪些错误设置的出现?
- java/php/c#版rsa签名以及java验签实现--转
- 第02课:深度学习 Python 必备知识点
- 如何看懂dtd文档?
- java从控制台读取数据_Java不同版本从控制台读取数据方法及优缺点分析
- cad页面布局快捷键_炸裂“图纸集”功能、高手都在偷偷用的CAD图纸管理神器
- vscode如何添加头部注释、作者注释
- python实现句子反转
- java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表
- scratch 3 下载和安装
- 网络爬虫---微信爬虫
- 查看linux系统日志某一天,linux系统日志查看
- 队列同步器(AbstractQueuedSynchronizer)源码简析
- 浅谈LED芯片库存信息化管理
- zblog php 调用缩略图,zblog调用文章缩略图的方法
- 计算机初中几年级考,2021年小升初考试时间(2021小升初考试是几月几号 )
热门文章
- 微信小程序框架--weui
- python中dateutil库用法详解
- 群晖linux怎么进入u盘,超级简单,群晖系统的U盘制作和安装指导,实现家庭云...
- VS2022开发Arduino(提供Visual.Micro.Processing.Sketch.dll)
- java连接mysql,报错Could not create connection to database server.
- 深入理解ext4文件系统
- Python数据分析与应用(一)
- iOS简单人脸检测的实现
- unity3d学习笔记-特效(1.粒子系统)
- 土木想往土木软件开发方向发展,应该如何准备