萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 五大日誌類型深度解析:錯誤、二進制、查詢、慢查詢、中繼日誌配置與運用

日誌全景圖

日誌類型用途預設狀態關鍵配置
錯誤日誌啟動/關閉/錯誤/事件調度器資訊開啟 (寫入主機名.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=資訊

二、二進制日誌 (Binlog) —— 核心中的核心

啟用與格式選擇

[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 (Percona Toolkit)

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)

日誌輸出目的地:FILE vs TABLE

SET GLOBAL log_output = 'FILE';     -- 預設,寫檔案
SET GLOBAL log_output = 'TABLE';    -- 寫 mysql.general_log / mysql.slow_log 表
SET GLOBAL log_output = 'FILE,TABLE'; -- 雙寫

寫表方便 SQL 查詢分析,但高頻寫入會產生鎖爭用,生產建議 FILE。

運維最佳實踐

  1. 錯誤日誌永久開啟,配置 logrotate 切割壓縮保留 30 天。
  2. Binlog 必開 (ROW + GTID),配合 expire_logs_days 防磁碟爆滿。
  3. 慢查詢日誌永久開啟,long_query_time=0.5-1,定期 pt-query-digest 分析優化 Top SQL。
  4. 一般查詢日誌平時關閉,除錯時動態開啟 10-30 分鐘即關。
  5. 異地備份 Binlog:配合 rsync/aws s3 sync 推送至異地,支援 PITR (時間點恢復)。

日誌是資料庫的「黑盒子」,配置得當,故障排查與數據安全雙保障。

copyright © 萬盛學電腦網 all rights reserved