萬盛學電腦網

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

MySQL 日誌體系全解析:錯誤/查詢/慢查詢/二進制日誌啟用、查看與分析實戰

MySQL 多種日誌記錄了資料庫運行狀態、查詢詳情、變更歷史,是故障排查、性能調優、數據恢復、審計合規的核心依據。本文系統整理四大日誌類型的啟用配置、查看方法、分析工具與實戰技巧。

四大日誌類型總覽

日誌類型參數用途典型場景
錯誤日誌--log-error啟動/關閉、崩潰、啟動失敗、關鍵錯誤故障排查、告警監控
通用查詢日誌--log / -l所有連線/查詢/斷開(含失敗語句)審計、問題複現、開發調試
慢查詢日誌--log-slow-queries / slow_query_log超過 long_query_time 的查詢性能調優、索引優化
二進制日誌--log-bin所有數據變更(DML/DDL),基於語句/行/混合格式主從複製、時間點恢復、審計

配置啟用(my.cnf)

[mysqld]
# 錯誤日誌(預設開啟,建議顯式指定路徑)
log-error = /var/log/mysql/error.log

# 通用查詢日誌(生產環境慎開,極大IO開銷)
general_log = 1
general_log_file = /var/log/mysql/general.log

# 慢查詢日誌(生產環境建議開啟)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2          # 超過 2 秒記錄
log_queries_not_using_indexes = 1  # 記錄未用索引查詢
min_examined_row_limit = 100       # 忽略掃描行數少的查詢

# 二進制日誌(主庫必開,從庫建議開)
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW            # ROW 格式最安全
expire_logs_days = 7           # 自動清理 7 天前
max_binlog_size = 100M         # 單文件大小觸發輪轉
sync_binlog = 1                # 每次提交刷盤,最安全

動態啟用/關閉(無需重啟)

SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;

查看日誌狀態

-- 查看所有日誌相關變量
SHOW VARIABLES LIKE 'log_%';

-- 查看二進制日誌狀態
SHOW MASTER STATUS;
-- File, Position, Binlog_Do_DB, Binlog_Ignore_DB, Executed_Gtid_Set

-- 列出所有 Binlog 文件
SHOW MASTER LOGS;
-- 或
SHOW BINARY LOGS;

二進制日誌分析工具:mysqlbinlog

基本用法

# 查看指定文件
mysqlbinlog /var/log/mysql/mysql-bin.000001

# 查看尾部
mysqlbinlog /var/log/mysql/mysql-bin.000001 | tail

# 導出為 SQL 文件
mysqlbinlog /var/log/mysql/mysql-bin.000001 > /tmp/binlog.sql

# 指定時間範圍導出(時間點恢復關鍵)
mysqlbinlog --start-datetime='2024-01-15 10:00:00' --stop-datetime='2024-01-15 11:00:00' \
  /var/log/mysql/mysql-bin.000001 > /tmp/recovery.sql

常見報錯與解決

# 錯誤:unknown variable 'default-character-set=utf8'
# 原因:my.cnf [client] 組有 default-character-set,mysqlbinlog 不支援
# 解決 1:註釋掉該行
# 解決 2:執行時加 --no-defaults
mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001 | tail

輸出格式解讀

# at 4
#100830 16:30:55 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0.67
ROLLBACK;
# at 1234
#240115 14:30:00 server id 1 end_log_pos 2345 Table_map: `db`.`t` mapped to number 100
# at 2345
#240115 14:30:01 server id 1 end_log_pos 3456 Write_rows: table id 100 flags: STMT_END_F
  • Table_map:表映射事件(ROW 格式必有)
  • Write_rows/Update_rows/Delete_rows:行變更事件
  • Query:語句事件(STATEMENT/MIXED 格式)
  • Xid:事務提交標記

慢查詢日誌分析工具

  • mysqldumpslow:官方聚合分析工具
    mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
    # -s t: 按時間排序, -t 10: Top 10
  • pt-query-digest:Percona Toolkit 專業分析(推薦)
    pt-query-digest /var/log/mysql/slow.log --limit 20 --filter '$event->{fingerprint} !~ /^SET/'
    
    # 輸出:執行次數、總時間、平均時間、掃描行數、索引使用、樣本 SQL、EXPLAIN 計劃
  • MySQL 8.0 sys.schema_table_statistics:系統表級統計

日誌輪轉與清理

# 手動刷新(生成新文件)
FLUSH LOGS;
FLUSH SLOW LOGS;
FLUSH GENERAL LOGS;
FLUSH ERROR LOGS;  -- 5.7+ 支援

# 自動清理:二進制日誌靠 expire_logs_days / binlog_expire_logs_seconds (8.0)
# 通用/慢查詢/錯誤日誌需配置 logrotate
# /etc/logrotate.d/mysql
/var/log/mysql/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 640 mysql mysql
    sharedscripts
    postrotate
        mysqladmin flush-logs > /dev/null 2>&1 || true
    endscript
}

生產環境最佳實踐

  • 錯誤日誌:必開,納入日誌收集系統(ELK/Loki),關鍵錯誤告警
  • 慢查詢日誌:必開,long_query_time=1 或更低,log_queries_not_using_indexes=ON 初期開啟
  • 二進制日誌:主庫必開 ROW 格式,從庫建議開啟支援級聯/恢復
  • 通用查詢日誌:生產**關閉**,僅問題排查時臨時開啟(SET GLOBAL general_log=ON),用完即關
  • 統一存放:/var/log/mysql/ 獨立分區/卷,防止寫滿根分區
  • 權限:mysql:mysql、640,防敏感信息洩露

建立完善的日誌體系,配合自動化分析與告警,讓資料庫「可觀測、可追溯、可恢復」,是穩定運行的基石。

copyright © 萬盛學電腦網 all rights reserved