前兩天在操作項目的時候,有一條SQL沒太注意,少寫了where語句,導致整個表被更新成一樣的數據。當時感到絕望,幸虧是在校內練手的小項目,3百多條數據。但還是給我上了一課。所以特此記錄找回的方法。
我在網上看了主要是兩種方式:
1. 通過原生的binlog日志在服務器上操作,參考:https://www.cnblogs.com/gomysql/p/3582058.html
2. 通過一個工具 binlog2sql【由大眾點評貢獻】,定位誤操作的日志位置,然后進行逆向sql解析,還原出誤操作中的數據sql文件,然后執行即可。參考博客:https://blog.csdn.net/letterss/article/details/93736959(在此特別感謝這位博主的創作)
后來發現,這種方法在原生開源工具里就有介紹:https://github.com/danfengcao/binlog2sql
我在這里用的是第二種,並且用自己的服務器和上面的數據庫還原出了原來的數據sql文件,然后在navicat里執行sql文件,恢復成功。再次提醒廣大網友:備份!!!備份!!!備份!!!怎么強調都不為過!
OK 開始操作
在操作之前,我要求你把數據庫備份一份,別這個沒搞成,最后還把別的搞壞了!
詳細步驟如下:
1. 查看數據庫是否開啟了binlog且為ROW格式 (必須開啟了才行)
1)mysql> show variables like 'log_bin'; 也可以寫成 show variables like '%log_bin%';這是模糊查詢的意思
Values值為ON即為開啟,這個一般是mysql數據庫會自動開啟的
2)查看是否為row 格式
mysql> show variables like 'binlog_format';
2. 查看當前binlog文件,然后退出mysql模式,回到服務器命令行模式
mysql> show master status;
可以看到當前的binlog文件是binlog.000011(如果有多個,則是最下面的那個)
【注意】:如果你登錄的mysql不是root賬戶,那么這一步會提示權限不足 需要一些權限才行。
有兩種方法:
1)、用root賬戶登錄即可(最簡單直接)
2)、創建一個mysql用戶(或者直接用已有的賬戶),並授權相關權限
mysql> create user 'gsl'@'localhost' identified by '自己的數據庫密碼';
mysql> grant select,replication slave,replication client on *.* to 'gsl'@'localhost';
(參考:https://www.cnblogs.com/xuanzhi201111/p/6602489.html)
3. 安裝pip和 binlog2sql (這個是大眾美團的開源工具參考:https://github.com/danfengcao/binlog2sql)
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip -V (查看pip是否安裝成功)
yum -y install git
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt
安裝成功后,進入binlog2sql目錄
【此步一般是安裝完后就自動進入了,如果不確定就cd 返回根目錄,再 cd /binlog2sql/binlog2sql)】
4.執行下面的語句
python binlog2sql.py -h localhost -u 自己的數據庫用戶名 -p 自己的密碼 -d 數據庫名 -t 表名 --start-file='binlog.000011' --start-datetime='2020-6-27 16:20:00' --stop-datetime='2020-6-27 16:40:00'
【再此記錄下我當時誤操作的大致時間:2020-6-27 16:20:00 至 2020-6-27 16:40:00】時間點要記好
這一步可能會遇到以下問題:
1)版本不一致的問題(參考:https://www.jianshu.com/p/f69e846558ab)

- 查看版本命令
# pip list
Package Version
---------------------- -----------
PyMySQL 0.7.11
更新一下 對應的版本
# pip install --upgrade PyMySQL
一般更新后就可以了
5.執行成功后,如下圖所示:
我們可以看到Update的start位置是:2213 。end 位置是2612。(即startposion = 2213,stop-position=2612)在下面的語句中用到
6. 根據位置回逆向解析出sql文件,這其中就包含了誤操作之前的數據
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -padmin -d數據庫名 -t表名 --start-file='binlog.000011' --start-position=2213 --stop-position=2612 -B > /back.sql
執行以下命令生成回滾sql,保存在根目錄下面,名稱為 back.sql(自己起一個就行)。
在服務器的主目錄下查看有沒有生成
7.把這個sql傳輸到本地(同時備份一遍,以防萬一),用編輯器打開看一下是不是你要的sql。基本上只要定位好了,沒什么問題。
但是也有可能這個sql文件的列不對應,發生錯亂。這就需要你仔細對比,修改成想要的。我那個就修改了好長時間
8.用Navicat在一個備用的數據庫里執行這個sql文件,而且是同名同結構的表,之后看看數據是不是恢復了
我這里是實驗成功了,恢復出來了原來的數據。
9. 恢復之后,首先做的第一步便是:趕緊備份一份!