14.17.1 使用性能模式监视 InnoDBtable 的 ALTER TABLE 进度

您可以使用Performance Schema监视InnoDB个 table 的ALTER TABLE进度。

有七个阶段事件代 tableALTER TABLE的不同阶段。每个阶段事件在其不同阶段进行时,报告的总体_操作的运行总计WORK_COMPLETEDWORK_ESTIMATEDWORK_ESTIMATED是使用考虑到ALTER TABLE执行的所有工作的公式计算得出的,并且可以在ALTER TABLE处理期间进行修改。 WORK_COMPLETEDWORK_ESTIMATED值是ALTER TABLE执行的所有工作的抽象 table 示。

按照发生的 Sequences,ALTER TABLE个阶段事件包括:

  • stage/innodb/alter table (read PK and internal sort):当ALTER TABLE处于读取主键阶段时,此阶段处于活动状态。它以WORK_COMPLETED=0WORK_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):在此阶段开始之前,将根据刷新列 table 的长度以更准确的估算值更新WORK_ESTIMATED

  • stage/innodb/alter table (log apply table):此阶段包括应用程序运行ALTER TABLE时生成的并发 DML 日志。此阶段的持续时间取决于 table 更改的程度。如果未在 table 上运行任何并发 DML,则此阶段是即时的。

  • stage/innodb/alter table (end):包括刷新阶段之后出现的所有剩余工作,例如重新应用在ALTER TABLE运行时在 table 上执行的 DML。

Note

InnoDB ALTER TABLE舞台事件当前不考虑空间索引的增加。

ALTER TABLE 使用性能模式的监视示例

以下示例演示了如何启用stage/innodb/alter table%阶段事件工具和相关的使用者 table 来监视ALTER TABLE进度。有关 Performance Schema 阶段事件工具和相关使用者的信息,请参见第 25.12.5 节“性能架构阶段事件 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
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 示例数据库的 employeetable 中。
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
  • 通过查询“性能模式events_stages_current”table 来检查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_currenttable 返回一个空集。在这种情况下,您可以检查events_stages_historytable 以查看事件数据以了解已完成的操作。例如:

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.