記錄所有**修改資料**的 SQL (INSERT/UPDATE/DELETE/DDL 等),不含 SELECT。支援:
[mysqld]
log-bin = /var/log/mysql/mysql-bin
binlog_format = ROW # ROW/STATEMENT/MIXED,推薦 ROW
max_binlog_size = 500M # 單檔上限,自動分檔
expire_logs_days = 7 # 自動清理天數
binlog_expire_logs_seconds = 604800 # 8.0+ 秒級精度
sync_binlog = 1 # 每次提交刷盤,最安全 (效能稍損)
binlog_cache_size = 4M # 事務緩衝
max_binlog_cache_size = 1G
重啟後生效,資料目錄產生 mysql-bin.000001、mysql-bin.index。
SHOW BINARY LOGS;
SHOW MASTER STATUS; -- 當前寫入檔案與位置
# 查看單檔
mysqlbinlog /var/log/mysql/mysql-bin.000003
# 指定時間範圍
mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 11:00:00" \
/var/log/mysql/mysql-bin.000003
# 指定位置範圍
mysqlbinlog --start-position=1234 --stop-position=5678 /var/log/mysql/mysql-bin.000003
# 解碼 ROW 格式 (需 -v -v -v)
mysqlbinlog -v -v -v /var/log/mysql/mysql-bin.000003 | less
# 過濾特定表/用戶
mysqlbinlog /var/log/mysql/mysql-bin.000003 | grep -i 'update.*users'
場景:誤執行 DELETE FROM orders WHERE id > 1000 於 2024-01-15 14:30:00,需恢復到 14:29:59。
gunzip < backup_20240115_0200.sql.gz | mysql -u root -p
mysqlbinlog --stop-datetime="2024-01-15 14:29:59" \
/var/log/mysql/mysql-bin.00000* | mysql -u root -p
FLUSH LOGS; -- 產生新 binlog 檔案
FLUSH BINARY LOGS; -- 同義
RESET MASTER; -- 危險!清空所有 binlog、重置 index,僅測試環境用
# 導出時同步刷新 binlog,確保備份點與 binlog 位置對應
mysqldump --flush-logs --master-data=2 --single-transaction -u root -p mydb > backup.sql
-- --master-data=2: 註釋形式輸出 CHANGE MASTER TO 位置資訊
sync_binlog=1 最安全但 IOPS 要求高,SSD 必須;HDD 可設 100-1000 妥協binlog_format=ROW 體積較大但複寫最安全,避免非確定性函數問題default-character-set 在 [client] 區段會導致 mysqlbinlog 報錯 unknown variable → 移至 [mysqld] 或註釋max_binlog_cache_size 會報錯,需調大