您可以使用效能綱要來監控 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。