| 日誌類型 | 用途 | 預設狀態 | 關鍵配置 |
|---|---|---|---|
| 錯誤日誌 | 啟動/關閉/錯誤/事件調度器資訊 | 開啟 (寫入主機名.err) | log_error |
| 二進制日誌 | 資料變更記錄,支援 PITR/主從複制 | 關閉 | log_bin, binlog_format, expire_logs_days |
| 一般查詢日誌 | 所有連線/查詢語句 (審計/除錯) | 關閉 | general_log, general_log_file |
| 慢查詢日誌 | 超過閾值/未用索引的查詢 | 關閉 | slow_query_log, long_query_time, log_queries_not_using_indexes |
| 中繼日誌 | 從庫儲存主庫 Binlog,供 SQL 執行緒重放 | 僅從庫啟用 | relay_log, relay_log_index |
SHOW VARIABLES LIKE 'log_error';
-- 典型輸出:/var/log/mysqld.log 或 /var/lib/mysql/hostname.err
[mysqld]
log_error = /var/log/mysql/error.log
log_warnings = 2 # 1=記錄警告,2=含連線中斷等更多資訊 (5.7+)
log_error_verbosity = 3 # 8.0 替代 log_warnings:1=錯誤,2=警告,3=資訊
[mysqld]
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW # ROW/STATEMENT/MIXED,推薦 ROW (數據一致性最強)
binlog_row_image = FULL # ROW 格式下記錄全列 (預設)
expire_logs_days = 7 # 自動清理 7 天前舊日誌 (8.0 用 binlog_expire_logs_seconds)
max_binlog_size = 1G # 單檔上限,超過自動滾動
sync_binlog = 1 # 每次提交 fsync,最安全 (性能敏感可設 100-1000)
gtid_mode = ON # GTID 複制模式 (推薦)
enforce_gtid_consistency = ON
-- 查看所有 binlog
SHOW BINARY LOGS;
-- 查看當前寫入位置
SHOW MASTER STATUS;
-- 查看特定 binlog 事件 (需 mysqlbinlog 工具)
mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 11:00:00" /var/log/mysql/mysql-bin.000042
-- 手動刷新 (切換新檔)
FLUSH LOGS;
-- 清理舊 binlog (慎用!確認從庫已同步)
PURGE BINARY LOGS TO 'mysql-bin.000050';
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
SET GLOBAL general_log = ON;
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
-- 或寫入表 (mysql.general_log)
SET GLOBAL log_output = 'TABLE';
⚠️ 高併發下極其消耗 IO,**僅限短時除錯,平時關閉**。
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5 -- 超過 0.5 秒記錄 (微秒級可用 0.05)
log_queries_not_using_indexes = ON -- 記錄未用索引查詢 (高頻小表慎開)
log_slow_admin_statements = ON -- 記錄管理命令 (ALTER/OPTIMIZE 等)
log_slow_slave_statements = ON -- 記錄從庫慢 SQL
min_examined_row_limit = 100 -- 掃描行數少於此值不記錄 (過濾噪音)
pt-query-digest /var/log/mysql/slow.log --limit 20 --since "24 hours ago"
# 輸出 Top 20 慢查詢,含執行次數、總耗時、平均耗時、掃描行數、指紋等
僅從庫 (Replica) 使用。IO 線程從主庫拉取 Binlog 寫入 Relay Log,SQL 線程讀取 Relay Log 重放。
[mysqld]
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
relay_log_purge = ON -- SQL 線程執行後自動清理 (預設 ON)
relay_log_recovery = ON -- 啟動時自動修復損壞 Relay Log (8.0+ 預設 ON)
SET GLOBAL log_output = 'FILE'; -- 預設,寫檔案
SET GLOBAL log_output = 'TABLE'; -- 寫 mysql.general_log / mysql.slow_log 表
SET GLOBAL log_output = 'FILE,TABLE'; -- 雙寫
寫表方便 SQL 查詢分析,但高頻寫入會產生鎖爭用,生產建議 FILE。
logrotate 切割壓縮保留 30 天。expire_logs_days 防磁碟爆滿。long_query_time=0.5-1,定期 pt-query-digest 分析優化 Top SQL。rsync/aws s3 sync 推送至異地,支援 PITR (時間點恢復)。日誌是資料庫的「黑盒子」,配置得當,故障排查與數據安全雙保障。