MySQL 多種日誌記錄了資料庫運行狀態、查詢詳情、變更歷史,是故障排查、性能調優、數據恢復、審計合規的核心依據。本文系統整理四大日誌類型的啟用配置、查看方法、分析工具與實戰技巧。
| 日誌類型 | 參數 | 用途 | 典型場景 |
|---|---|---|---|
| 錯誤日誌 | --log-error | 啟動/關閉、崩潰、啟動失敗、關鍵錯誤 | 故障排查、告警監控 |
| 通用查詢日誌 | --log / -l | 所有連線/查詢/斷開(含失敗語句) | 審計、問題複現、開發調試 |
| 慢查詢日誌 | --log-slow-queries / slow_query_log | 超過 long_query_time 的查詢 | 性能調優、索引優化 |
| 二進制日誌 | --log-bin | 所有數據變更(DML/DDL),基於語句/行/混合格式 | 主從複製、時間點恢復、審計 |
[mysqld]
# 錯誤日誌(預設開啟,建議顯式指定路徑)
log-error = /var/log/mysql/error.log
# 通用查詢日誌(生產環境慎開,極大IO開銷)
general_log = 1
general_log_file = /var/log/mysql/general.log
# 慢查詢日誌(生產環境建議開啟)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # 超過 2 秒記錄
log_queries_not_using_indexes = 1 # 記錄未用索引查詢
min_examined_row_limit = 100 # 忽略掃描行數少的查詢
# 二進制日誌(主庫必開,從庫建議開)
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW # ROW 格式最安全
expire_logs_days = 7 # 自動清理 7 天前
max_binlog_size = 100M # 單文件大小觸發輪轉
sync_binlog = 1 # 每次提交刷盤,最安全
SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;
-- 查看所有日誌相關變量
SHOW VARIABLES LIKE 'log_%';
-- 查看二進制日誌狀態
SHOW MASTER STATUS;
-- File, Position, Binlog_Do_DB, Binlog_Ignore_DB, Executed_Gtid_Set
-- 列出所有 Binlog 文件
SHOW MASTER LOGS;
-- 或
SHOW BINARY LOGS;
# 查看指定文件
mysqlbinlog /var/log/mysql/mysql-bin.000001
# 查看尾部
mysqlbinlog /var/log/mysql/mysql-bin.000001 | tail
# 導出為 SQL 文件
mysqlbinlog /var/log/mysql/mysql-bin.000001 > /tmp/binlog.sql
# 指定時間範圍導出(時間點恢復關鍵)
mysqlbinlog --start-datetime='2024-01-15 10:00:00' --stop-datetime='2024-01-15 11:00:00' \
/var/log/mysql/mysql-bin.000001 > /tmp/recovery.sql
# 錯誤:unknown variable 'default-character-set=utf8'
# 原因:my.cnf [client] 組有 default-character-set,mysqlbinlog 不支援
# 解決 1:註釋掉該行
# 解決 2:執行時加 --no-defaults
mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001 | tail
# at 4
#100830 16:30:55 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0.67
ROLLBACK;
# at 1234
#240115 14:30:00 server id 1 end_log_pos 2345 Table_map: `db`.`t` mapped to number 100
# at 2345
#240115 14:30:01 server id 1 end_log_pos 3456 Write_rows: table id 100 flags: STMT_END_F
Table_map:表映射事件(ROW 格式必有)Write_rows/Update_rows/Delete_rows:行變更事件Query:語句事件(STATEMENT/MIXED 格式)Xid:事務提交標記mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
# -s t: 按時間排序, -t 10: Top 10
pt-query-digest /var/log/mysql/slow.log --limit 20 --filter '$event->{fingerprint} !~ /^SET/'
# 輸出:執行次數、總時間、平均時間、掃描行數、索引使用、樣本 SQL、EXPLAIN 計劃
sys.schema_table_statistics:系統表級統計# 手動刷新(生成新文件)
FLUSH LOGS;
FLUSH SLOW LOGS;
FLUSH GENERAL LOGS;
FLUSH ERROR LOGS; -- 5.7+ 支援
# 自動清理:二進制日誌靠 expire_logs_days / binlog_expire_logs_seconds (8.0)
# 通用/慢查詢/錯誤日誌需配置 logrotate
# /etc/logrotate.d/mysql
/var/log/mysql/*.log {
daily
rotate 7
compress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
mysqladmin flush-logs > /dev/null 2>&1 || true
endscript
}
long_query_time=1 或更低,log_queries_not_using_indexes=ON 初期開啟ROW 格式,從庫建議開啟支援級聯/恢復SET GLOBAL general_log=ON),用完即關/var/log/mysql/ 獨立分區/卷,防止寫滿根分區mysql:mysql、640,防敏感信息洩露建立完善的日誌體系,配合自動化分析與告警,讓資料庫「可觀測、可追溯、可恢復」,是穩定運行的基石。