mysql刪庫後恢復資料流程

2021-10-18 16:41:15 字數 3103 閱讀 9980

本文將介紹當我們使用mysql不小心刪庫之後,或者惡意被刪庫後,如何進行資料恢復

我們進行資料恢復的前提是:

我們先來了解下binlog

binlog是mysql server層提供的功能,和儲存引擎無關,binlog儲存了所有服務端執行的ddl和dml語句。

所以在binlog完整的情況下,可以理解為當被刪庫後可以把所有dml語句重新執行一遍來達到資料恢復

binlog的作用:

首先我們自己先部署乙個mysql,部署的流程這裡不介紹。

然後修改配置檔案,筆者這裡是使用docker啟動的mysql,修改容器內部配置檔案:

/etc/mysql/mysql.conf.d/mysqld.cnf,如果不是容器的話目錄應該是/etc/my.cnf檔案,如圖

log-bin:指定binlog的目錄

expire_logs_day:保留多少天內的日誌,如果希望全量儲存則可以不設定

server_id:主從架構時使用,這裡使用binlog也需要設定,否則可能報錯

我們先建立了一些初始化資料

建立了db1、db2資料庫以及一些資料

然後我們看下當前binlog的狀態:

使用mysql連線:mysql -uroot -p123456;

執行:show master status;

檢視下當前binlog的最後乙個檔案以及position

position:可以理解為當前寫到該binlog檔案的哪個位置

接下來我們開始備份資料庫

使用mysql的mysqldump工具進行備份所有資料庫

執行:mysqldump -f -r -x -uroot -p123456 --all-databases >/db_all_20210202_19_21.sql-f:等同於–flush-logs: 在執行匯出前先重新整理binlog日誌檔案,一般來說,如果是全庫匯出,建議先重新整理日誌檔案

-r,: 匯出儲存過程以及自定義函式

-x, 等同於–lock-all-tables: 在匯出任務執行期間鎖定所有資料庫中的所有表,以保證資料的一致性。這是乙個全域性鎖定,並且自動關閉–single-transaction 和–lock-tables 選項。這個引數***比較大,這是全庫鎖定,備份執行過程中,該庫無法進行讀寫操作,不是所有業務場景都能接受的。請慎用。(讀寫操作無法執行)

此時的binlog應該是乙個新的檔案了,我們連線後再看下

也就是說我們備份的檔案db_all_20210202_19_21.sql包含了binlog檔案mysql-bin.000014之前的所有資料

然後我們又寫了一些資料

現在有人惡意刪庫跑路了!!!

我們的所有資料庫都被刪除了,我們嘗試進行恢復資料

我們首先需要找到binlog檔案刪庫的日誌是記錄在**的,這裡主要根據時間來依次查詢下

先看下當前有哪些binlog日誌檔案,直接在binlog日誌目錄下檢視

我們在mysql-bin.000014-mysql-bin.000017之間查詢刪庫語句

執行:mysqlbinlog -v /var/lib/binlog/mysql-bin.000014;可以檢視binlog詳細日誌,以及操作的時間。先定位到刪庫的時間,然後尋找對應的刪庫操作,我們這裡是手動刪除db1和db2的,根據時間先定位到了是在日誌檔案mysql-bin.000014

然後執行:show binlog events in 『mysql-bin.000014』;

可以看到position 984到1231為我們的刪庫語句日誌,所以我們需要先恢復到position 984之前

此時如果整個mysql的的儲存目錄都被刪掉了,則需要重新安裝下mysql或者想辦法生成乙份初始化的儲存目錄檔案

筆者是使用docker安裝的,所以重啟了docker即重新生成了,重啟後的檔案如下

1、我們先恢復到我們上述的備份包

執行:mysql -uroot -p123456

執行後檢視資料,發現db1和db2都已經恢復了,但是後續增加的name=7、8、9三條資料丟失了

2、我們基於binlog恢復備份包到刪庫之前的資料

執行:mysqlbinlog --start-position=1 --stop-position 984 /var/lib/binlog/mysql-bin.000014 | mysql -uroot -p;

然後檢視資料庫表,發現資料已經完整了,如果此時還需要後面的資料,那麼依次恢復mysql-bin.000015、mysql-bin.000016、mysql-bin.000017的資料即可

本文介紹的只是基礎的資料恢復流程,僅限學習。真正的dba維護資料庫肯定沒有這麼簡單。

注意點:

MySQL 刪庫跑路?誤刪資料庫後恢復資料

背景 我把庫刪了!還沒有備份!以下的所有操作,需要基於mysql的binlog檔案。如果連binlog檔案都沒了,就不用繼續看下去了。環境 windows 10 mysql 5.7 還是 8.0 好像都可以 總之,一定一定定期備份!同時開啟binlog檔案!具體思路 0.冷靜。立即終止所有資料庫的操...

刪庫不跑路之Mysql資料恢復

前言 既然要恢復,肯定要先備份,如何備份看這篇mysql資料庫備份 gunzip miaosha 202008061026.sql.gz方式一,linux命令列下 mysql uroot p db2 miaosha 202008061026.sql 方式二,mysql命令列下 source miao...

oracle 誤刪資料後恢復資料

閃回 根據時間恢復表資料 檢視表資料 檢視某個時間點之前的表資料 select from 表名 as of timestamp to timestamp 2021 03 18 10 12 11 yyyy mm dd hh24 mi ss 若沒有資料 可時間繼續提前查詢 flashback table...