17.16.1 InnoDB 表 ALTER TABLE 进度监控使用 MySQL 性能_schema
您可以使用Performance Schema来监控ALTER TABLE
进度对InnoDB表。
有七个阶段事件,代表ALTER TABLE
的不同阶段。每个阶段事件报告了ALTER TABLE
总体操作的运行总数WORK_ COMPLETED
和WORK_ESTIMATED
,在ALTER TABLE
通过其不同阶段时。WORK_ESTIMATED
使用公式计算,考虑了ALTER TABLE
执行的所有工作,并可能在ALTER TABLE
处理时进行修正。WORK_COMPLETED
和WORK_ESTIMATED
值是ALTER TABLE
执行的所有工作的抽象表示。
事件顺序如下:
-
stage/innodb/alter table (读取主键和内部排序)
: 在ALTER TABLE
执行读取主键阶段时,该阶段是活动的。它从WORK_ COMPLETED=0
和WORK_ESTIMATED
开始,设置为估算的主键页面数。当该阶段完成时,WORK_ESTIMATED
将被更新为实际的主键页面数。 -
stage/innodb/alter table (merge 排序)
: 对于ALTER TABLE
操作添加的每个索引,该阶段将被重复执行。 -
stage/innodb/alter table (插入)
: 对于ALTER TABLE
操作添加的每个索引,该阶段将被重复执行。 -
stage/innodb/alter table (日志应用索引)
: 这个阶段包括在ALTER TABLE
运行时生成的 DML 日志的应用。 -
stage/innodb/alter table (刷新)
: 在该阶段开始之前,WORK_ESTIMATED
将被更新为更准确的估算值,基于刷新列表的长度。 -
stage/innodb/alter table (log apply table)
: 这个阶段包括在ALTER TABLE
运行时生成的并发DML日志的应用。这个阶段的持续时间取决于表的变化程度。如果没有在表上执行并发DML,这个阶段将是瞬间的。 -
stage/innodb/alter table (end)
: 包含在刷新阶段后出现的任何剩余工作,例如在ALTER TABLE
运行时对表执行的DML重新应用。
InnoDB
ALTER TABLE
阶段事件当前不考虑空间索引的添加。
以下示例演示了如何启用stage/innodb/alter table%
阶段事件仪器和相关消费者表来监控ALTER TABLE
进度。关于性能_schema_阶段事件仪器和相关消费者的信息,请见第29.12.5节,“性能_schema_阶段事件表”。
-
启用
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
-
启用阶段事件消费者表,包括
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
操作。在这个示例中,将在employees sample数据库中的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
-
通过查询性能chema的
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)
events_ stages_current
表如果ALTER TABLE
操作已经完成,则返回空集。在这种情况下,您可以查看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。