日誌是資料庫可觀測性的基石,但不當配置會佔滿磁碟、拖慢效能。本文匯總五大日誌類型的生產級啟用策略、關鍵參數調優、歸檔清理與監控建議。
| 日誌 | 內容 | 生產建議 |
|---|---|---|
| 錯誤日誌 | 啟動/異常/關閉錯誤堆疊 | 永久開啟,預設即開 |
| 通用查詢日誌 | 所有連接與 SQL 語句 | 僅排錯短時開啟,平時關閉 |
| 二進制日誌 | 所有資料變更事件 | 主庫必開,支援復制與 PITR |
| 慢查詢日誌 | 超時/無索引查詢 | 永久開啟,閾值 1-2 秒 |
| 事務日誌 | InnoDB redo/undo log | 引擎內部管理,關注 innodb_log_file_size |
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
log_output = FILE
mysqldumpslow -s t /var/log/mysql/slow.log、pt-query-digest。-- 動態開啟(排錯時)
SET GLOBAL general_log = 1;
-- 查看
SHOW VARIABLES LIKE 'general_log%';
⚠️ 高併發下每秒 GB 級寫入,**嚴禁長期開啟**。
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 1G
sync_binlog = 1 -- 每提交 fsync,最安全
binlog_cache_size = 4M -- 大事務避免磁盤臨時檔
max_binlog_cache_size = 4G
sync_binlog=1:崩潰最多丟 1 筆事務;=0 依賴 OS 刷盤,效能高但風險大。binlog_cache_size/max_binlog_cache_size 減少磁盤 I/O。expire_logs_days=7。rsync / scp 定時推送至備份主機,或接入集中式日誌平台(ELK、Kafka)。datadir/hostname.err,關注 ERROR、InnoDB: Assertion failure、Out of memory。innodb_log_file_size 建議 256M-1G,innodb_log_files_in_group=2,大事務系統適當調大減少 Checkpoint 衝刷壓力。#!/bin/bash
# /etc/cron.daily/mysql-log-cleanup
# 1. 壓縮 1 天前的 slow log
find /var/log/mysql -name 'slow.log.*' -mtime +1 -exec gzip {} \;
# 2. 刪除 30 天前的 gz
find /var/log/mysql -name 'slow.log.*.gz' -mtime +30 -delete
# 3. Binlog 由 expire_logs_days 自動清理,若手動清理需 PURGE BINARY LOGS BEFORE 'date'
# 4. 告警:慢查詢日誌新增行數 > 1000/小時 發送郵件
log_output=TABLE 寫入 mysql.general_log/slow_log 表,會導致系統表膨脹、鎖爭用,**生產請用 FILE**。expire_logs_days 導致 Binlog 撐爆磁碟,主庫寫入卡死。sync_binlog=0 + 無電池 RAID 卡 → 掉電丟失已提交事務,資料不一致。將日誌配置標準化、自動化、可觀測,是資料庫穩定運行的必要條件。