首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

利用 MySQL 通用查詢日志定位高頻 SQL:開啟、分析與清理全攻略

     編輯:MySQL 資料庫相關知識

通用查詢日志記錄所有 SQL 語句,是排查「最常執行語句」「應用行為異常」的利器,但會產生海量日志、影響性能。本文演示動態開啟、輸出到文件/表、Python 腳本統計 Top SQL、日志輪轉清理的完整操作鏈路。

動態開啟 General Log(無需重啟)

-- 5.6+ 支援運行時修改
SET GLOBAL general_log = ON;
SET GLOBAL log_output = 'FILE';          -- 或 'TABLE'、'FILE,TABLE'
SET GLOBAL general_log_file = '/tmp/general.log';

驗證:

tail -f /tmp/general.log
# 輸出示例
140814 10:56:44 3 Query SELECT * FROM mysql.general_log

輸出到系統表 mysql.general_log

SET GLOBAL log_output = 'TABLE';
SELECT * FROM mysql.general_log \G;
-- 欄位:event_time, user_host, thread_id, server_id, command_type, argument

提取高頻 SQL:Python + Shell 一體化

# analysis-general-log.py 核心邏輯:提取 argument 欄位,去除參數值歸一化
python analysis-general-log.py general.log | sort | uniq -c | sort -nr

輸出 Top 20 示例:

1032 SELECT * FROM wp_comments WHERE (comment_approved = 'x' OR ...) AND comment_post_ID = x ORDER BY comment_date_gmt DESC
 653 SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id in (x) ORDER BY meta_id ASC
 527 SELECT FOUND_ROWS()
 438 SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ...

General Log 清理策略(不停庫)

USE mysql;
CREATE TABLE gn2 LIKE general_log;
RENAME TABLE general_log TO oldLogs, gn2 TO general_log;
-- oldLogs 可備份後 DROP

文件模式下:

mv /tmp/general.log /tmp/general.log.$(date +%F)
mysqladmin flush-logs  # 重新打開文件句柄

性能影響與生產建議

  • General Log 會同步寫入每條 SQL,**嚴禁長期開啟於高併發主庫**。
  • 排查時建議:從庫開啟、限制時間窗口(如 10 分鐘)、配合 log_output=TABLE 便於 SQL 查詢分析。
  • 長期審計請使用 MariaDB Audit Plugin、Percona Audit Log Plugin 或 **ProxySQL 查詢審計**,性能開銷可控。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved