MySQL 日志是窺探資料庫內部行為的關鍵窗口,主要分四類:錯誤日志、通用查詢日志、二進制日志、慢查詢日志。本文系統梳理各日志功能、啟用配置、查看分析、輪轉清理與實戰建議。
編輯 my.cnf [mysqld] 區塊:
[mysqld] log-bin[=path/[filename]] # 啟用並指定路徑/前綴,預設 datadir/hostname-bin expire_logs_days=10 # 自動清理天數(0=不自動清理) max_binlog_size=100M # 單檔上限,超過自動滾動(4KB~1GB) sync_binlog=1 # 每次提交強制 fsync,最安全但影響效能 binlog_format=MIXED # ROW/STATEMENT/MIXED,建議 MIXED
修改後重啟 MySQL。會產生 hostname-bin.000001、hostname-bin.index(索引清單)。
SHOW BINARY LOGS; 列出所有 Binlog 檔案與大小SHOW MASTER STATUS; 當前寫入檔案與位置mysqlbinlog binlog.000001 > /tmp/binlog.txt 解析為可讀 SQLSHOW BINLOG EVENTS IN 'binlog.000006'; SQL 層面查看事件RESET MASTER; -- 刪除全部,重新從 000001 開始 PURGE MASTER LOGS TO 'binlog.000003'; -- 刪除指定檔案之前 PURGE MASTER LOGS BEFORE '2023-01-01'; -- 刪除指定日期之前
# 恢復至指定時間 mysqlbinlog --stop-datetime="2023-07-01 12:00:00" /var/lib/mysql/binlog.000008 | mysql -u root -p # 恢復指定位置區間 mysqlbinlog --start-position=12345 --stop-position=67890 /var/lib/mysql/binlog.000008 | mysql -u root -p
SET SESSION sql_log_bin=0; -- 當前會話不記錄 Binlog SET SESSION sql_log_bin=1; -- 恢復記錄
[mysqld] log-error[=path/[filename]] # 預設 datadir/hostname.err
SHOW VARIABLES LIKE 'log_error'; -- 確認路徑 # 直接用文本編輯器開啟 .err 檔案
記錄範例:InnoDB 初始化、Buffer Pool 大小、異常關閉警告、插件狀態等。
FLUSH LOGS 僅重新開啟檔案,不重命名mysqladmin -u root -p flush-logs 或 FLUSH LOGS; 重建[mysqld] log[=path/[filename]] # 預設 datadir/hostname.log
同錯誤日志:刪除檔案 → FLUSH LOGS;
[mysqld] slow_query_log=1 slow_query_log_file=path/filename # 預設 datadir/hostname-slow.log long_query_time=1 # 閾值秒數,支援微秒(如 0.1) log_queries_not_using_indexes=1 # 記錄未用索引查詢
mysqldumpslow -s t -t 10 slow.log 統計 Top 10 耗時查詢pt-query-digest 深度分析官方版本 long_query_time 最小 1 秒(舊版),需使用 Percona Server 或打 microslow-patch 達到毫秒級。
| 日誌類型 | 建議 | 理由 |
|---|---|---|
| 錯誤日誌 | 必開 | 無效能影響,故障診斷關鍵 |
| 二進制日誌 | 必開 | 主從複制、PITR 恢復依賴 |
| 慢查詢日誌 | 必開 | 效能基線、問題 SQL 發現 |
| 通用查詢日誌 | 關閉 | 高併發下嚴重拖垮效能 |
磁碟空間緊張時,可僅高峰期開啟慢查詢日誌,捕獲問題後關閉。

Redo Log (ib_logfile) 保證持久性,Undo Log 保證原子性與 MVCC,Binlog 服務複制與 PITR。三者協同構成 MySQL 事務可靠性基石。
掌握四大日誌的功能邊界、配置參數、分析工具與清理策略,是 DBA 從「會用」進階到「會診」的必經之路。建議:錯誤+二進制+慢查詢三開,通用關閉;定期 PURGE BINLOG 與 logrotate 管理磁碟空間。