首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 慢查詢日誌無法開啟?缺失 mysql.slow_log 表是元兇

     編輯:MySQL 綜合教學

MySQL 慢查詢日誌開啟失敗排查實錄

嘗試 SET GLOBAL slow_query_log=1 卻報錯 ERROR 1146 (42S02): Table 'mysql.slow_log' doesn't exist。根因在於 log_output=TABLE 時需該表存在,但即使輸出到 FILE,MySQL 也要求該表存在。

現象重現

SHOW GLOBAL VARIABLES LIKE '%slow%';
+---------------------+-------------------------+
| Variable_name       | Value                   |
+---------------------+-------------------------+
| log_slow_queries    | OFF                     |
| slow_query_log      | OFF                     |
| slow_query_log_file | /u01/mysql/log/slow.log |
+---------------------+-------------------------+

SET GLOBAL slow_query_log=1;
ERROR 1146 (42S02): Table 'mysql.slow_log' doesn't exist

根因分析

  • log_output 可選 FILE、TABLE、NONE。
  • 當 log_output 包含 TABLE 時,慢查詢寫入 mysql.slow_log(CSV 引擎)。
  • 關鍵點: 即使 log_output=FILE,MySQL 內部還是會檢查該表是否存在,缺表則拒絕開啟慢查詢功能。

解決方案:手動建表

SET SESSION sql_log_bin=0;  -- 避免建表操作寫入 binlog
USE mysql;
CREATE TABLE `slow_log` (
  `start_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` MEDIUMTEXT NOT NULL,
  `query_time` TIME NOT NULL,
  `lock_time` TIME NOT NULL,
  `rows_sent` INT(11) NOT NULL,
  `rows_examined` INT(11) NOT NULL,
  `db` VARCHAR(512) NOT NULL,
  `last_insert_id` INT(11) NOT NULL,
  `insert_id` INT(11) NOT NULL,
  `server_id` INT(10) UNSIGNED NOT NULL,
  `sql_text` MEDIUMTEXT NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';

驗證生效

SET GLOBAL slow_query_log=1;  -- Query OK
SELECT SLEEP(2);              -- 執行慢查詢
-- 檢查 /u01/mysql/log/slow.log 已有記錄

運維建議

  • 初始化實例時檢查 mysql.slow_log、mysql.general_log 系統表是否存在。
  • 生產環境建議 log_output=FILE,並配合 logrotate 定期切割。
  • 慢查詢分析推薦 pt-query-digest 或 mysqldumpslow。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved