慢查詢日志
MySQL的慢查詢日志是MySQL提供的一種日志記錄胰苏,它用來記錄在MySQL中響應時間超過閥值的語句中符,具體指運行時間超過long_query_time值的SQL配阵,則會被記錄到慢查詢日志中。
long_query_time的默認值為10钦勘,意思是運行10S以上的語句陋葡。該值可以指定為微秒的分辨率。對于記錄到文件彻采,寫入包括微秒部分的時間腐缤。對于記錄到表,只寫入整數(shù)倍; 微秒部分被忽略肛响。
默認情況下岭粤,不記錄管理語句,也不記錄不使用索引進行查找的查詢
默認情況下特笋,Mysql數(shù)據(jù)庫并不啟動慢查詢日志剃浇,需要我們手動來設置這個參數(shù),當然猎物,如果不是調優(yōu)需要的話虎囚,一般不建議啟動該參數(shù),因為開啟慢查詢日志會或多或少帶來一定的性能影響蔫磨。
慢查詢日志支持將日志記錄寫入文件淘讥,也支持將日志記錄寫入數(shù)據(jù)庫表。
寫入慢查詢日志的語句中的密碼將由服務器重寫质帅,而不是以純文本形式發(fā)生适揉。
常用語 SQL 語句的優(yōu)化留攒,運維人員的工作:
配置數(shù)據(jù)庫開啟 慢日志功能
配置慢日志的相關參數(shù),比如存放慢日志的具體位置嫉嘀,還有設置規(guī)定的時間
檢查慢日志文件炼邀,假如有,把語句和相關信息給到開發(fā)人員或DBA 人員剪侮。
配置參數(shù)詳解
是否開啟慢日志
屬性 | 值 |
---|---|
命令行格式 | --slow-query-log |
系統(tǒng)變量 | slow_query_log |
范圍 | 全局 |
動態(tài) | 是 |
類型 | 布爾 |
默認值 | OFF |
設置slow_query_log
為0(或OFF
)以禁用日志或設置為1(或 ON
)以啟用它
定義時間閥值
屬性 | 值 |
---|---|
命令行格式 | --long-query-time=# |
系統(tǒng)變量 | long_query_time |
范圍 | 全球 |
動態(tài) | 是 |
類型 | 數(shù)字 |
默認值 | 10 |
最低價值 | 0 |
如果查詢花費的時間超過此秒數(shù)拭宁,則服務器會遞增Slow_queries
狀態(tài)變量。如果啟用了慢查詢日志瓣俯,則查詢將記錄到慢查詢日志文件中杰标。此值是實時測量的,而不是CPU時間彩匕,因此在負載較輕的系統(tǒng)上低于閾值的查詢可能會高于嚴重負載的閾值腔剂。
設置慢日志文件名稱
屬性 | 值 |
---|---|
命令行格式 | --slow-query-log-file=file_name |
系統(tǒng)變量 | slow_query_log_file |
范圍 | 全球 |
動態(tài) | 是 |
類型 | 文件名 |
默認值 | host_name-slow.log |
如果沒有為慢查詢日志文件指定任何名稱,則默認名稱為 host_name-slow.log驼仪。除非給出絕對路徑名以指定其他目錄掸犬,否則服務器將在數(shù)據(jù)目錄中創(chuàng)建該文件。
系統(tǒng)變量 log-queries-not-using-indexes
:未使用索引的查詢也被記錄到慢查詢日志中(可選項)绪爸。如果調優(yōu)的話湾碎,建議開啟這個選項。另外奠货,開啟了這個參數(shù)介褥,其實使用full index scan的sql也會被記錄到慢查詢日志。
系統(tǒng)變量 log_slow_admin_statements
表示是否將慢管理語句例如 ANALYZE TABLE
和 ALTER TABLE
等記入慢查詢日志
Mysql 中查看慢查詢的信息
mysql> show variables like 'slow_query%';
+---------------------+---------------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/mysql-master1-slow.log |
+---------------------+---------------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec
Mysql 中配置慢日志
適用于不允許重啟服務器的情況
mysql> set global long_query_time=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)
mysql> show global variables like 'long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
另外递惋,如果你想查詢有多少條慢查詢記錄柔滔,可以使用系統(tǒng)變量。
mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 0 |
+---------------+-------+
1 row in set (0.01 sec)
開始配置
// my.cnf
[mysqld]
slow_query_log=1
long_query_time=0.5
log_queries_not_using_indexes=ON
slow_query_log_file="/var/log/mysql/mysql_slow.log"
創(chuàng)建對應的目錄并授權
shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql
處理慢日志的大小
刷新日志時丹墨,服務器會創(chuàng)建新的二進制日志文件廊遍。但是嬉愧,它只是關閉并重新打開常規(guī)和慢速查詢日志文件贩挣。
要在Unix上創(chuàng)建新文件,請在刷新之前重命名當前日志文件没酣。
shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs
您可以通過禁用日志在運行時重命名常規(guī)查詢日志或慢查詢日志:
mysql> SET GLOBAL general_log = 'OFF';
mysql> SET GLOBAL slow_query_log = 'OFF';
禁用日志后王财,在外部重命名日志文件; 例如,從命令行裕便。然后再次啟用日志:
mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL slow_query_log = 'ON';
此方法適用于任何平臺绒净,不需要重新啟動服務器