嘗試 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。