你可以使用Performance Schema来监控对InnoDB表的ALTER TABLE过程。
共有7个阶段事件代表ALTER TABLE过程中的不同阶段。每个事件都会在ALTER TABLE操作的不同阶段汇总报告已完成工作量(WORK_COMPLETED)和已评估工作量(WORK_ESTIMATED)。计算WORK_ESTIMATED的公式会考虑ALTER TABLE执行的所有工作,切可能会在ALTER TABLE 处理过程中被修正。WORK COMPLETED和WORK_ESTIMATED的值是ALTER TABLE操作的工作量抽象代表。
下面按照发生顺序列出ALTER TABLE 的阶段事件:
- stage/innodb/alter table (read PK and internal sort):这个阶段在ALTER TABLE处于读取主键阶段时活跃。这个阶段开始时WORK_COMPLETED=0,WORK_ESTIMATED被设置成主键索引中的页数的估计值。这个阶段结束时,WORK_ESTIMATED被更新成主键索引中页数的实际数量值。
- stage/innodb/alter table (merge sort): 对于ALTER TABLE操作添加的每个索引都会重复这个阶段。
- stage/innodb/alter table (insert): 对于ALTER TABLE操作添加的每个索引都会重复这个阶段。
- stage/innodb/alter table (log apply index): 这个阶段包含ALTER TABLE运行时产生的DML日志的应用。
- stage/innodb/alter table (flush): 在这个阶段开始前,WORK_ESTIMATED被更新成一个基于flush链表长度的更准确的值。
- stage/innodb/alter table (log apply table): 这个阶段包括ALTER TABLE运行期间产生的并发DML日志的应用。这个阶段持续的时间取决于表变化的成都。如果在表上没有运行并发DML操作,这个阶段会很快结束。
- stage/innodb/alter table (end): 包括flush阶段后的剩余工作,比如重新应用ALTER TABLE运行期间执行的DML操作。
InnoDB ALTER TABLE阶段事件目前不适用于空间索引的添加。
使用Performance Schema监控ALTER TABLE的示例 #
下面的例子展示了怎样启用stage/innodb/alter table%阶段事件组件和相关的消费者表来监控ALTER TABLE 过程。想了解Performance Schema阶段事件组件和相关消费者的信息,见章节27.12.5,“Performance Schema 阶段事件表”。
- 启用 stage/innodb/alter% 组件:
SET ENABLED = 'YES'
WHERE NAME LIKE 'stage/innodb/alter%';
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0
- 启用阶段事件消费者表,包括events_stage_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操作。在这个例子中,向employees示例数据库的employees表中添加了一个middle_name列。
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
- 查询Performance Schema数据库的events_stages_current表,查看ALTER TABLE操作的进度。ALTER TABLE所处的阶段不同,这个阶段事件所展示的页不同。WORK_COMPLETED列展示的是完成的工作。WORK_ESTIMATED列提供了对剩余工作量的估计。
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_stage_current表返回一个空结果集。在这种情况下,你可以检查events_stage_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)
如上所示,在ALTER TABLE执行过程中,WORK_ESTIMATED的值被修改。初始化阶段结束后估算的工作量值是1213。当ALTER TABLE 结束时,WORK_ESTIMATED被设置成准确值,1981。