您可以使用效能結構描述監控 InnoDB
資料表的 ALTER TABLE
進度。
有七個階段事件代表 ALTER TABLE
的不同階段。每個階段事件都會報告 WORK_COMPLETED
和 WORK_ESTIMATED
的執行總計,用於整個 ALTER TABLE
操作,因為它會通過不同的階段。 WORK_ESTIMATED
是使用一個公式計算的,該公式會考量 ALTER TABLE
執行的所有工作,並且可能會在 ALTER TABLE
處理期間進行修訂。WORK_COMPLETED
和 WORK_ESTIMATED
值是 ALTER TABLE
執行的所有工作的抽象表示。
按照發生的順序,ALTER TABLE
階段事件包括
stage/innodb/alter table (讀取 PK 與內部排序)
:當ALTER TABLE
處於讀取主索引鍵階段時,此階段處於活動狀態。它以WORK_COMPLETED=0
開始,並將WORK_ESTIMATED
設定為主索引鍵中估計的頁面數。當階段完成時,WORK_ESTIMATED
會更新為主索引鍵中的實際頁面數。stage/innodb/alter table (合併排序)
:對於ALTER TABLE
操作新增的每個索引,都會重複此階段。stage/innodb/alter table (插入)
:對於ALTER TABLE
操作新增的每個索引,都會重複此階段。stage/innodb/alter table (記錄套用索引)
:此階段包括在ALTER TABLE
執行時產生的 DML 記錄套用。stage/innodb/alter table (刷新)
:在此階段開始之前,會根據刷新清單的長度,使用更準確的估計值更新WORK_ESTIMATED
。stage/innodb/alter table (log apply table)
:此階段包含當ALTER TABLE
執行時所產生的並行 DML 日誌的應用。此階段的持續時間取決於資料表變更的程度。如果沒有在資料表上執行並行 DML,則此階段是即時的。stage/innodb/alter table (end)
:包含在刷新階段之後出現的任何剩餘工作,例如重新應用當ALTER TABLE
執行時在資料表上執行的 DML。
InnoDB
ALTER TABLE
階段事件目前不考慮加入空間索引。
使用 Performance Schema 的 ALTER TABLE 監控範例
以下範例示範如何啟用 stage/innodb/alter table%
階段事件儀器和相關的消費者表格,以監控 ALTER TABLE
的進度。有關 Performance Schema 階段事件儀器和相關消費者的資訊,請參閱第 29.12.5 節,「Performance Schema 階段事件表格」。
啟用
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 資料表。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。