mysql slowlog中querytime分析_技术分享 | Slow Query Log 使用详解
作者:宓祥康
愛可生交付服務部團隊 DBA 擅長日志分析、問題排查等;主要負責處理 MySQL 與我司自研數據庫自動化管理平臺 DMP 的日常運維問題,對數據庫及周邊技術有濃厚的學習興趣。
本文來源:原創投稿
愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
引言
什么是 Slow Query Log?
該如何使用它?
它的存在對運維數據庫有什么幫助呢?
一、 簡介
慢查詢日志,開啟它我們可以通過參數來控制其記錄執行或查詢時間長的 SQL、全表掃描的 SQL、沒有使用索引的 SQL。沒錯,它的作用就是記錄哪些糟糕的、讓數據庫變慢的 SQL,把它們揪出來。
我們一般通過如下參數來控制 slow 的開啟與記錄:slow_query_log、slow_query_log_file、long_query_time、min_examined_row_limit、log_output、log_queries_not_using_indexes、log_throttle_queries_not_using_indexes。
slow_query_log:控制 slow_query_log 是否開啟,參數 ON|OFF
slow_query_log_file:控制文件的寫入位置,參數為文件的具體位置,如:/data/slow.log
long_query_time:設置 SQL 執行時間大于等于多少秒(可精確到微秒)時記錄到日志中
min_examined_row_limit:設置檢查的行數大于等于多少行時記錄到日志中
log_output:設置慢查詢記錄到哪里,參數 FILE|TABLE
log_queries_not_using_indexes:控制查詢過程中未使用索引或全表掃描的 SQL 是否記錄到日志中
log_throttle_queries_not_using_indexes:開啟 log_queries_not_using_indexes 后,此參數會限制每分鐘可以寫入慢速查詢日志的此類查詢的數量,參數設置 0 為不限制
二、查看方式與內容分析
慢日志分析的方式有兩種,因為慢日志文件一般較小,所以一種方式為在慢日志文件中直接使用 less 或 more 命令來查看。第二種方式則是利用 MySQL 官方提供給我們的程序:mysqldumpslow 來快速查看 slowlog 日志中記錄的慢 SQL。
對于我們詳細來分析 SQL 的話,一般采用第一種方式,查找到對應時間點的對應 SQL 來進行分析。
show master status;
# Time: 2020-11-16T08:27:16.777259+08:00
# User@Host: root[root] @ [127.0.0.1] Id: 248
# Query_time: 15.293745 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
SET timestamp=1605486436;
那么如何讀懂慢日志里面對這些信息呢?
show master status #慢 SQL
Time #出現該慢 SQL 的時間
query_time # SQL 語句的查詢時間(在 MySQL 中所有類型的 SQL 語句執行的時間都叫做 query_time,而在 Oracle 中則僅指 select)
lock_time: #鎖的時間
rows_sent: #返回了多少行,如果做了聚合就不準確了
rows_examined: #執行這條 SQL 處理了多少行數據
SET timestamp #時間戳
通過這些我們就可以來明確的知道一條 SQL 究竟執行了多長時間的查詢,有沒有發生鎖等待,此查詢實際在數據庫中讀取了多少行數據了。
三、如何在線安全清空 slow.log 文件
在開啟 log_queries_not_using_indexes 后,slow log 文件不僅僅會記錄慢查詢日志,還會把查詢過程中未使用索引或全表掃描的 SQL 記錄到日志中,久而久之日志的空間便會變得越來越大,那么如何在線且安全的清空這些 slow log 日志,為磁盤釋放空間呢?
MySQL 對于慢日志的輸出方式支持兩種,TABLE 和 FILE,查看方法如下:
mysql> show variables like '%log_output%';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| log_output | FILE,TABLE |
+---------------+------------+
確認清楚輸出方式后,可以分別對不同的輸出方式選擇不同的清空方法,本次將對兩種清空方法共同介紹。
3.1 FILE 類型清空方法
查詢 slow query log 開啟狀態
mysql> show variables like '%slow_query_log%';
+---------------------+-------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /opt/mysql/data/3306/mysql-slow.log |
+---------------------+-------------------------------------+
關閉 slow query log
mysql> set global slow_query_log=0;
確認關閉成功
mysql> show variables like '%slow_query_log%';
+---------------------+-------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /opt/mysql/data/3306/mysql-slow.log |
+---------------------+-------------------------------------+
對日志進行重命名或移除
mv /opt/mysql/data/3306/mysql-slow.log /opt/mysql/data/3306/mysql-old-slow.log
重新開啟 slow query log
mysql> set global slow_query_log=1;
執行 SQL 進行驗證
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
驗證新生成文件記錄成功
cat /opt/mysql/data/3306/mysql-slow.log
[root@DMP1 3306]# cat mysql-slow.log
/opt/mysql/base/5.7.31/bin/mysqld, Version: 5.7.31-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /opt/mysql/data/3306/mysqld.sock
Time Id Command Argument
# Time: 2021-01-05T13:26:44.001647+08:00
# User@Host: root[root] @ localhost [] Id: 81786
# Query_time: 5.000397 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1609824404;
select sleep(5);
清理舊的 slowlog 文件
mv /opt/mysql/data/3306/mysql-old-slow.log /mysqlback
3.2 TABLE 類型清空方法
先關閉 slow query log
mysql> set global slow_query_log=0;
確認關閉成功
mysql> show variables like 'slow_query_log';
+---------------------+-------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------+
| slow_query_log | OFF |
+---------------------+-------------------------------------+
TABLE 類型的 slowlog 存放在 mysql.slow_log 表中,對 slow_log 進行重命名為 old_slow_log
mysql> use mysql
mysql> ALTER TABLE slow_log RENAME old_slow_log;
創建全新的 slow_log 文件拷貝原來 slow_log 文件的表結構
mysql> CREATE TABLE slow_log LIKE old_slow_log;
啟動 slow query log
mysql> SET GLOBAL slow_query_log = 1;
測試驗證
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
mysql> select * from slow_log \G
*************************** 1. row ***************************
start_time: 2021-01-05 13:49:13.864002
user_host: root[root] @ localhost []
query_time: 00:00:05.000322
lock_time: 00:00:00.000000
rows_sent: 1
rows_examined: 0
db: mysql
last_insert_id: 0
insert_id: 0
server_id: 874143039
sql_text: select sleep(5)
thread_id: 339487
刪除舊的 slow_log 表
mysql> drop table old_slow_log;
總結
該文章主要講述了 slow log 的開啟方式、分析方法與清空操作,熟練使用分析 slow log 文件可以實時觀察數據庫 SQL 的執行情況,并為 SQL 優化奠定基礎。
總結
以上是生活随笔為你收集整理的mysql slowlog中querytime分析_技术分享 | Slow Query Log 使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sharepoint文档库文档版本信息操
- 下一篇: linux mysql关闭启动不了了,l