作者简介
无为,多年 MySQL DBA 工作经验,现就职于某知名互联网公司,对 MySQL、 Redis、PostgrepSQL 等主流数据库有一定了解,拥有丰富的一线运维经验。
有没有一种途径能让我们随时能了解 alter table 语句的执行状况呢?
答案是肯定的,今天我们就来一起学习下 MySQL alter table 语句进度评估。
首先我们来看下官方文档对 alter table 语句的解释。
alter table 语句有七个不同的阶段事件,每个事件在其不同的阶段执行,具体如下:
下面我们通过实验来试试 alter table 的进度查询
首先启用 stage/innodb/alter%:
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES'
WHERE NAME LIKE 'stage/innodb/alter%';
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0
小贴士 那开启 performance_schema 会不会影响性能呢? 答:会影响性能,但我们只开了 stage/innodb/alter% 的,因此影响可以忽略不计
启用阶段事件监听,其中包括 events_stages_current ,events_stages_history 和 events_stages_history_long。
mysql> UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%stages%';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
运行 alter table 操作。在此示例中,将 middle_name 列添加到 employee 示例数据库的 employee 表中。
mysql> ALTER TABLE employees.employees ADD COLUMN middle_name varchar(14) AFTER first_name;
Query OK, 0 rows affected (9.27 sec)
Records: 0 Duplicates: 0 Warnings: 0
进度查询
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
FROM performance_schema.events_stages_current;
+------------------------------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------------------------------------+----------------+----------------+
| stage/innodb/alter table (read PK and internal sort) | 280 | 1245 |
+------------------------------------------------------+----------------+----------------+
1 row in set (0.01 sec)
如果 alter table 语句已经完成,则 events_stages_current 会返回一个空集,这种情况下可以查询 events_stages_history 表以了解操作是否已经完成。
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
FROM performance_schema.events_stages_history;
+------------------------------------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+------------------------------------------------------+----------------+----------------+
| stage/innodb/alter table (read PK and internal sort) | 886 | 1213 |
| stage/innodb/alter table (flush) | 1213 | 1213 |
| stage/innodb/alter table (log apply table) | 1597 | 1597 |
| stage/innodb/alter table (end) | 1597 | 1597 |
| stage/innodb/alter table (log apply table) | 1981 | 1981 |
+------------------------------------------------------+----------------+----------------+
5 rows in set (0.00 sec)