MySQL日志系統是數據庫可靠性、可觀測性、可恢復性的基石。本文系統梳理服務器日志(錯誤、慢查詢、通用查詢)與事務日志,深度解析Binlog格式、Redo/Undo機制、InnoDB日志重用策略,為運維排查、性能調優、主從同步、數據恢復提供理論支撐。
| 類別 | 日志類型 | 作用 | 層級 |
|---|---|---|---|
| 服務器日志 | 錯誤日志 | 記錄啟動/運行關鍵事件、異常信息 | Server層 |
| 慢查詢日志 | 記錄超閾值SQL,性能分析核心依據 | Server層 | |
| 通用查詢日志 | 記錄所有SQL,診斷用,性能開銷大 | Server層 | |
| 事務日志 | Redo Log | WAL機制,保證事務持久性、崩潰恢復 | 引擎層 |
| Undo Log | 記錄舊值,支持事務回滾、MVCC多版本 | 引擎層 | |
| - | Binlog | 記錄邏輯/物理變更,主從同步、備份恢復、審計 | Server層 |
-- 配置 log_error = /var/log/mysql/error.log -- 查看 SHOW GLOBAL VARIABLES LIKE 'log_error'; -- 實時監控 tail -f /var/log/mysql/error.log
-- 核心參數 slow_query_log = 1 -- 啟用 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 -- 閾值(秒),建議1-2秒 log_queries_not_using_indexes = 1 -- 記錄未用索引查詢(可選) -- 動態調整 SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; -- 查看狀態 SHOW GLOBAL VARIABLES LIKE '%slow%';
pt-query-digest、mysqldumpslow分析general_log = 1 general_log_file = /var/log/mysql/general.log
log_output = FILE|TABLE|NONE-- 輸出目標 log_output = FILE -- 默認文件;TABLE寫mysql.general_log/slow_log表;NONE不輸出 -- 手動輪轉(文件過大時) FLUSH LOGS; -- 關閉舊文件,開啟新文件 -- 自動輪轉需配合logrotate或腳本
採用固定大小的多組文件循環覆蓋(默認2個ib_logfile0/1,每48MB)。

關鍵指標:
innodb_log_file_size:單文件大小,建議1-4GBinnodb_log_files_in_group:文件組數,通常2-4兩種邊界情況:

優化建議: 高寫入業務調大innodb_log_file_size(如2-4GB),延長檢查點週期,減少阻塞概率,提升並發寫入吞吐。
innodb_undo_tablespaces)-- 啟用 (靜態參數,需重啟) log_bin = /data/mysql/binlog/mysql-bin # 或 log_bin = 1 (數據目錄下) -- Session級控制 sql_log_bin = 1 -- 當前會話是否記錄 -- 持久化策略 (關鍵!) sync_binlog = 1 -- 每次提交fsync,最安全,性能損耗~25% # sync_binlog = 0 依賴OS刷盤,性能最好,崩潰丟數據 # sync_binlog = N 每N次提交fsync -- 文件管理 max_binlog_size = 100M -- 單文件上限 expire_logs_days = 7 -- 自動過期清理(天) binlog_expire_logs_seconds -- 5.7+ 秒級過期
| 格式 | 記錄內容 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| STATEMENT | 原始SQL語句 | 文件小、解析易、兼容性好 | 非確定函數(UID/NOW)導致主從不一致;某些語句並發復制不安全 | 簡單業務、兼容老版本 |
| ROW | 每行數據變更(前後映像) | 完全確定、並發安全、支持所有場景 | 文件大、無法直接看到SQL、大事務膨脹嚴重 | 核心業務、高並發、異構同步 |
| MIXED (推薦) | 自動判斷:確定性用STATEMENT,其餘用ROW | 平衡文件大小與安全性 | 行為不可預測、調試稍複雜 | 生產環境默認選擇 |
關鍵參數: binlog_format = ROW|STATEMENT|MIXED(動態可調)
-- SQL方式 SHOW BINARY LOGS; SHOW BINLOG EVENTS IN 'mysql-bin.000011' FROM 60 LIMIT 3; -- mysqlbinlog工具 (推薦) mysqlbinlog --base64-output=decode-rows -v /var/log/mysql/mysql-bin.000001 # --start-datetime/--stop-datetime 按時間範圍 # --start-position/--stop-position 按位置範圍 -- ROW格式必加 --base64-output=decode-rows -v 才可讀
-- 手動清理 (謹慎!確認從庫已同步) PURGE BINARY LOGS TO 'mysql-bin.000009'; PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00'; -- 避免誤刪:expire_logs_days 自動清理更安全
STATEMENT格式陷阱: INSERT INTO t VALUES(UUID()) → Binlog記錄UUID()函數調用 → 回放時每次生成不同值 → 主從數據不一致。
解決: 使用binlog_format = ROW,記錄實際生成的UUID值,回放幂等。
| 日志 | 層級 | 核心職責 | 關鍵參數 | 運維重點 |
|---|---|---|---|---|
| Error Log | Server | 異常診斷、啟動排查 | log_error | 首選排查入口 |
| Slow Log | Server | 性能分析、SQL優化 | slow_query_log, long_query_time | 常開、定期分析 |
| General Log | Server | 全量審計、行為追蹤 | general_log, log_output | 臨時開啟、勿長期 |
| Redo Log | Engine | 崩潰恢復、持久性保證 | innodb_log_file_size, innodb_flush_log_at_trx_commit | 調大文件、設flush=1 |
| Undo Log | Engine | 事務回滾、MVCC版本鏈 | innodb_undo_tablespaces, innodb_max_undo_log_size | 監控Undo表空間增長 |
| Binlog | Server | 主從同步、備份恢復、數據分發 | log_bin, binlog_format, sync_binlog, expire_logs_days | ROW格式、sync=1、足夠保留天數 |
理解各日志定位、交互與配置權衡,是DBA從「會用」進階到「精通」的必經之路。生產環境建議:Error/Slow/Binlog常開,General臨時開,Redo/Undo參數調優,建立日志歸檔與告警機制。