MySQL 中誤刪數據主要以下幾種:
- 使用 delete 語句誤刪數據行;
- 使用 drop table 或者 truncate table 語句誤刪數據表;
- 使用 drop database 語句誤刪數據庫;
- 使用 rm 命令誤刪整個 MySQL 實例。
# 誤刪行
使用 delete 語句誤刪了數據行,可以用 Flashback 工具通過閃回把數據恢復回來。
Flashback 恢復數據的原理,是修改 binlog 的內容,拿回原庫重放。而能夠使用這個方案的前提是,需要確保 binlog_format=row 和 binlog_row_image=FULL。
# 誤刪庫 / 表
這種情況下,要想恢復數據,就需要使用全量備份,加增量日志的方式了。這個方案要求線上有定期的全量備份,并且實時備份 binlog。
在這兩個條件都具備的情況下,假如有人中午 12 點誤刪了一個庫,恢復數據的流程如下:
- 取最近一次全量備份,假設這個庫是一天一備,上次備份是當天 0 點;
- 用備份恢復出一個臨時庫;
- 從日志備份里面,取出凌晨 0 點之后的日志;
- 把這些日志,除了誤刪除數據的語句外,全部應用到臨時庫。
# 預防誤刪庫 / 表的方法
雖然常在河邊走,很難不濕鞋,但終究還是可以找到一些方法來避免的。
第一條建議是,賬號分離,避免寫錯命令。
第二條建議是,制定操作規范。這樣做的目的,是避免寫錯要刪除的表名。