啟用 Binary Log
命令列啟動
mysqld --log-bin=/var/log/mysql/binlog
配置檔持久化 (my.cnf)
[mysqld]
log-bin = /var/log/mysql/binlog
# 可選:expire_logs_days = 7 (自動清理 7 天前舊 log)
max_binlog_size = 100M
自動清理 Shell 腳本 (cron 每週執行)
#!/bin/sh
# 刪除 7 天前舊 binlog
find /var/log/mysql/ -name "binlog.[0-9]*" -type f -mtime +7 -exec rm -f {} \;
# 通知 MySQL 產生新 log (FLUSH LOGS)
/usr/local/mysql/bin/mysqladmin -u root -p'password' flush-logs
時間點恢復 (Point-In-Time Recovery, PITR)
- 還原最近一次完整備份:
mysql -u root -p dbname < full_backup.sql
- 重放 Binary Log 到指定時間:
mysqlbinlog --start-datetime="2024-01-15 10:00:00" \
--stop-datetime="2024-01-15 14:30:00" \
/var/log/mysql/binlog.000001 | mysql -u root -p dbname
單一資料庫恢復 (--one-database)
mysqlbinlog binlog.000001 | mysql -u root -p --one-database dbname
變更日誌 (舊版 Update Log) vs Binary Log
- Update Log (3.23 以前):純文字、不可重放、已移除
- Binary Log (3.23+ / 4.0+ 預設):二進位、含事件型別/位置/時間、支援 Replication 與 PITR
最佳實務
- Binary Log 放在不同磁碟 與資料目錄
- 啟用
sync_binlog=1 (每次 Commit 刷盤) 保證不丟失
- 定期測試 PITR 流程,驗證備份可用性