1. 程式人生 > >使用binlog日誌恢復MySQL資料庫刪除資料的方法

使用binlog日誌恢復MySQL資料庫刪除資料的方法

binlog日誌簡介:

binlog 就是binary log,二進位制日誌檔案,這個檔案記錄了MySQL所有的DDL和DML(除了資料查詢語句)語句,以事件形式記錄,還包含語句所執行的消耗的時間。

binlog日誌包括兩類檔案:

1)二進位制日誌索引檔案(檔名字尾為.index):用於記錄所有的二進位制檔案;
2)二進位制日誌檔案(檔名字尾為.00000*):記錄資料庫所有的DDL和DML(除了資料查詢語句select)語句事件。

binlog日誌對於mysql資料庫來說是十分重要的。在資料丟失的緊急情況下,可以嘗試用binlog日誌功能進行資料恢復操作。
正是由於binlog日誌以上的特性,在實際的案件取證中也可以通過binlog日誌來恢復刪除資料。
要通過binlog日誌恢復mysql資料庫刪除資料的前提:binlog日誌確定是開啟的。

檢視binlog日誌是否開啟,有以下三種方法

方法一:
開啟MySQL資料庫的配置檔案(windows系統中的配置檔案為my.ini,一般在安裝目錄的根目錄下;Linux系統中配置檔案為my.cnf,一般在/usr/local/mysql/etc/目錄下),在配置檔案中檢視log-bin=MySQL-bin有沒有被註釋掉(每行第一個字元為#號表示該行被註釋),若沒被註釋表示開啟,若被註釋表示沒有開啟。

1.jpg

方法二:
在MySQL命令列下使用show variables like ‘log_bin’;命令檢視binlog日誌是否開啟,Value的值為ON表示開啟,為OFF表示關閉。

2.jpg

方法三:


在存放資料庫的資料夾中是否存在mysql-bin.000001類似的檔案,有則表示binlog日誌功能是開啟的。

3.jpg

在資料恢復過程中會用到的binlog日誌操作命令

1、檢視所有binlog日誌列表:

在mysql命令介面輸入命令: mysql> show master logs

4.jpg

2、檢視master狀態,即最後(最新)一個binlog日誌的編號名稱及其最後一個操作事件pos結束點(Position)值:

在mysql命令介面輸入命令: mysql> show master status

5.jpg

3、重新整理log日誌,自此刻開始產生一個新編號的binlog日誌檔案:

在mysql命令介面輸入命令:mysql> flush logs

注:每當mysqld服務重啟時,會自動執行此命令,重新整理binlog日誌;在mysqldump備份資料時加 -F 選項也會重新整理binlog日誌

4、重置(清空)所有binlog日誌:

在mysql命令介面輸入命令:mysql> reset master

如何讀取binlog日誌中的內容?

1、使用mysqlbinlog自帶檢視命令法:

注: binlog是二進位制檔案,普通檔案檢視器cat more vi等都無法開啟,必須使用自帶的 mysqlbinlog 命令檢視binlog日誌與資料庫檔案在同目錄中。

Mysql安裝路徑下的bin資料夾下輸入以下命令:

C:\xampp\mysql\bin>mysqlbinlog C:\xampp\mysql\data\mysql-bin.000009

6.jpg

2、上面這種辦法讀取出binlog日誌的全文內容較多,不容易分辨檢視pos點資訊,這裡介紹一種更為方便的查詢命令在MySQL的命令介面:

在mysql命令介面輸入:mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

選項解析↓

IN 'log_name':指定要查詢的binlog檔名(不指定就是第一個binlog檔案)
FROM pos:指定從哪個pos起始點開始查起(不指定就是從整個檔案首個pos點開始算)
LIMIT [offset,]:偏移量(不指定就是0)
row_count:查詢總條數(不指定就是所有行)

刪除資料案例及操作步驟:

下面我們通過一個例項操作來完整檢視「如何通過binlog日誌恢復MySQL資料庫刪除資料。
案例介紹:
現有MySQL資料庫,其中有名為test的資料庫,其中沒有任何的表,懷疑資料被刪除,在該電腦中還發現了該資料庫的備份,備份最後被修改的時間為2018-11-21 15:27:12。
目的:
檢視是否有刪除的操作,如有刪除嘗試恢復出刪除的表的內容。
思路分析:
1、判斷資料庫是否開啟了binlog日誌的功能;
2、通過binlog日誌查詢是否有刪除的操作;
3、若刪除了資料,通過binlog日誌恢復資料庫中的內容。

下圖就是通過binlog日誌實現增量恢復資料庫刪除資料的流程:

1543372967713003284.jpg

01.判斷資料庫是否開啟了binlog日誌:

在MySQL命令列下使用show variables like‘log_bin’;命令中log_bin的Value為ON,該資料庫的binlog日誌是開啟的。

8.jpg

02.判斷資料庫是否有被刪除的操作:

1)在mysql命令介面通過show master logs;命令檢視binlog日誌列表,發現一共有8條日誌。

9.jpg

2)在mysql命令介面通過命令show binlog events in 'mysql-bin.000008';可以檢視最後兩條命令為“use ‘test‘;delete from t1,use `test`;DROP TABLE `t1`”由此可判斷出資料庫test中t1表中的內容被清空了,並且把表也刪除了。

10.jpg

03.恢復資料庫中刪除的資料:

1)由於表t1被刪除了,沒有該表的資料結構無法直接通過binlog日誌來恢復刪除的資料;但是我們在電腦中發現了該資料庫的備份,直接還原後就可以得到表t1的資料結構。(這裡不做還原的詳細解說,如果您想了解還原詳細操作步驟,可在後臺留言)。

11.jpg

恢復出的資料結構

2)備份最後修改時間為2018-11-21 15:27:12,MySQL-bin.000008的建立時間為2018‎-‎11‎-‎20 ‏‎14:15:40,可以推斷出備份後表t1的所有操作都在該日誌中。

3)在mysql命令介面使用命令show binlog events in 'mysql-bin.000008';開啟最後一個日誌檔案,找出開始和結尾的pos點,分別為:4和1223,如下圖:

12.jpg

4)提取日誌檔案該段落:
在mysql安裝介面的bin目錄下輸入一下命令:
mysqlbinlog C:\xampp\data\mysql-bin.000008 --start-position=4 --stop-position=1223 -r 1.sql,該命令把日誌檔案中的所有語句提取到了bin目錄下的1.sql中。

13.jpg

5)通過分析該sql檔案可以發現其中記錄了每一條命令的執行的時間,找到備份建立時間2018-11-21 15:27:12之後的所有命令另存為2.sql。如下圖:

14.jpg

6)另存為2.sql後,把最後兩條刪除的命令去除,直接在資料庫中執行,就可以恢復出表中的所有資料。

注意事項:

1、在恢復之前一定要確認MySQL資料庫的binlog日誌是開啟的;
2、若把表刪除一定要想辦法把表的資料結構找到,這樣才能準確的恢復出資料;
3、binlog日誌中是記錄了每條語句的執行時間的,可以通過時間來恢復;
4、在擷取插入語句的時候一定要注意不要把最後一條刪除的語句擷取到,不然恢復的資料又會被刪除。

以上就是使用binlog日誌恢復MySQL資料庫刪除資料的方法,希望上述的問題解決思路能給大家一些參考和幫助。如對文中的操作、描述有任何疑問,或者有相關資料庫恢復案件協助支援也可以直接在微信公眾號後臺給我們留言。