mysqlbinlog 解析二進制日誌# /etc/my.cnf [mysqld] log-bin = mysql-bin # 重啟服務生效 service mysqld restart # 驗證 SHOW BINARY LOGS;
| 選項 | 用途 | 範例值 |
|---|---|---|
--start-datetime | 起始時間點 | "2016-08-09 05:05:27" |
--stop-datetime | 結束時間點 | "2016-08-09 05:30:00" |
--start-position | 起始 Position | 2698 |
--stop-position | 結束 Position | 2795 |
CREATE DATABASE Test_DB; USE Test_DB; CREATE TABLE OneTb(id INT, name VARCHAR(20), age INT); INSERT INTO OneTb VALUES (1,'user1',18),(2,'user2',19),(3,'user3',20); # 完整備份 mysqldump -uroot -p Test_DB > /data/mysqlbackup/Test_DB_0809-1650.sql
UPDATE OneTb SET age = 15; -- 全表年齡改錯 UPDATE OneTb SET name = 'user10'; -- 全表姓名改錯 DROP TABLE OneTb; -- 直接刪表
檢視最新 binlog 找到誤操作前的 Position:
mysqlbinlog /var/lib/mysql/mysql-bin.000001 # 找到 INSERT 正常資料後的 position = 2698 # 之後才是 UPDATE name='user10' (pos 2795) 和 DROP TABLE
導出誤操作前的 SQL:
mysqlbinlog --stop-position=2698 /var/lib/mysql/mysql-bin.000001 > /data/recovery/Backup_1.sql
# 刪除殘留庫(binlog 含 CREATE DATABASE) mysql -uroot -p -e "DROP DATABASE Test_DB;" # 匯入恢復 SQL mysql -uroot -p < /data/recovery/Backup_1.sql
SELECT * FROM Test_DB.OneTb; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | user1 | 18 | | 2 | user2 | 19 | | 3 | user3 | 20 | | 4 | user4 | 21 | | 5 | user5 | 22 | | 6 | user6 | 23 | +----+-------+------+
數據完整恢復,零損失。
| 策略 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 完整備份 + Binlog 增量 | 生產環境標準 | 恢復精確、資料零損失 | 需維護 binlog 完整性 |
| 純 Binlog 重放 | 開啟 binlog 後的全新庫 | 無需額外備份 | binlog 過大重放慢 |
| 單純 mysqldump 恢復 | 允許丟失備份後資料 | 最簡單快速 | 資料倒退 |
log-bin,確保儲存介質安全mysqldump 備份FLUSH LOGS 切割 binlog,便於增量備份與管理