### 15.16.1 使用性能监控 InnoDB 表的 ALTER TABLE 进度

架构

[](<>)[](<>)

你可以监控[`更改表`](alter-table.html)进展为`InnoDB`表使用[性能模式](performance-schema.html).

有七个阶段事件代表不同阶段[`更改表`](alter-table.html).每个阶段事件报告运行总计`WORK_COMPLETED`和`WORK_ESTIMATED`对于整体[`更改表`](alter-table.html)操作，因为它通过不同的阶段进行。`WORK_ESTIMATED`是使用一个公式计算的，该公式考虑了所有的工作[`更改表`](alter-table.html)执行，并且可以在修改[`更改表`](alter-table.html)加工。`WORK_COMPLETED`和`WORK_ESTIMATED`值是对所执行的所有工作的抽象表示[`更改表`](alter-table.html).

按发生顺序，[`更改表`](alter-table.html)舞台活动包括：

-   `stage/innodb/alter table（读取PK和内部排序）`：这个阶段是活跃的，当[`更改表`](alter-table.html)处于阅读-主键阶段。它开始于`工作完成=0`和`WORK_ESTIMATED`设置为主键中的估计页数。舞台完成后，`WORK_ESTIMATED`更新为主键中的实际页数。

-   `stage/innodb/alter table（合并排序）`：对于由[`更改表`](alter-table.html)手术。

-   `阶段/innodb/更改表（插入）`：对于由[`更改表`](alter-table.html)手术。

-   `stage/innodb/alter table（日志应用索引）`：这个阶段包括应用DML日志产生的同时[`更改表`](alter-table.html)正在运行。

-   `stage/innodb/alter table (flush)`: 在这个阶段开始之前，`WORK_ESTIMATED`根据刷新列表的长度，使用更准确的估计值进行更新。

-   `stage/innodb/alter table（日志应用表）`：这个阶段包括应用并发DML日志产生的同时[`更改表`](alter-table.html)正在运行。此阶段的持续时间取决于表更改的程度。如果没有在表上运行并发 DML，则此阶段是即时的。

-   `stage/innodb/alter table（结束）`：包括在刷新阶段之后出现的任何剩余工作，例如重新应用在表上执行的 DML，而[`更改表`](alter-table.html)正在运行。

笔记

`InnoDB` [`更改表`](alter-table.html)舞台事件目前不考虑添加空间索引。

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

以下示例演示了如何启用`阶段/innodb/更改表%`舞台事件仪器和相关的消费者表来监控[`更改表`](alter-table.html)进步。有关 Performance Schema 阶段事件工具和相关使用者的信息，请参阅[第 27.12.5 节，“性能模式阶段事件表”](performance-schema-stage-tables.html).

1.  启用`阶段/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
    ```

2.  启用舞台事件消费者表，其中包括[`events_stages_current`](performance-schema-events-stages-current-table.html),[`events_stages_history`](performance-schema-events-stages-history-table.html)， 和[`events_stages_history_long`](performance-schema-events-stages-history-long-table.html).

    ```
    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
    ```

3.  运行一个[`更改表`](alter-table.html)手术。在这个例子中，一个`中间名字`列被添加到员工样本数据库的员工表中。

    ```
    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
    ```

4.  检查进度[`更改表`](alter-table.html)通过查询 Performance Schema 进行操作[`events_stages_current`](performance-schema-events-stages-current-table.html)桌子。显示的舞台活动会有所不同，具体取决于[`更改表`](alter-table.html)这一阶段目前正在进行中。这个`工作完成`列显示已完成的工作。这个`估计工作量`列提供了剩余工作的估计。

    ```
    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)
    ```

    这个[`事件_阶段_当前`](performance-schema-events-stages-current-table.html)如果[`改变桌子`](alter-table.html)行动已经完成。在这种情况下，您可以检查[`事件、阶段、历史`](performance-schema-events-stages-history-table.html)表以查看已完成操作的事件数据。例如：

    ```
    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)
    ```

    如上图所示`估计工作量`价值在年内进行了修订`改变桌子`处理。初始阶段完成后的预计工作为1213。什么时候`改变桌子`处理完成，`估计工作量`设置为实际值，即1981年。
