前提:
確認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-position
和stop-position
替換成剛剛我們查出的start(24908391) 和 end(24920250 )值.
然后我們會得到插入語句rollback.sql
,如圖:
之后執行這些插入語句就可以恢復啦。結束