您可以使用 性能模式 监控 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
将根据刷新列表的长度更新为更准确的估计值。stage/innodb/alter table (log apply table)
:此阶段包括应用在ALTER TABLE
运行期间生成的并发 DML 日志。此阶段的持续时间取决于表更改的程度。如果在表上没有运行并发 DML,则此阶段是瞬时的。stage/innodb/alter table (end)
:包括在刷新阶段后出现的任何剩余工作,例如重新应用在ALTER TABLE
运行期间在表上执行的 DML。
InnoDB
ALTER TABLE
阶段事件目前没有考虑添加空间索引。
使用性能模式的 ALTER TABLE 监控示例
以下示例演示了如何启用 stage/innodb/alter table%
阶段事件仪表和相关的消费者表以监控 ALTER TABLE
进度。有关性能模式阶段事件仪表和相关消费者的信息,请参见 第 29.12.5 节,“性能模式阶段事件表”。
启用
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
操作。在本例中,将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。