一:誤刪數據 (如何恢復和避免誤刪除)
- 使用 delete 語句誤刪數據行;
- 使用 drop table 或者 truncate table 語句誤刪數據表;
- 使用 drop database 語句誤刪數據庫;
- 使用 rm 命令誤刪整個 MySQL 實例。
二:誤刪行
- 方法
- 如果是使用 delete 語句誤刪了數據行,可以用 Flashback 工具通過閃回把數據恢復回來。
- 原理
- Flashback 恢復數據的原理,是修改 binlog 的內容,拿回原庫重放。
- 而能夠使用這個方案的前提是,需要確保 binlog_format=row 和 binlog_row_image=FULL。
- 恢復流程
- 對於 insert 語句,對應的 binlog event 類型是 Write_rows event,把它改成 Delete_rows event 即可;
- 同理,對於 delete 語句,也是將 Delete_rows event 改為 Write_rows event;
- 而如果是 Update_rows 的話,binlog 里面記錄了數據行修改前和修改后的值,對調這兩行的位置即可。
- 注意
- 建議在備庫執行這些操作。因為主庫的數據同時的也在產生數據。
- 我們不止要說誤刪數據的事后處理辦法,更重要是要做到事前預防
- 把 sql_safe_updates 參數設置為 on。
- 這樣一來,如果我們忘記在 delete 或者 update 語句中寫 where 條件,或者 where 條件里面沒有包含索引字段的話,這條語句的執行就會報錯。
三:誤刪庫、表
- 通過 truncate /drop table 和 drop database 命令刪除的數據,就沒辦法通過 binglog 來恢復了
- 因為,即使我們配置了 binlog_format=row,執行這三個命令時,記錄的 binlog 還是 statement 格式。
- binlog 里面就只有一個 truncate/drop 語句,這些信息是恢復不出數據的。
- 這種情況下,要想恢復數據,就需要使用全量備份,加增量日志的方式了。
- 這個方案要求線上有定期的全量備份,並且實時備份 binlog。
- 預防誤刪庫 / 表的方法
- 第一條建議是,賬號分離。這樣做的目的是,避免寫錯命令。
- 比如:我們只給業務開發同學 DML 權限,而不給 truncate/drop 權限。而如果業務開發人員有 DDL 需求的話,也可以通過開發管理系統得到支持。
- 即使是 DBA 團隊成員,日常也都規定只使用只讀賬號,必要的時候才使用有更新權限的賬號。
- 第二條建議是,制定操作規范。這樣做的目的,是避免寫錯要刪除的表名。
- 比如:在刪除數據表之前,必須先對表做改名操作。然后,觀察一段時間,確保對業務無影響以后再刪除這張表。
- 改表名的時候,要求給表名加固定的后綴(比如加 _to_be_deleted),然后刪除表的動作必須通過管理系統執行。並且,管理系刪除表的時候,只能刪除固定后綴的表。
四: rm 刪除數據
- 只要不是惡意地把整個集群刪除,而只是刪掉了其中某一個節點的數據的話.
- HA 系統就會開始工作,選出一個新的主庫,從而保證整個集群的正常工作。
- 這時,你要做的就是在這個節點上把數據恢復回來,再接入整個集群。
五:小結
- 預防遠比處理的意義來得大。
- 及時備份和檢查備份很重要。