《Mysql - 如何恢復和避免誤刪除?》


一:誤刪數據 (如何恢復和避免誤刪除)

  - 使用 delete 語句誤刪數據行;

  - 使用 drop table 或者 truncate table 語句誤刪數據表;

  - 使用 drop database 語句誤刪數據庫;

  - 使用 rm 命令誤刪整個 MySQL 實例。 

 

二:誤刪行

  - 方法

    - 如果是使用 delete 語句誤刪了數據行,可以用 Flashback 工具通過閃回把數據恢復回來。

 

  - 原理

    - Flashback 恢復數據的原理,是修改 binlog 的內容,拿回原庫重放。

    - 而能夠使用這個方案的前提是,需要確保 binlog_format=rowbinlog_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 系統就會開始工作,選出一個新的主庫,從而保證整個集群的正常工作。

  - 這時,你要做的就是在這個節點上把數據恢復回來,再接入整個集群。

 

五:小結

  - 預防遠比處理的意義來得大。

  - 及時備份和檢查備份很重要。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM