MySQL 日誌是資料庫運維、故障排查、資料恢復的核心工具。本文系統梳理錯誤日誌、查詢日誌、慢查詢日誌、二進制日誌的啟用配置、查看方式,並詳細講解如何利用 mysqlbinlog 進行基於時間點與位置的精準資料恢復。
| 日誌類型 | 啟用參數 | 用途 |
|---|---|---|
| 錯誤日誌 | log-error | 記錄啟動/關閉/錯誤資訊,預設開啟 |
| 查詢日誌 | log / general_log | 記錄所有連線與 SQL,調試用,生產慎開 |
| 慢查詢日誌 | slow_query_log / long_query_time | 記錄超時 SQL,效能調優核心依據 |
| 二進制日誌 | log_bin | 記錄所有變更操作,主從複制、資料恢復基石 |
| 中繼日誌 | relay_log | 從庫儲存主庫同步的二進制事件 |
[mysqld]
log-bin = /var/log/mysql/binlog
binlog_format = ROW
server-id = 1
expire_logs_days = 7
max_binlog_size = 100M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log-error = /var/log/mysql/error.log
修改後需重啟 MySQL 服務生效。
-- 查看二進制日誌狀態
SHOW VARIABLES LIKE 'log_bin';
SHOW MASTER STATUS;
-- 列出所有 binlog 檔案
SHOW BINARY LOGS;
-- 查看當前 binlog 事件
SHOW BINLOG EVENTS;
-- 使用 mysqlbinlog 查看檔案內容
mysqlbinlog /var/log/mysql/binlog.000001
mysqlbinlog /var/log/mysql/binlog.000001 | tail -20
-- 導出為 SQL 檔案便於分析
mysqlbinlog /var/log/mysql/binlog.000001 > /tmp/binlog.sql
-- 恢復到 2024-01-15 10:00:00 之前
mysqlbinlog --stop-datetime="2024-01-15 10:00:00" /var/log/mysql/binlog.000001 | mysql -u root -p
-- 恢復 10:01:00 之後的操作
mysqlbinlog --start-datetime="2024-01-15 10:01:00" /var/log/mysql/binlog.000001 | mysql -u root -p
-- 先導出特定時間區間檢視 position
mysqlbinlog --start-datetime="2024-01-15 09:55:00" --stop-datetime="2024-01-15 10:05:00" \
/var/log/mysql/binlog.000001 > /tmp/review.sql
-- 確認錯誤 SQL 的 position 後,分段恢復
mysqlbinlog --stop-position="368312" /var/log/mysql/binlog.000001 | mysql -u root -p
mysqlbinlog --start-position="368315" /var/log/mysql/binlog.000001 | mysql -u root -p
mysqlbinlog /var/log/mysql/binlog.000001 > /tmp/full.sql
mysql -u root -p -e "source /tmp/full.sql"
-- 產生新的 binlog 檔案(舊檔編號+1)
FLUSH LOGS;
-- 刪除所有 binlog 並重新編號(謹慎使用!)
RESET MASTER;
-- 快速備份資料庫
mysqldump -u root -p --single-transaction --quick db_name > backup.sql