1. 程式人生 > 實用技巧 >MySQL資料庫誤Update找回資料的方法

MySQL資料庫誤Update找回資料的方法

前兩天在操作專案的時候,有一條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

(在此特別感謝這位博主的創作!!)

我在這裡用的是第二種,並且用自己的伺服器和上面的資料庫還原出了原來的資料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

4.安裝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='mysql-bin.000002' --start-datetime='2019-6-26 14:00:00' --stop-datetime='2019-6-26 14:05:00'

這一步可能會遇到問題,解決思路

1)有可能是得 建立一個mysql使用者,並授權相關許可權

參考部落格:https://www.cnblogs.com/xuanzhi201111/p/6602489.html

mysql> create user 'gsl'@'localhost' identified by '自己的資料庫密碼';
mysql> grant select,replication slave,replication client on *.* to 'gsl'@'localhost';

2)或者是這個問題 (
參考: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。基本上只要定位好了,沒什麼問題

8.用Navicat在一個備用的資料庫裡執行這個sql檔案,而且是同名同結構的表,之後看看資料是不是恢復了

我這裡是實驗成功了,恢復出來了原來的資料。

恢復之後,首先做的第一步便是:趕緊備份一份!