MySQL誤刪數據或者誤清空表恢復


前提:

確認MySQL server開啟了binlog,設置了以下參數:

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 100M
binlog-format = row

沒有開啟的話,那真的無法快速回滾,以下方法不適用。

一、 情形1: 使用第三方工具

這里以第三方工具Navicat為例,注意,請查看第三方客戶端是否有日志功能

1. 誤刪幾條記錄

可以直接從日志讀取相關記錄,手動轉化為insert語句

2. 誤刪整張表表

也就是點擊了清空表,這也是本次遇到的問題,在日志里只有DELLECT from TableName日志,沒有詳細的行記錄,需要使用情形2的方法,日志如圖:

如圖,誤刪了一張表,然后刷新發現里邊啥都沒有了。一臉懵逼o((⊙﹏⊙))o

二、 情形2: 沒有客戶端,直接命令行刪除了整張表

如果是直接使用了命令,或者其他語言接口,難以找到操作日志,那么情形1的兩種方法都需要利用binlog2sql快速閃回
Github鏈接:binlog2sql,具體使用方法在readme中已經有了很詳細的說明,以下試我的使用過程:

步驟一:查找binlog

show master status;


找到binlog路徑,默認在這個文職,否則看數據庫配置的里手動設定的存儲路徑:

步驟二:安裝binlog2sql數據恢復工具

binlog2sql是一款簡單易用的binlog解析工具,其中一個功能就是生成回滾SQL。

git clone https://github.com/danfengcao/binlog2sql.git
cd binlog2sql
pip install -r requirements.txt

我測試2.7后續操作會報錯,后來換成了python3.7,測試通過。python環境建議直接用python3.
環境准備好后,把上一步查到的最新binlog復制到項目目錄下,如圖:

到此准備工作完畢

步驟三: 開始模糊查詢,並定位范圍

想辦法回想誤刪的時間點,開始用起始時間和結束時間模糊查詢,找到誤刪的位置
如果是用了第三方工具,可以直接從日志里找刪除時間,如圖我的誤刪時間是[2021-01-07 15:11:49.054]

然后運行命令,解析binlog,定位並確認誤刪的位置。

python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dDatabaseName -tTableNameDeleted --start-file='binlog.000007' --start-datetime='2021-01-07 15:11:48' --stop-datetime='2021-01-07 15:11:50'' 

這里注意替換相應的數據庫配置和數據庫名稱、待查詢的表名稱

操作的結果是詳細的操作每條記錄的語句。這一步可以修改起始結束時間重復操作,直到只有我們誤刪的記錄。 然后隨便找一條誤刪的記錄,注意后面的注釋:

最終,我們可以得到誤操作的sql語句序號是圖中的start(24908391) 到 end(24920250 )的范圍。

步驟四:將誤刪的SQL語句轉化為insert語句

-python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' dDatabaseName -tTableNameDeleted --start-file='binlog.000007' --start-position=24908391 --stop-position=24920250 -B > rollback.sql | cat

其中數據庫等配置同上,start-positionstop-position替換成剛剛我們查出的start(24908391) 和 end(24920250 )值.
然后我們會得到插入語句rollback.sql,如圖:

之后執行這些插入語句就可以恢復啦。結束


免責聲明!

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



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