MySQL 實戰筆記 第04期:alter table 語句進度評估

2021-02-16 悅專欄
無為,多年 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: 0

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)

另外,「悅專欄」將為各位提供模擬面試服務,從簡歷篩選到面試,都有行業內大神為您做專業的全方位分析!初期階段,提供 50 個「模擬面試」免費名額,名額有限,欲報從速!報名方式:掃描下方二維碼關注公眾號「悅專欄」,回復「模擬面試」。

相關焦點

  • 強大的修改資料庫修改語句ALTER TABLE(一)[20160712]
    昨天在執行一個alter SQL語句時總是提示錯誤,看了好久才發現忘記寫表名了,這也反映出對於基本的SQL操作還是不熟練,所以今天記錄一下,由於alter table的內容很多,所以今天只是分析一下和add有關的內容。一、語法定義還是參考官方文檔,其定義如下:
  • mysql常用sql語句總結
    ]例: alter table m1 add birth date not null default '0000-00-00';Alter table 表名 add 列名稱 列類型 列參數 after 某列; [把新列加在某列後]例: alter table m1 add gender char(1) not null
  • 第09期:有關 MySQL 字符集的亂碼問題
    OK, 3 rows affected (0.00 sec)-- 建立一張新表 t4,編碼改為統一的 utf8mb4mysql> create table t4 (a1 varchar(10),a2 varchar(10)) charset utf8mb4;Query OK, 0 rows affected (0.04 sec)-- 分別導入兩部分數據my
  • 由一條create語句的問題對比mysql和oracle中的date差別 (r7筆記第26天)
    語句是一個簡單的create語句CREATE TABLE `test_user` ( `openid` varchar(64) NOT NULL, `amount` varchar(11) DEFAULT 0, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime
  • MySQL的Online DDL語句
    他們三者的區別如下:DDL:data definition language,數據定義語言,用來定義數據的語句。例如我們平時的create table,create index,create function等。DML:data manipulation language,數據修改語言,用來操作數據的語句。
  • MySQL資料庫筆記
    <3>DOS命令窗口方式停止:net stop mysql 切記不要加分號登錄MySQL資料庫:mysql -uroot -p 回車 輸入密碼登錄MySQL資料庫:mysql -uroot -p密碼 回車語法:mysql -h 伺服器主機地址
  • MySQL實戰中的Insert語句的使用心得
    前言: 提到MySQL的Insert語句,大家肯定不陌生,可以張口就來:不就是insert into table values(xxx,xxx,xxx)嘛!>INSERT into table1 VALUES(2,2,2);INSERT into table1 VALUES(3,3,3);此時table1中已經有了3條記錄,a,b,c三個欄位都是唯一(UNIQUE)索引:mysql> select * from
  • Mysql常用的增刪改查語法
    看師資,看課程看實戰,看就業選擇軟體測試,選擇松勤教育1. 表的增刪改1.主鍵表名(主鍵列); alter table 表名 drop foreign key 約束名默認約束 alter table 表名 alter 列名 set default 『默認值』 alter table 表名 alter 列名 drop default檢查約束 alter table 表名 add [CONSTRAINT 約束名] check (列名10) alter
  • Mysql分區(PARTITION)實戰--解決Mysql大量刪除數據效率低的問題
    無法執行刪除操作,只要是因為delete操作要刪除的數據量超過全表數據量的1/10,因而進行了表級鎖定。要解決這個問題,有兩種解決方案。法一: 減少每次delete的數據量,寫一個循環語句分多次刪除。這種方法沒有測過,但是目測效率也不會高到哪裡,而且對一張表進行頻繁讀寫和刪數據操作,會造成很高的I/O.法二:對netmon_history這張表進行分區。
  • MySQL資料庫Insert語句7種寫法
    創建測試表在介紹Insert語句之前,先創建一張測試表mysql> show create table t_test_2\G;*************************** 1. row *************************** Table: t_test_2Create Table: CREATE TABLE
  • MySQL中的分區表
    */mysql> alter table range_partition_table drop partition px;Query OK, 0 rows affected (0.03 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table range_partition_table
  • MySQL實戰中,Insert語句的使用心得總結
    1-1.普通插入語句INSERT INTO table (`a`, `b`, `c`, ……) VALUES ('a', 'b', 'c',
  • 發現一個關於MySQL的metadata lock的BUG
    請進行以下操作實現復現: 表結構如下:mysql> create table xcy_test_utf8( id
  • 幾個常見而嚴重的 MySQL 問題分析 | 運維進階
    語句失敗返回,但是事務沒有提交,此時alter仍然會被堵住詳細測試解釋說明:mysql> insert into yetest2 select * from yetest1;mysql> alter table yetest2 add yeColumn int; //等待SESSION A執行完;mysql> show
  • 新手入門MYSQL資料庫命令大全
    一、命令行連接資料庫Windows作業系統進入CMD命令行,進入mysql.exe所在目錄,運行命令mysql.exe -h主機名 -u用戶名 -p密碼注意:參數名與值之間沒有空格 , 如:-h127.0.0.1
  • DBA必備技能,mysql權限管理(DCL語句)
    今天要講的內容跟DBA有很大關係,想做DBA權限管理是很重要的,今天就講一下mysql中的權限管理。一、用戶管理;1、切換資料庫;如下圖所示,將界面切換至命令界面;輸入命令use mysql;這句代碼意思是切換資料庫,切換到mysql這個資料庫下面,因為用戶信息在mysql下的user表內存儲著。
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    修改表名修改表名的語句:alter table 舊錶名 rename 新表名;修改數據表student改變為student1。alter table student rename student1修改欄位名修改欄位名的語法格式如下:alter table 表名 change 舊屬性名 新屬性名 新數據類型;alter table student1 change name s_anme varchar(50)
  • mysql 常用命令一
    >【資料庫SHOW命令】 顯示mysql中所有資料庫的名稱 show databases;#顯示mysql中的相關 show tables [ from db_name
  • MySQL 分區和分表知識總結、分區實戰以及分區的管理 | 資料
    alter table part_tab drop column c2;INNODB呢?分區表管理對指定表添加分區alter table user add partition(partition p4 values less than MAXVALUE); //只能添加大於分區鍵的分區刪除指定表指定分區alter table student drop partition p1;創建子分區
  • 重新學習Mysql資料庫1:無廢話MySQL入門
    登錄MySQLmysql -h 127.0.0.1 -u 用戶名 -pmysql -D 所選擇的資料庫名 -h 主機名 -u 用戶名 -pmysql> exit # 退出 使用 「quit;」 或 「\q;」 一樣的效果mysql> status; # 顯示當前mysql的version的各種信息mysql> select version(); # 顯示當前