MySQL慢查詢?nèi)罩緎lowlog的具體使用
0 慢查詢?nèi)罩径x
慢速查詢?nèi)罩居涗浀氖菆?zhí)行時(shí)間超過(guò)long_query_time秒和檢查的行數(shù)超過(guò)min_examined_row_limit的SQL語(yǔ)句,這些語(yǔ)句通常是需要進(jìn)行優(yōu)化的。
官方參考文檔:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html
1 慢查詢?nèi)罩镜呐渲脜?shù)
服務(wù)器使用以下順序的控制參數(shù)來(lái)決定是否將查詢語(yǔ)句寫(xiě)入慢查詢?nèi)罩荆?/p>
- 查詢必須不是管理語(yǔ)句(如alter、optimize table等),或者必須啟用log_slow_admin_statements參數(shù)記錄管理類(lèi)語(yǔ)句;
- 查詢必須至少花費(fèi)了long_query_time秒,或者必須啟用log_queries_not_using_indexes,并且查詢的索引沒(méi)有行限制(如全表掃描、索引全掃描等);
- 查詢必須至少檢索了min_examined_row_limit行;
- 不被參數(shù)log_throttle_queries_not_using_indexes設(shè)置閾值限制寫(xiě)入慢sql日志。
下面介紹這些參數(shù):
一、long_query_time
規(guī)定了查詢時(shí)間超過(guò)此參數(shù)值被定義為慢SQL,狀態(tài)變量Slow_queries記錄了慢查詢SQL的數(shù)量。long_query_time的單位為秒,可以設(shè)置成小數(shù),精確到微妙。最小值為0,最大值為31536000,即365天,默認(rèn)值為10。
查看當(dāng)前設(shè)置:
mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.01 sec)
查看慢sql數(shù)量:
mysql> show status like 'slow_queries'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Slow_queries | 5 | +---------------+-------+ 1 row in set (0.01 sec)
將此參數(shù)設(shè)置為5:
mysql> set global long_query_time=5; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 5.000000 | +-----------------+----------+ 1 row in set (0.00 sec)
二、slow_query_log
此參數(shù)決定是否激活慢sql日志,默認(rèn)值是off,即關(guān)閉。
啟用慢查詢?nèi)罩荆?/p>
mysql> set global slow_query_log=on; Query OK, 0 rows affected (0.00 sec)
三、slow_query_log_file
此參數(shù)指定慢sql日志的文件路徑和文件名,默認(rèn)位置在數(shù)據(jù)目錄datadir中,默認(rèn)文件名是hostname-slow.log。
mysql> show variables like 'slow_query_log_file'; +---------------------+-------------------------------+ | Variable_name | Value | +---------------------+-------------------------------+ | slow_query_log_file | /disk1/data/mysql001-slow.log | +---------------------+-------------------------------+ 1 row in set (0.00 sec)
查看慢sql日志文件:
[mysql@mysql001 log]$ tailf /disk1/data/mysql001-slow.log
/usr/sbin/mysqld, Version: 8.0.34 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 2023-12-20T22:44:21.890879+08:00
# User@Host: root[root] @ localhost [] Id: 9
# Query_time: 0.009038 Lock_time: 0.000008 Rows_sent: 0 Rows_examined: 0 Thread_id: 9 Errno: 0 Killed: 0 Bytes_received: 286 Bytes_sent: 92 Read_first: 0 Read_last: 0 Read_key: 12 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 1 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 1 Created_tmp_disk_tables: 0 Created_tmp_tables: 1 Start: 2023-12-20T22:44:21.881841+08:00 End: 2023-12-20T22:44:21.890879+08:00
SET timestamp=1703083461;
select f.title, count(*) as cnt
from sakila.rental r
join sakila.inventory i
on r.inventory_id = i.inventory_id
join sakila.film f
on i.film_id = f.film_id
where r.rental_date between '2005-03-01' and '2005-03-31'
group by f.film_id
order by cnt desc
limit 10;
四、log_queries_not_using_indexes
啟用該變量,會(huì)記錄期望檢索所有行的查詢語(yǔ)句,也就是說(shuō)做表全掃描。使用索引的查詢也會(huì)被記錄。例如,使用完整索引掃描的查詢使用索引,但會(huì)記錄日志,因?yàn)樗饕粫?huì)限制行數(shù)。默認(rèn)值是false。
五、min_examined_row_limit
參數(shù)規(guī)定了只有當(dāng)檢索的行數(shù)超過(guò)了參數(shù)值的sql語(yǔ)句才會(huì)被記錄到慢sql日志文件中,默認(rèn)值是0,沒(méi)有限制??梢院蜕弦粋€(gè)參數(shù)log_queries_not_using_indexes搭配使用,可以避免記錄一些訪問(wèn)小表的查詢。
六、log_throttle_queries_not_using_indexes
該參數(shù)限制每分鐘記錄到慢查詢?nèi)罩局械牟樵冋Z(yǔ)句數(shù)量,默認(rèn)值是0,不限制。
七、log_slow_extra
參數(shù)log_slow_extra從MySQL 8.0.14開(kāi)始可用,當(dāng)啟用時(shí),將記錄與慢sql相關(guān)的額外信息,如狀態(tài)參數(shù)Handler_%。參數(shù)默認(rèn)值為off,建議打開(kāi),將參數(shù)設(shè)置為on。
mysql> set global log_slow_extra=on; Query OK, 0 rows affected (0.00 sec)
2 使用mysqldumpslow解釋慢查詢?nèi)罩?/h2>
MySQL慢速查詢?nèi)罩景瑘?zhí)行時(shí)間較長(zhǎng)的查詢信息,且包含的記錄較多時(shí),看起來(lái)比較困難??梢允褂胢ysqldumpslow解析MySQL慢速查詢?nèi)罩疚募?,并總結(jié)日志內(nèi)容。
一、摘要分析
mysqldumpslow會(huì)對(duì)查詢進(jìn)行摘要分析,8.0版本新添的兩個(gè)分析摘要函數(shù)如下:
- statement_digest_text():返回摘要文本;
- statement_digest():返回摘要hashvalue。
用法如下:
mysql> select statement_digest_text("select user(),host from mysql.user where user = 'lu9up'");
+----------------------------------------------------------------------------------+
| statement_digest_text("select user(),host from mysql.user where user = 'lu9up'") |
+----------------------------------------------------------------------------------+
| SELECT SYSTEM_USER ( ) , HOST FROM `mysql` . `user` WHERE SYSTEM_USER = ? |
+----------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select statement_digest("select user(),host from mysql.user where user = 'lu9up'");
+-----------------------------------------------------------------------------+
| statement_digest("select user(),host from mysql.user where user = 'lu9up'") |
+-----------------------------------------------------------------------------+
| 12984e6ff7cbdbd28e2a377375af873fcd606891f82c670a74c04db83f7ac09c |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)
二、mysqldumpslow操作
調(diào)用語(yǔ)法:
mysqldumpslow [options] [log_file ...]
options:

-s指定排序方式,默認(rèn)是at,根據(jù)平均時(shí)間排序,共有七種排序方式:

mysqldumpslow操作示例:
使用mysqldumpslow對(duì)慢查詢?nèi)罩疚募M(jìn)行分析,輸出平均執(zhí)行時(shí)間最久的兩條查詢:
[mysql@mysql001 ~]$ mysqldumpslow -s at -t 2 /disk1/data/mysql001-slow.log Reading mysql slow query log from /disk1/data/mysql001-slow.log Count: 1 Time=0.01s (0s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost select f.title, count(*) as cnt from sakila.rental r join sakila.inventory i on r.inventory_id = i.inventory_id join sakila.film f on i.film_id = f.film_id where r.rental_date between 'S' and 'S' group by f.film_id order by cnt desc limit N Count: 8 Time=0.00s (0s) Lock=0.00s (0s) Rows=4.9 (39), root[root]@localhost show variables like 'S'
3 使用pt-query-digest解析慢查詢?nèi)罩?/h2>
pt-query-digest是Percona Toolkit的一個(gè)工具,用于分析MySQL的慢查詢?nèi)罩疚募?、通用查詢?nèi)罩疚募投M(jìn)制日志文件中的查詢,也可以分析SHOW PROCESSLIST命令輸出的結(jié)果和tcpdump抓取的MySQL協(xié)議數(shù)據(jù)(如:網(wǎng)絡(luò)流量包)。默認(rèn)情況下,對(duì)所有分析的查詢按摘要分組,分析結(jié)果按查詢時(shí)間降序輸出。
官方參考文檔:https://docs.percona.com/percona-toolkit/pt-query-digest.html
3.1 安裝pt-query-digest
一、下載Percona Toolkit:
[mysql@mysql001 ~]$ wget percona.com/get/pt-query-digest
二、賦權(quán)
[mysql@mysql001 ~]$ chmod +775 pt-query-digest
完成賦權(quán)后就可以正常使用了。
3.2 語(yǔ)法和選項(xiàng)
語(yǔ)法:
pt-query-digest [OPTIONS] [FILES] [DSN]
選項(xiàng):
| optition name | comment |
|---|---|
| –ask-pass | 連接MySQL時(shí)提示輸入密碼。 |
| –continue-on-error | 即使出現(xiàn)錯(cuò)誤,也要繼續(xù)解析,默認(rèn)值時(shí)yes。該工具不會(huì)永遠(yuǎn)繼續(xù):一旦任何進(jìn)程導(dǎo)致100個(gè)錯(cuò)誤,它就會(huì)停止。 |
| –create-review-table | 使用–review選項(xiàng)將分析結(jié)果輸出到表中時(shí),如果表不存在,創(chuàng)建它,默認(rèn)值是yes。 |
| –create-history-table | 使用–history選項(xiàng)將分析結(jié)果輸出到表中時(shí),如果表不存在,創(chuàng)建它,默認(rèn)值是yes。 |
| –defaults-file | 指定mysql的參數(shù)文件名,必須給出一個(gè)絕對(duì)路徑名。 |
| –explain | 使用此DSN對(duì)示例查詢運(yùn)行EXPLAIN并打印結(jié)果。 |
| –filter | 該選項(xiàng)是一個(gè)Perl代碼字符串或包含Perl代碼的文件,使用此參數(shù)對(duì)要分析的文件進(jìn)行過(guò)濾后再分析,將不符合Perl代碼的時(shí)間全部忽略。 |
| –review | 保存分析結(jié)果到表中,有重復(fù)的查詢?cè)诒碇袝r(shí),不會(huì)再記錄。只保存分析過(guò)的sql語(yǔ)句,不包含分析結(jié)果。 |
| –history | 保存分析結(jié)果到表中,有重復(fù)的查詢?cè)诒碇袝r(shí),也會(huì)記錄,但時(shí)間不一樣。與review不同,不僅保存分析的sql語(yǔ)句,也包含分析結(jié)果。 |
| –limit | 將輸出限制為給定的百分比或SQL語(yǔ)句數(shù)量。 |
| –max-line-length | 把輸出行的長(zhǎng)度修剪到這個(gè)長(zhǎng)度,0表示不裁剪。 |
| –order-by | 按此屬性和聚合函數(shù)對(duì)事件進(jìn)行排序,默認(rèn)為Query_time:sum。 |
| –output | 指定分析結(jié)果的輸出格式。 |
| –since | 指定分析從什么時(shí)間開(kāi)始的sql語(yǔ)句。 |
| –until | 指定分析的sql語(yǔ)句的截至?xí)r間。 |
| –type | 指定日志文件的類(lèi)型,可以是genlog、binlog、slowlog、tcpdump、rawlog等。 |
選項(xiàng)的具體使用細(xì)則參考官方文檔:https://docs.percona.com/percona-toolkit/pt-query-digest.html#options
3.3 用法示例
1)直接分析慢查詢文件
[mysql@mysql001 output]$ pt-query-digest /disk1/data/mysql001-slow.log > slow`date +"%Y%m%d"`.log [mysql@mysql001 output]$ ll total 20 -rw-rw-r-- 1 mysql mysql 17819 Dec 20 22:51 slow20231220.log
2)分析網(wǎng)絡(luò)流量包
從3306端口抓取1000個(gè)流量包輸出到文件mysql.tcp.txt:
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
分析抓取的網(wǎng)路流量包:
pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log
3)分析pocesslist的輸出
pt-query-digest --processlist h = host1
4)保存分析過(guò)的sql語(yǔ)句到表中
pt-query-digest --review h=192.168.131.99 --no-report mysql001-slow.log
默認(rèn)保存的表是percona_schema.query_review。
5)保存分析結(jié)果到表中
pt-query-digest --history h=192.168.131.99 --no-report mysql001-slow.log
默認(rèn)保存的表是percona_schema.query_history。
到此這篇關(guān)于MySQL慢查詢?nèi)罩緎lowlog的具體使用的文章就介紹到這了,更多相關(guān)MySQL慢查詢?nèi)罩緎lowlog內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql中大小寫(xiě)敏感問(wèn)題導(dǎo)致的MySql Error 1146 Tabel doen’t exist錯(cuò)誤
這篇文章主要介紹了Mysql中大小寫(xiě)敏感問(wèn)題導(dǎo)致的MySql Error 1146 Tabel doen’t exist錯(cuò)誤,需要的朋友可以參考下2014-10-10
解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
mysql命令行中執(zhí)行sql的幾種方式總結(jié)
下面小編就為大家?guī)?lái)一篇mysql命令行中執(zhí)行sql的幾種方式總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
解決MySQL主從數(shù)據(jù)庫(kù)沒(méi)有同步的兩種方法
這篇文章主要介紹了解決MySQL主從數(shù)據(jù)庫(kù)沒(méi)有同步的兩種方法,需要的朋友可以參考下面文章內(nèi)容2021-09-09
mysql中使用sql命令將時(shí)間戳解析成datetime類(lèi)型存入
這篇文章主要介紹了mysql中使用sql命令將時(shí)間戳解析成datetime類(lèi)型存入,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Mysql實(shí)現(xiàn)企業(yè)級(jí)日志管理、備份與恢復(fù)的實(shí)戰(zhàn)教程
下面小編就為大家分享一篇Mysql實(shí)現(xiàn)企業(yè)級(jí)日志管理、備份與恢復(fù)的實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
關(guān)于mysql調(diào)用新手們常犯的11個(gè)錯(cuò)誤總結(jié)
對(duì)于很多新手們來(lái)說(shuō),使用PHP可以在短短幾個(gè)小時(shí)之內(nèi)輕松地寫(xiě)出具有特定功能的代碼。但是,構(gòu)建一個(gè)穩(wěn)定可靠的數(shù)據(jù)庫(kù)卻需要花上一些時(shí)日和相關(guān)技能。下面這篇文章就來(lái)總結(jié)了關(guān)于mysql調(diào)用新手們常犯的十一個(gè)錯(cuò)誤,需要的朋友可以參考學(xué)習(xí)。2017-03-03
mysql累加計(jì)算實(shí)現(xiàn)方法詳解
這篇文章主要介紹了mysql累加計(jì)算實(shí)現(xiàn)方法,結(jié)合實(shí)例形勢(shì)分析了mysql累加計(jì)算原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
MySQL數(shù)據(jù)庫(kù)創(chuàng)建新用戶及授予權(quán)限的完整流程
這篇文章主要給大家介紹了MySQL數(shù)據(jù)庫(kù)創(chuàng)建新用戶及授予權(quán)限的完整流程,通過(guò)這些步驟,管理員可以有效管理數(shù)據(jù)庫(kù)用戶,確保數(shù)據(jù)庫(kù)的安全性和高效運(yùn)行,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11

