您可以使用效能綱要來監控 InnoDB
表格的 ALTER TABLE
進度。
有七個階段事件代表 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
作業。在此範例中,會在 employees 範例資料庫的 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
透過查詢效能架構
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。