無為,多年 MySQL DBA 工作經驗,現就職於某知名網際網路公司,對 MySQL、 Redis、PostgrepSQL 等主流資料庫有一定了解,擁有豐富的一線運維經驗。有沒有一種途徑能讓我們隨時能了解 alter table 語句的執行狀況呢?答案是肯定的,今天我們就來一起學習下 MySQL alter table 語句進度評估。1 官方文檔首先我們來看下官方文檔對 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):在此階段開始之前,將根據刷新列 table 的長度以更準確的估算值更新 WORK_ESTIMATED。stage/innodb/alter table (log apply table):此階段包括應用程式運行 ALTER TABLE 時生成的並發 DML 日誌。此階段的持續時間取決於 table 更改的程度。如果未在 table 上運行任何並發 DML,則此階段是即時的。stage/innodb/alter table (end):包括刷新階段之後出現的所有剩餘工作,例如重新應用在 ALTER TABLE 運行時在 table 上執行的 DML。2 示例下面我們通過實驗來試試 alter table 的進度查詢首先啟用 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那開啟 performance_schema 會不會影響性能呢?答:會影響性能,但我們只開了 stage/innodb/alter% 的,因此影響可以忽略不計啟用階段事件監聽,其中包括 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 列添加到 employee 示例資料庫的 employee 表中。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: 0mysql> 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)另外,「悅專欄」將為各位提供模擬面試服務,從簡歷篩選到面試,都有行業內大神為您做專業的全方位分析!初期階段,提供 50 個「模擬面試」免費名額,名額有限,欲報從速!報名方式:掃描下方二維碼關注公眾號「悅專欄」,回復「模擬面試」。