1. 程式人生 > >查看鎖信息(開啟InnoDB監控)

查看鎖信息(開啟InnoDB監控)

ring 共享 表名 統計信息 數據結構 status 輸出 rman this

當前mysql版本:5.6.21

一、背景

在mysql處理死鎖問題時,由於show engine innodb status輸出來的死鎖日誌無任務事務上下文,並不能很好地診斷相關事務所持有的所有鎖信息,包括:鎖個數、鎖類型等。

於是,需要能查看到更詳細的事務鎖占用情況。

二、INNODB監控機制(InnoDB Monitors)

mysql提供一套INNODB監控機制,用於周期性(每15鈔)輸出INNODB運行相關狀態(INNODB運行狀態、表空間狀態、表狀態等)到mysqld服務標準錯誤輸出。另外,INNODB標準監控和鎖監控,也可以通過命令:show engine innodb status

輸出到控制臺。
此部分內容一般輸出到mysql error log裏(查找日誌位置,參見“補充知識”)。

官方說明(詳見參考文檔1)如下:

1 When you enable InnoDB monitors for periodic output, InnoDB writes their output to the mysqld server standard error output (stderr). In this case, no output is sent to clients. When switched on, InnoDB monitors print data about every 15 seconds. Server output usually is directed to the error log (see Section 5.4.2, “The Error Log”). This data is useful in performance tuning. On Windows, start the server from a command prompt in a console window with the --console option if you want to direct the output to the window rather than to the error log.

該類監控機制默認是關閉狀態,分析問題需要查看監控日誌時再開啟。
建議分析問題後,將監控關閉;否則,每15秒輸出一次INNODB運行狀態信息到錯誤日誌,會使用日誌變得特別大。

三、開啟狀態監控

INNODB監控機制目前主要提供如下四類監控:

  • 標準監控(Standard InnoDB Monitor):監視活動事務持有的表鎖、行鎖;事務鎖等待;線程信號量等待;文件IO請求;buffer pool統計信息;InnoDB主線程purge和change buffer merge活動。
  • 鎖監控(InnoDB Lock Monitor):提供額外的鎖信息。
  • 表空間監控(InnoDB Tablespace Monitor):顯示共享表空間中的文件段以及表空間數據結構配置驗證。
  • 表監控(InnoDB Table Monitor):顯示內部數據字典的內容。

關於四類監控開啟與關閉方法,一言以蔽之,主要是通過創建系統可識讀的特殊表名來完成。特別地,除表空間(InnoDB Tablespace Monitor)監控和表監控(InnoDB Table Monitor)外,其他二類監控還可能通過修改系統參數來完成。
基於系統表的方式和基於系統參數的方式,只要使用二者其中一種方式開啟監控即可。

1. 標準監控(Standard InnoDB Monitor)

基於系統表:innodb_monitor

mysql會通過檢查是否存在名為innodb_monitor的數據表,來判斷是否開啟標準監控,並打印日誌。
需要開啟,則創建表;需要關閉,則刪除表。

1 2 CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_monitor;

基於系統參數:innodb_status_output

自mysql 5.6.16版本之後,可以通過設置系統參數(innodb_status_output)的方式開啟或者關閉標準監控。

1 2 set GLOBAL innodb_status_output=ON; set GLOBAL innodb_status_output=OFF;

2. 開啟鎖監控(InnoDB Lock Monitor)

基於系統表:innodb_lock_monitor

mysql會通過檢查是否存在名為innodb_lock_monitor的數據表,來判斷是否開啟鎖監控,並打印日誌。
需要開啟,則創建表;需要關閉,則刪除表。

1 2 CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_lock_monitor;

基於系統參數:innodb_status_output_locks

自mysql 5.6.16版本之後,可以通過設置系統參數(innodb_status_output_locks)的方式開啟或者關閉標準監控。

1 2 3 4 set GLOBAL innodb_status_output=ON; set GLOBAL innodb_status_output_locks=ON; set GLOBAL innodb_status_output_locks=OFF;

:前提需要開啟 innodb_status_output

3. 開啟表空間監控(InnoDB Tablespace Monitor)

基於系統表:innodb_tablespace_monitor

mysql會通過檢查是否存在名為innodb_tablespace_monitor的數據表,來判斷是否開啟表空間監控,並打印日誌。
需要開啟,則創建表;需要關閉,則刪除表。

1 2 CREATE TABLE innodb_tablespace_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_tablespace_monitor;

:表空間監控暫不支持通過參數方式配置,並且未來會被廢棄。

4. 開啟表監控(InnoDB Table Monitor)

mysql會通過檢查是否存在名為innodb_table_monitor的數據表,來判斷是否開啟表監控,並打印日誌。
需要開啟,則創建表;需要關閉,則刪除表。

1 2 CREATE TABLE innodb_table_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_table_monitor;

:表監控暫不支持通過參數方式配置,並且未來會被廢棄。

四、註意事宜

1. 監控復位

需要特別註意的一點是:mysql服務重啟後,需要重啟開啟相應監控,才會生效。換句話說,服務重啟後,之前配置的所有監控都被復位,處於關閉狀態。

基於系統表方式開啟的監控,在mysql服務重啟後,即使表存在,監控也不會生效。需要重啟drop表,再create表,才能使監控生效。

基於系統參數方式開啟的監控,在mysql服務重啟後,相關系統參數值都是OFF。需要重啟設置對應的參數,才能使用監控生效。

2. 錯誤日誌大小

不在停機或重啟情況下,mysql每15秒輸出一次INNODB運行狀態信息到錯誤日誌。
這會使用日誌變得越來越大。建議在需要的時候開啟,不需要的時候關閉掉。

3. 基於表方式將來會被廢棄

基於表方式將來會被廢棄,使用基於系統參數的方式開啟。

Use INFORMATION_SCHEMA or PERFORMANCE_SCHEMA tables or SET GLOBAL innodb_status_output=ON.

4. 基於表方式無關表結構及內容

基於表方式,mysql只檢驗表名被創建,則開啟監控。
至於,表創建到哪個數據庫、表具體的數據結構、表裏的內容都不關心,不會對監控開啟有任何影響。

5. 日誌狀態輸出時間

雖說狀態日誌是每15秒周期性輸出一次,但是由於狀態收集與輸出也會占用一些時間,特別是表空間日誌(INNODB TABLE MONITOR OUTPUT)和表日誌(INNODB TABLESPACE MONITOR OUTPUT)。因此,兩次日誌時間並不是規律的間隔15秒,而是自上次輸出後15秒加上收集輸出監控日誌的時間。

五、補充知識

1. 查看錯誤日誌輸出位置

1 2 3 4 5 6 mysql root@localhost:test> select @@log_error; +----------------------------------------+ | @@log_error | |----------------------------------------| | /usr/local/mysql/data/mysqld.local.err | +----------------------------------------+

2. 查看歷史日誌開啟狀態與輸出位置

1 2 3 4 5 6 7 mysql root@localhost:test> show VARIABLES like ‘general%‘; +------------------+---------------------------------------+ | Variable_name | Value | |------------------+---------------------------------------| | general_log | ON | | general_log_file | /usr/local/mysql/data/yerba-buena.log | +------------------+---------------------------------------+

3. 監控日誌解讀

詳見參考文檔2及參考文檔5

六、參考文檔

    1. Enabling InnoDB Monitors
    2. InnoDB Standard Monitor and Lock Monitor Output
    3. How to debug InnoDB lock waits
    4. How to find out who is locking a table in MySQL
    5. InnoDB Monitor
    6. INNODB監控開關

查看鎖信息(開啟InnoDB監控)