從 mysql binlog 中手動恢復資料

2021-08-25 02:02:05 字數 829 閱讀 8898

【問題發生】

某個系統,不小心在介面上誤刪除了資料,查資料庫確認對應的資料已經從資料庫中刪掉。

檢查 mysql 設定,binlog 預設開啟,對應時間的binlog檔案儲存完整,可以用來恢復資料。

【資料庫層的資料恢復】

利用 mysqldump --no-data 建立映象的資料庫環境,作為驗證工作的環境。

使用 mysqlbinlog logfile databasename > logfile.sql 將binlog檔案中的二進位制內容轉化為sql文字。

觀察sql文字,並利用已知主鍵搜尋,查到相關的 insert/update 記錄。不過我很疑惑沒有查到對應的 delete記錄。

在驗證資料庫環境中手動執行查到的insert、update記錄,在資料庫中確認資料基本完好。

【應用層驗證】

整理手動執行的記錄,在真實環境中再次執行手動執行,在應用系統中確認資料基本完好。

【經驗和教訓】

1)手動恢復資料耗時耗力,需要同時對資料庫實現和應用層都很熟悉,這是最後的手段,能不用就不用;

2)能夠檢視到binlog 檔案儲存完整,就可以認為資料可以恢復,只是恢復的完整程度需要繼續確認。

3)必須在映象環境中工作,工作驗證無誤以後,將在映象環境中的操作嚴格複製到實際工作環境中。

4)在我的例子中,因為記錄條目數較少(<50條),手動恢復的方式較為適合。

5)實際我的工作中優先嘗試基於指令碼的自動恢復,先後遇到資料庫**式有變化、字符集問題、特殊字元問題,反而耽誤了時間。

應該僅對資料量較大(>500條)的情況做自動恢復。

6)資料庫層的資料恢復後,還需要做應用層的驗證才能最終確認恢復成功。

mysql binlog日誌自動清理及手動刪除

場景 當開啟mysql資料庫主從時,會產生大量如mysql bin.00000 log的檔案,耗費大量磁碟空間。解決方法 1.關閉mysql主從,關閉binlog 然後重啟資料庫。2.重啟mysql,開啟mysql主從,設定expire logs days 此方法需要重啟mysql。也可以直接在my...

PHP從手動匯入到自動載入

在php開發過程中,如果希望從外部引入乙個 class,通常會使用 include 和 require 方法,去把定義這個 class 的檔案包含進來。這個在小規模開發的時候,沒什麼大問題。但在大型的開發專案中,使用這種方式會帶來一些隱含的問題 如果乙個 php 檔案需要使用很多其它類,那麼就需要很...

ubuntu中手動新增swap

買的vps預裝的ubuntu server 12.04沒有分swap分割槽。自己新增步驟如下 1.sudo dd if dev zero of swap bs 1024 count 1024000 count就是分割槽的大小,我設了1g,of就是用著swap分割槽的檔案路徑,我直接放在根目錄下了 2...