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(在此特別感謝這位博主的創作)

后來發現,這種方法在原生開源工具里就有介紹: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. 恢復之后,首先做的第一步便是:趕緊備份一份!

 


免責聲明!

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



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