萬盛學電腦網

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

MySQL 更新日志(Binary Log)完整指南:啟用、輪轉、恢復與單庫過濾實戰

啟用更新日志(二進制日志)

[mysqld]
log-bin = mysql-bin          # 基礎名稱,自動生成 mysql-bin.000001...
binlog_format = ROW          # 推薦 ROW 格式,避免主從不一致
expire_logs_days = 7         # 自動清理 7 天前日志
max_binlog_size = 100M       # 單文件最大 100M 自動切換

重啟服務生效。查看狀態:SHOW BINARY LOGS; / SHOW MASTER STATUS\G

日志輪轉觸發條件

  • mysqladmin flush-logs / FLUSH LOGS
  • mysqladmin refresh
  • 服務重啟
  • 文件達到 max_binlog_size

注意:若 log-bin=mysql-bin.log 帶擴展名,輪轉會截斷覆蓋同名文件,導致數據丟失,生產環境嚴禁帶擴展名。

日志內容特點

  • 僅記錄真正修改數據的語句(INSERT/UPDATE/DELETE/DDL)
  • WHERE 無匹配行的 UPDATE/DELETE 不記錄
  • SET col = col 這類無實際變更的 UPDATE 不記錄

恢復操作實戰

1. 全量恢復(所有庫)

mysqlbinlog /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
# 或按時間點恢復
mysqlbinlog --stop-datetime="2024-01-15 10:00:00" mysql-bin.* | mysql -u root -p

2. 單庫恢復(--one-database)

mysqlbinlog --database=target_db mysql-bin.* | mysql -u root -p target_db

3. 批量恢復多個日志文件(按時間順序)

# 正確順序:ls -t -r 按修改時間升序
ls -t -r /var/lib/mysql/mysql-bin.* | xargs cat | mysql --one-database target_db -u root -p

⚠️ 若手動修改過日志文件 mtime,順序會亂,請用 ls -1 按文件名排序

4. 針對誤操作的精準恢復

# 1. 定位誤操作位置
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000005 | grep -n -B5 -A5 "DROP TABLE"

# 2. 重放至誤操作前
mysqlbinlog --stop-position=12345 mysql-bin.000005 | mysql -u root -p

從庫同步配置

[mysqld]
server-id = 2
relay-log = relay-bin
read-only = 1
replicate-do-db = business_db   # 僅同步指定庫
replicate-ignore-db = mysql,test

監控與告警

  • Seconds_Behind_Master > 300 秒告警
  • 日志磁盤佔用 > 80% 告警
  • 定期校驗 SHOW SLAVE STATUS\G 中 Slave_IO_Running、Slave_SQL_Running 均為 Yes
copyright © 萬盛學電腦網 all rights reserved