概述
很多時候在MySQL處理死鎖問題時,由于show engine innodb status輸出來的死鎖日志無任務事務上下文,并不能很好地診斷相關事務所持有的所有鎖信息,包括:鎖個數、鎖類型等。
下面介紹如何開啟鎖監控來查看到更詳細的事務鎖占用情況。
1、INNODB監控機制(InnoDB Monitors)
mysql提供一套INNODB監控機制,用于周期性(每15鈔)輸出INNODB運行相關狀態(INNODB運行狀態、表空間狀態、表狀態等)到mysqld服務標準錯誤輸出。另外,INNODB標準監控和鎖監控,也可以通過命令:show engine innodb status輸出到控制臺。
此部分內容一般輸出到mysql error log里。
官方說明:
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運行狀態信息到錯誤日志,會使用日志變得特別大。
2、開啟狀態監控
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)外,其他二類監控還可能通過修改系統參數來完成。
基于系統表的方式和基于系統參數的方式,只要使用二者其中一種方式開啟監控即可。
2.1. 標準監控(Standard InnoDB Monitor)
2.1.1、基于系統表:innodb_monitor
mysql會通過檢查是否存在名為innodb_monitor的數據表,來判斷是否開啟標準監控,并打印日志。
需要開啟,則創建表;需要關閉,則刪除表。
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_monitor;
2.1.2、基于系統參數:innodb_status_output
自mysql 5.6.16版本之后,可以通過設置系統參數(innodb_status_output)的方式開啟或者關閉標準監控。
set GLOBAL innodb_status_output=ON; set GLOBAL innodb_status_output=OFF;
2.2. 開啟鎖監控(InnoDB Lock Monitor)
2.2.1、基于系統表:innodb_lock_monitor
mysql會通過檢查是否存在名為innodb_lock_monitor的數據表,來判斷是否開啟鎖監控,并打印日志。
需要開啟,則創建表;需要關閉,則刪除表。
CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_lock_monitor;
2.2.2、基于系統參數:innodb_status_output_locks
自mysql 5.6.16版本之后,可以通過設置系統參數(innodb_status_output_locks)的方式開啟或者關閉標準監控。
--前提需要開啟 innodb_status_output set GLOBAL innodb_status_output=ON; set GLOBAL innodb_status_output_locks=ON; set GLOBAL innodb_status_output_locks=OFF;
2.3. 開啟表空間監控(InnoDB Tablespace Monitor)
基于系統表:innodb_tablespace_monitor
mysql會通過檢查是否存在名為innodb_tablespace_monitor的數據表,來判斷是否開啟表空間監控,并打印日志。
需要開啟,則創建表;需要關閉,則刪除表。
CREATE TABLE innodb_tablespace_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_tablespace_monitor;
注:表空間監控暫不支持通過參數方式配置,并且未來會被廢棄。
2.4. 開啟表監控(InnoDB Table Monitor)
mysql會通過檢查是否存在名為innodb_table_monitor的數據表,來判斷是否開啟表監控,并打印日志。
需要開啟,則創建表;需要關閉,則刪除表。
CREATE TABLE innodb_table_monitor (a INT) ENGINE=INNODB; DROP TABLE innodb_table_monitor;
注:表監控暫不支持通過參數方式配置,并且未來會被廢棄。
3、注意事宜
3.1. 監控復位
需要特別注意的一點是:mysql服務重啟后,需要重啟開啟相應監控,才會生效。換句話說,服務重啟后,之前配置的所有監控都被復位,處于關閉狀態。
基于系統表方式開啟的監控,在mysql服務重啟后,即使表存在,監控也不會生效。需要重啟drop表,再create表,才能使監控生效。
基于系統參數方式開啟的監控,在mysql服務重啟后,相關系統參數值都是OFF。需要重啟設置對應的參數,才能使用監控生效。
3.2. 錯誤日志大小
不在停機或重啟情況下,mysql每15秒輸出一次INNODB運行狀態信息到錯誤日志。
這會使用日志變得越來越大。建議在需要的時候開啟,不需要的時候關閉掉。