MySQL 日誌是資料庫可觀測性的核心支柱,涵蓋錯誤診斷、效能調優、資料恢復、主從複制等全生命週期場景。本文系統梳理六大日誌類型的配置參數、分析工具、輪轉策略與實戰技巧,構建生產級日誌管理體系。
| 日誌類型 | 預設狀態 | 核心用途 | 典型路徑 |
|---|---|---|---|
| Error Log | 開啟(寫 syslog) | 啟動/關閉錯誤、崩潰堆疊、事件調度器異常 | /var/log/mysql/error.log |
| General Query Log | 關閉 | 所有連線/查詢審計、調試 | /var/log/mysql/general.log |
| Slow Query Log | 關閉 | 超時查詢分析、索引優化 | /var/log/mysql/slow.log |
| Binary Log | 關閉 | 時間點恢復(PITR)、主從複制 | /var/log/mysql/binlog/ |
| Relay Log | 從庫自動 | 從庫複制中繼存儲 | /var/lib/mysql/relaylog/ |
| Redo/Undo Log | 引擎內部 | InnoDB 事務持久化與 MVCC | ib_logfile*, 表空間內部 |
快速檢視當前開啟的日誌:
# 通過進程檔描述符查看
lsof -p $(pidof mysqld) | grep -E '\.log$|mysql_bin'
# 或查詢系統變數
SHOW VARIABLES LIKE '%log%';
[mysqld]
log_error = /data/logs/mysql/mysql_error.log
log_warnings = 2 # 5.7+ 建議 2,記錄連線中斷等細節
# log_warnings 在 8.0 重命名為 log_error_verbosity
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/data/logs/mysql/general_debug.log';
SET GLOBAL log_output = 'FILE'; # 或 TABLE 寫入 mysql.general_log 表
[mysqld]
slow_query_log = ON
slow_query_log_file = /data/logs/mysql/slow.log
long_query_time = 1 # 1 秒閾值,線上建議 0.5-1
log_queries_not_using_indexes = ON # 記錄全表掃描
log_slow_admin_statements = ON # 記錄管理命令
log_output = FILE
min_examined_row_limit = 100 # 忽略小表掃描
| 工具 | 優勢 | 適用場景 | ||
|---|---|---|---|---|
| pt-query-digest (Percona Toolkit) | 聚合分析、Top N、執行計劃關聯、報表豐富 | 生產首選、自動化報表 | ||
| mysqldumpslow | 原生、無依賴、快速排序 | 輕量級、臨時排查 | ||
| mysqlsla | 多維度統計、圖表輸出 | 深度分析、報告生成 |
| 格式 | 記錄內容 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| STATEMENT | 原始 SQL | 體積小、易讀 | 非確定性函數導致主從不一致 | 簡單業務、跨版本複制 |
| ROW | 行變更前後值 | 絕對一致性、支援所有場景 | 大批量更新體積暴增 | 金融核心、異構複制、PITR |
| MIXED | 智能切換 | 平衡體積與安全 | 邊界情況難預測 | 通用生產環境推薦 |
# 查看 Binlog 列表與當前位置
SHOW BINARY LOGS;
SHOW MASTER STATUS;
# 解析 Binlog 內容
mysqlbinlog --base64-output=DECODE-ROWS -v /data/logs/mysql/binarylog/mysql_bin.000005
# 時間點/位置導出恢復腳本
mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 10:30:00" \
/data/logs/mysql/binarylog/mysql_bin.000005 > recovery.sql
# 遠程讀取(備份/異地分析)
mysqlbinlog -urobin -p -h192.168.1.116 -P3306 --read-from-remote-server \
--stop-datetime="2024-01-15 10:30:00" mysql_bin.000005 | gzip > remote_binlog.sql.gz
# 自動清理由 expire_logs_days 控制
# 手動清理(確認從庫已同步)
PURGE BINARY LOGS TO 'mysql_bin.000010';
PURGE BINARY LOGS BEFORE '2024-01-10 00:00:00';
# 禁用 RESET MASTER(會重置 GTID、破壞複制)
/data/logs/mysql/*.log {
daily
rotate 7
missingok
compress
delaycompress
notifempty
create 640 mysql mysql
sharedscripts
postrotate
test -x /usr/bin/mysqladmin || exit 0
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
exit 1
fi
$MYADMIN flush-logs
endscript
}
sharedscripts + flush-logs:確保多日誌輪轉只觸發一次 `FLUSH LOGS`,避免 Binlog 序號暴增delaycompress:次日壓縮,便於即時分析最新日誌建立標準化的日誌配置、分析流程與輪轉機制,是 MySQL 穩定運行與快速故障恢復的基石。將本指南落地為團隊運維規範,讓日誌真正成為資料庫的「黑盒記錄儀」。