不用MariaDB/Percona也能查看DDL的进度

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 如何查看DDL的进度? 使用MariaDB/Percona版本的一个便利之处就是可以及时查看DDL的进度,进而预估DDL耗时。 其实,在官方版本里也是可以查看DDL进度的,认真看手册的同学就能发现手册中有提到过: You can monitor ALTER TABLE progress for InnoDB tables using Performance Schema. 应该怎么做呢,我们来大概说下。

如何查看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执行过程包括下面几个主要阶段:

8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (read PK and internal sort),读取主键(聚集索引),计算需要处理的data page数;
8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (merge sort),处理ALTER TABLE影响的索引,每个索引跑一次(含主键索引);
8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (insert),同上;
8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (log apply index),将执行DDL期间新增的DML操作应用到index上;
8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (flush),flush阶段;
8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (log apply table),将执行DDL期间新增的DML操作应用到table上;
8481c8f592b7f349aa84a1de5c171db681516edf stage/innodb/alter table (end),收尾阶段。

再说下利用P_S查看ALTER TABLE 进度的局限性:

8481c8f592b7f349aa84a1de5c171db681516edf 只支持MySQL 5.7+的版本;
8481c8f592b7f349aa84a1de5c171db681516edf 只支持InnoDB引擎表;
8481c8f592b7f349aa84a1de5c171db681516edf 不支持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。


原文发布时间为:2018-04-2
本文作者:叶师傅
本文来自云栖社区合作伙伴 “老叶茶馆”,了解相关信息可以关注“ 老叶茶馆”微信公众号
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
关系型数据库 数据库管理
|
存储 缓存 关系型数据库
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
332 0
|
3月前
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
220 8
|
4月前
|
缓存 关系型数据库 MySQL
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
251 19
|
3月前
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
536 0
|
3月前
|
SQL Ubuntu 关系型数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
47 0
|
3月前
|
关系型数据库 MySQL 数据库连接
FreeSWITCH通过mod_mariadb原生连接MySQL
FreeSWITCH通过mod_mariadb原生连接MySQL
315 0
|
NoSQL 关系型数据库 MySQL
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等,阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
203 0
|
NoSQL Cloud Native 关系型数据库
阿里云RDS数据库_MySQL_SQL Server_MariaDB_PolarDB_PostgreSQL
阿里云RDS关系型数据库大全:MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
133 0

推荐镜像

更多