不用MariaDB/Percona也能查看DDL的进度
时间:2022-06-06
本文章向大家介绍不用MariaDB/Percona也能查看DDL的进度,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
导读
如何查看DDL的进度?
使用MariaDB/Percona版本的一个便利之处就是可以及时查看DDL的进度,进而预估DDL耗时。 其实,在官方版本里也是可以查看DDL进度的,认真看手册的同学就能发现手册中有提到过:
You can monitor ALTER TABLE progress for InnoDB tables using Performance Schema.
应该怎么做呢,我们来大概说下。 简言之,需要启用performance_schema,并设置2个地方:
[yejr@imysql]> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
[yejr@imysql]> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
现在,跑个DDL看看:
[yejr@imysql]> SELECT COUNT(*) FROM t1;
+----------+
| count(*) |
+----------+
| 799994 |
+----------+
[yejr@imysql]> ALTER TABLE t1 ADD c4 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
在另一个SESSION中反复执行下面的SQL查看进度:
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
+------------------------------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------------------------------------+----------------+----------------+
| stage/sql/Sending data | NULL | NULL |
| stage/innodb/alter table (read PK and internal sort) | 3464 | 31227 |
+------------------------------------------------------+----------------+----------------+
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
+------------------------------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------------------------------------+----------------+----------------+
| stage/sql/Sending data | NULL | NULL |
| stage/innodb/alter table (read PK and internal sort) | 11760 | 31227 |
+------------------------------------------------------+----------------+----------------+
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
+---------------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+---------------------------------------+----------------+----------------+
| stage/sql/Sending data | NULL | NULL |
| stage/innodb/alter table (merge sort) | 12888 | 31227 |
+---------------------------------------+----------------+----------------+
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
+-----------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+-----------------------------------+----------------+----------------+
| stage/sql/Sending data | NULL | NULL |
| stage/innodb/alter table (insert) | 22432 | 31227 |
+-----------------------------------+----------------+----------------+
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
+----------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+----------------------------------+----------------+----------------+
| stage/sql/Sending data | NULL | NULL |
| stage/innodb/alter table (flush) | 34076 | 34980 |
+----------------------------------+----------------+----------------+
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;
+------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------+----------------+----------------+
| stage/sql/Sending data | NULL | NULL |
+------------------------+----------------+----------------+
最后,也可以查看 events_stages_history 里记录的完整过程:
[yejr@imysql]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;
+----------------------------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+----------------------------------------------------+----------------+----------------+
| stage/sql/System lock | NULL | NULL |
| stage/sql/optimizing | NULL | NULL |
| stage/sql/statistics | NULL | NULL |
| stage/sql/preparing | NULL | NULL |
| stage/sql/executing | NULL | NULL |
| stage/sql/cleaning up | NULL | NULL |
| stage/sql/starting | NULL | NULL |
| stage/sql/checking permissions | NULL | NULL |
| stage/sql/Opening tables | NULL | NULL |
| stage/sql/init | NULL | NULL |
| stage/sql/cleaning up | NULL | NULL |
| stage/innodb/alter table (log apply table) | 35363 | 35363 |
| stage/sql/committing alter table to storage engine | NULL | NULL |
| stage/innodb/alter table (end) | 35363 | 35363 |
| stage/innodb/alter table (log apply table) | 35747 | 35747 |
| stage/sql/end | NULL | NULL |
| stage/sql/query end | NULL | NULL |
| stage/sql/closing tables | NULL | NULL |
| stage/sql/freeing items | NULL | NULL |
| stage/sql/logging slow query | NULL | NULL |
+----------------------------------------------------+----------------+----------------+
从上面的结果我们也能看到,一个DDL执行过程包括下面几个主要阶段:
- stage/innodb/alter table (read PK and internal sort),读取主键(聚集索引),计算需要处理的data page数;
- stage/innodb/alter table (merge sort),处理ALTER TABLE影响的索引,每个索引跑一次(含主键索引);
- stage/innodb/alter table (insert),同上;
- stage/innodb/alter table (log apply index),将执行DDL期间新增的DML操作应用到index上;
- stage/innodb/alter table (flush),flush阶段;
- stage/innodb/alter table (log apply table),将执行DDL期间新增的DML操作应用到table上;
- stage/innodb/alter table (end),收尾阶段。
再说下利用P_S查看ALTER TABLE 进度的局限性:
- 只支持MySQL 5.7+的版本;
- 只支持InnoDB引擎表;
- 不支持spatial indexes。
最后,我们可以运行下面的SQL,查看当前所有ALTER TABLE进度及其对应的DDL SQL:
[yejr@imysql]> SELECT ec.THREAD_ID, ec.EVENT_NAME, ec.WORK_COMPLETED, ec.WORK_ESTIMATED, pt.STATE, pt.INFO FROM performance_schema.events_stages_current ec left join performance_schema.threads th on ec.thread_id = th.thread_id left join information_schema.PROCESSLIST pt on th.PROCESSLIST_ID = pt.ID where pt.INFO like ‘ALTER%’G
*************************** 1. row ***************************
THREAD_ID: 105
EVENT_NAME: stage/innodb/alter table (merge sort)
WORK_COMPLETED: 14032
WORK_ESTIMATED: 33999
STATE: altering table
INFO: ALTER TABLE t1 DROP c4
文中案例的MySQL版本:5.7.16。
参考
- 14.16.1 Monitoring ALTER TABLE Progress for InnoDB Tables Using Performance Schema , https://dev.mysql.com/doc/refman/5.7/en/monitor-alter-table-performance-schema.html
- MySQL 5.6 Online DDL异常分析
- Spring Cloud自定义Hystrix请求命令
- JavaScript面试问题:事件委托和this
- Spring Cloud中的断路器Hystrix
- js的隐含参数(arguments,callee,caller)使用方法
- Spring Cloud中的负载均衡策略
- Spring Cloud中负载均衡器概览
- 没有event loop的PHP
- RestTemplate的逆袭之路,从发送请求到负载均衡
- limit_area_cirle
- Spring RestTemplate中几种常见的请求方式
- 什么是客户端负载均衡
- jQuery 升级踩坑大全
- Eureka中的核心概念
- Spring Cloud Zuul中异常处理细节
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AuthMatrix:一款针对Web应用和服务的认证安全检测BurpSuite工具
- KITT-Lite:基于Python实现的轻量级命令行渗透测试工具集
- 一次KimSuky攻击事件分析
- OpenCV中如何使用滚动条动态调整参数
- 一文读懂「分布式架构」
- 老哥,您看我这篇Java集合,还有机会评优吗?
- 在 IDEA 中使用 Java 热部署插件 JRebel
- 后端必备 Git 分支开发:规范指南
- 大量的 TIME_WAIT 状态连接怎么处理?(文末有福利)
- 线上教育系统开发中,购物车功能是如何实现的?
- IntelliJ IDEA 2020.2重磅发布!全面支持Github PR。真香版本?
- 腾讯云智能语音小程序插件实现实时语音识别
- 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜
- 36个助你成为专家需要掌握的JavaScript概念
- Bulehero 蠕虫病毒安全分析报告