您可以使用ALTER TABLE
进度监控InnoDB
表使用性能模式。
有七个阶段事件,代表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)
:包括ALTER TABLE
操作的所有剩余工作,例如重新应用ALTER TABLE
操作期间执行的DML。
InnoDB
ALTER TABLE
阶段事件当前不包括空间索引的添加。
使用性能模式监控ALTER TABLE示例
以下示例演示如何启用ALTER TABLE
阶段事件仪表和相关消费者表,以监控ALTER TABLE
进度。有关性能模式阶段事件仪表和相关消费者的信息,请参阅第29.12.5节,“性能模式阶段事件表”。
-
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
-
启用阶段事件消费者表,包括
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
列到 employees 数据库的 employees 表中。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_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)
如上所示,
WORK_ESTIMATED
值在ALTER TABLE
处理过程中被修订。初始阶段的估算工作量为 1213。当ALTER TABLE
处理完成时,WORK_ESTIMATED
被设置为实际值,即 1981。