MySQL 雙層日志架構:**Server 層**(Binlog、Error Log、General Log、Slow Log)+ **Engine 層**(InnoDB Redo/Undo Log)。理解兩者交互是掌握崩潰恢復、主從同步、性能調優的鑰匙。
SHOW GLOBAL VARIABLES LIKE '%log_error%';
-- log_error = /data/mysql/stu18.magedu.com.err
# 實時監控
tail -f /data/mysql/stu18.magedu.com.err
# 關鍵啟動信息解讀
-- InnoDB: Initializing buffer pool, size = 128.0M
-- InnoDB: 5.5.33 started; log sequence number 1630920
-- Server hostname (bind-address): '0.0.0.0'; port: 3306
-- Event Scheduler: Loaded 0 events
-- /usr/local/mysql/bin/mysqld: ready for connections
mv stu18.magedu.com.err stu18.magedu.com.err.old
mysqladmin flush-logs # 生成新 error.log
SET GLOBAL general_log=ON;
SET GLOBAL log_output='FILE'; -- 或 'TABLE', 'FILE,TABLE', 'NONE'
SET GLOBAL general_log_file='/tmp/debug.log';
# TABLE 模式查看
USE mysql; SELECT * FROM general_log ORDER BY event_time DESC LIMIT 10;
⚠️ **高併發下極大 IO 壓力,僅排查具體問題時短時開啟。**
# my.cnf
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
long_query_time=0.5 -- 500ms,視業務調整
log_queries_not_using_indexes=ON
log_output=FILE
SET SESSION long_query_time=0.001; -- 當前會話微秒級
SELECT * FROM mysql.user WHERE user='root'; -- 故意觸發
# 查看記錄
system cat /data/mysql/slow.log
# Time: 240115 10:30:00
# User@Host: root[root] @ localhost []
# Query_time: 0.108 Lock_time: 0.000 Rows_sent: 4 Rows_examined: 6
SET TIMESTAMP=1705285800;
SELECT user,host,password FROM user WHERE user="root";
SHOW VARIABLES LIKE 'innodb_log_%';
-- innodb_log_file_size = 5M (默認,建議 512M-2G)
-- innodb_log_files_in_group = 2
-- innodb_log_group_home_dir = ./
-- innodb_flush_log_at_trx_commit = 1 (關鍵:1=提交時刷盤, 2=每秒刷盤, 0=OS刷盤)
ls -lh ib_logfile*
-- -rw-rw---- 1 mysql mysql 5.0M ib_logfile0
-- -rw-rw---- 1 mysql mysql 5.0M ib_logfile1
innodb_log_file_size 設為 **Buffer Pool 25%-50%**,減少 Checkpoint 刷盤衝擊。innodb_flush_log_at_trx_commit=1 保證 ACID,配合 RAID 卡 BBU/BBM 消除 fsync 瓶頸。innodb_log_buffer_size 大事務場景調大至 64M-256M,減少臨時文件落盤。| 參數 | 推薦值 | 說明 |
|---|---|---|
log_bin | ON / 路徑 | 啟用,指定文件前綴 |
binlog_format | MIXED | 自動選擇 STATEMENT/ROW |
sync_binlog | 1 | 每提交 fsync,零丟失 |
expire_logs_days | 7 | 自動清理 |
max_binlog_size | 1G | 單文件上限 |
binlog_cache_size | 4M | 事務緩存,大事務調大 |
sql_log_bin | SESSION 級控制 | 特定操作不記錄 Binlog |
# 服務端命令
SHOW BINARY LOGS; -- 文件列表+大小
SHOW MASTER STATUS; -- 當前寫入 File+Position
SHOW BINLOG EVENTS [IN 'file'] [FROM pos] [LIMIT n]; -- 事件解析
# 命令行工具
mysqlbinlog mysql-bin.000001 | head -30
mysqlbinlog --start-position=107 --stop-position=479 mysql-bin.000011 > /tmp/replay.sql
mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 10:30:00" mysql-bin.000011 | mysql -uroot -p
Format_desc:文件頭元數據(版本、Server ID)。Query:DDL/DML 文本(STATEMENT 格式)。Table_map / Write_rows / Update_rows / Delete_rows:ROW 格式行變更。Xid:事務提交標記(含 XID,用於崩潰恢復)。Rotate:Binlog 切換事件。mysql < full_backup.sql)。--master-data=2 註釋中)。
mysqlbinlog --start-position=5230766 --stop-position=5231104 mysql-bin.000001 | mysql -uroot -p
# 安全清理(保留指定文件及之後)
PURGE BINARY LOGS TO 'mysql-bin.000010';
# 按時間清理
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
# 刷新生成新文件
FLUSH LOGS;
# 危險操作:僅限新實例初始化
RESET MASTER;
文中匯總了 expire_logs_days、general_log、binlog_format、log_error、log_output、long_query_time、max_binlog_size、innodb_log_file_size、innodb_log_files_in_group、sync_binlog、slow_query_log 等 40 餘個參數的作用域、動態性、推薦值,**建議收藏作為配置審計清單**。
MySQL 日志系統是「可觀測性、可恢復性、可審計性」的三大支柱。生產環境**最小化配置基線**:Error Log(永久)、Slow Log(全量、0.5s)、Binlog(MIXED/sync=1/7d)、Redo Log(1/4 BP/flush=1)、General Log(關閉)。構建「日志採集→平台分析→告警觸發→自動恢復」閉環,將日志從「事後排查」轉化為「事前預防」的核心資產。