日誌是資料庫運行的「黑盒子」,記錄了服務器啟動、查詢、錯誤、變更等關鍵資訊。MySQL 提供六種類型的日誌,各有專門用途:
| 日誌類型 | 功能 | 典型應用場景 |
|---|---|---|
| 錯誤日誌 | 記錄啟動/關閉/運行錯誤與警告 | 故障診斷、服務器健康檢查 |
| 一般查詢日誌 | 記錄客戶端連接與執行的語句 | 審計、問題 SQL 追蹤(生產環境建議關閉) |
| 慢查詢日誌 | 記錄執行超時或未用索引的查詢 | 性能調優、索引優化 |
| 二進制日誌 | 記錄所有數據變更操作 | 主從複制、時間點恢復(PITR) |
| 中繼日誌 | 從庫複製主庫 binlog 後的本地存儲 | 複制架構中的從庫端 |
| 事務日誌 | InnoDB 等事務引擎的重做/撤銷日誌 | ACID 保證、崩潰恢復 |
由 log_error 指定路徑,log_warnings 控制警告級別。關鍵特性:
FLUSH LOGS 會重命名舊日誌(加 -old 後綴)並建立新檔案控制變量:
general_log = {ON|OFF} 啟用開關general_log_file 指定檔案路徑log_output = {TABLE|FILE|NONE} 輸出目標注意:高併發環境下開啟會嚴重影響 I/O 性能,生產環境通常保持關閉。
核心配置:
slow_query_log = ON
long_query_time = 2 # 閾值(秒),建議設 1-2 秒
log_queries_not_using_indexes = ON
slow_query_log_file = /var/log/mysql/slow.log
配合 mysqldumpslow 或 pt-query-digest 分析工具可快速定位性能瓶頸。
啟用方式:log-bin = /path/to/binlog(5.6+ 必須顯式指定)
| 格式 | 特點 | 適用場景 |
|---|---|---|
| STATEMENT | 記錄 SQL 語句 | 兼容性好,但某些非確定性函數可能導致主從不一致 |
| ROW | 記錄行級變更 | 數據一致性最高,日誌體積較大 |
| MIXED | 智能切換 | 推薦預設值,平衡性能與一致性 |
-- 查看當前 binlog 狀態
SHOW MASTER STATUS;
-- 列出所有 binlog 檔案
SHOW BINARY LOGS;
-- 手動滾動日誌
FLUSH LOGS;
-- 查看特定 binlog 事件
SHOW BINLOG EVENTS IN 'mysql-bin.000033' FROM 407;
-- 刪除指定序號前的日誌(慎用!)
PURGE BINARY LOGS TO 'mysql-bin.000025';
-- 使用 mysqlbinlog 工具解析
mysqlbinlog --start-position=407 --stop-position=556 mysql-bin.000033
max_binlog_size = 1G:單檔大小上限expire_logs_days = 7:自動清理天數(避免磁盤爆滿)sync_binlog = 1:每次事務提交同步刷盤,最安全但性能稍損binlog_format = MIXED:推薦格式從庫專用,對應參數:relay_log、relay_log_index、relay_log_purge = ON 自動清理。
InnoDB 核心參數 innodb_flush_log_at_trx_commit:
| 值 | 行為 | 安全性 | 性能 |
|---|---|---|---|
| 0 | 每秒同步刷盤 | 可能丟失 1 秒事務 | 最佳 |
| 1 | 每事務同步刷盤 | 完全 ACID | 標準 |
| 2 | 每事務寫入 OS 緩衝,由 OS 決定刷盤 | 僅 OS 崩潰丟失 | 較好 |
使用 SHOW GLOBAL VARIABLES LIKE '%log%'; 可查看所有 41 個日誌相關變量。重點關注:
log_output、log_error、log_warningsslow_query_log、long_query_timelog_bin、binlog_format、expire_logs_days、sync_binloginnodb_flush_log_at_trx_commit、innodb_log_file_sizeexpire_logs_days 防止磁盤耗盡Seconds_Behind_Master、錯誤日誌關鍵字、慢查詢增長趨勢