Mysql如何通過binlog日誌恢復數據詳解

MySQL的binlog日誌是MySQL日誌中非常重要的一種日誌,記錄了數據庫所有的DML操作。通過binlog日誌我們可以進行數據庫的讀寫分離、數據增量備份以及服務器宕機時的數據恢復。

定期備份固然可以在服務器發生宕機的時候快速的恢復數據,但傳統的全量備份不可能做到實時,所以在發生宕機的時候,也會損傷一部分數據,如果這個時候開啓了binlog日誌,那麼可以通過binlog來對沒有做備份的這一階段損失的數據進行恢復

Binlog日誌,即binary log,是二進制日誌文件,有兩個作用,一個是增量備份,另一個是主從複製,即主節點維護一個binlog日誌文件,從節點從binlog中同步數據,也可以通過binlog日誌來恢復數據

方法如下

1,登錄mysql查看binlog日誌的狀態,輸入show variables like ‘%log_bin%’;查看binlog爲off關閉狀態

2,開啓mysql binlog日誌,進入mysql配置文件(vi /etc/my.cnf) 在mysqld區域內添加如下內容,①server-id = 1(單個節點id) ②log-bin= /var/lib/mysql/mysql-bin(位置一般和mysql庫文件所在位置一樣) ③expire_logs_days = 10(表示此日誌保存時間爲10天),重啓mysqld,再次查看binlog日誌開啓狀態爲ON

3,Binlog日誌包括兩類文件;第一個是二進制索引文件(後綴名爲.index),第二個爲日誌文件(後綴名爲.00000*),記錄數據庫所有的DDL和DML(除了查詢語句select)語句事件

4,查看所有binlog日誌文件列表:show master logs;

5,查看最後一個binlog日誌的編號名稱及其最後一個操作事件pos結束點的值:show master status;

6,Flush logs 刷新日誌,此刻開始產生一個新編號的binlog文件,例如:

每當mysqld服務重啓時,會自動執行刷新binlog日誌命令,mysqldump備份數據時加-F選項也會刷新binlog日誌

7,清空所有binlog日誌命令:reset master;

8,查看binlog文件內容,使用查看工具mysqlbinlog來查看(cat/vi/more都是無法打開的)

9,上面的方法讀取內容較多不易觀察,以下命令更爲方便查看命令:show binlog events in ‘mysql-bin.000003’;

10,指定查詢,從pos點406開始查詢,如下:

11,指定查詢,從pos點154開始查詢,中間跳過2行,查詢4條數據,如圖:

12,利用binlog日誌恢復mysql數據,例如,現有一張數據表如圖:此表位於hello數據庫

現在將此數據庫備份到本地(模擬每週的備份情況),備份命令如下

可以在數據備份之前或者之後執行flush logs重新生成一個binlog日誌用來記錄備份之後的所有增刪改操作(重新生成日誌更好找pos點),由於業務需求,現在對錶進行插入

數據,修改數據,如圖新增了兩條數據id 爲5和6,修改後數據如圖,

6的年齡修改成了30

13,由於操作失誤,誤刪除了數據庫,所有數據都不見了,此時可以通過binlog日誌恢復數據,由於之前有做了數據庫備份,所以可以先將備份的數據導入進去,剩下缺少的就是備份之後操作所產生的內容(備份之後執行了插入內容以及更改內容),先恢復備份的數據:創建庫hello並選擇庫(use hello),通過命令source /root/hello.sql將數據庫內容導入,然後執行

14,恢復的內容如下所示:

15,上面恢復的數據只是截止到備份時間的數據,剩下缺少的數據可以通過binlog日誌來恢復,由於我們備份數據庫之前重新創建了mysql-bin.000006日誌,所以備份後的所有操作都保存在這個日誌中,可以先備份下這個日誌文件,cp mysql-bin.000006 /root/ 接着執行flush logs 刷新日誌,重新創建了一個binlog日誌7

16,重新創建一個日誌7的目的:接下來所有操作的數據都會寫入到日誌7中,日誌6中不會在寫入任何數據(方便根據日誌6的內容恢復數據,因爲日誌6的數據就是備份之後到刪庫之前的所有操作日誌,重建日誌7不會有過多的數據影響恢復)

17,登錄mysql 查看日誌6: show binlog events in ‘mysql-bin.000006’;結果如下:

查看日誌發現,在備份數據後首先執行的是插入數據操作(在一個事務內),此時可以通過指定pos結束點恢復(部分恢復),如圖,pos結束點位435(事務已提交表示結束),執行命令如下, /usr/bin/mysqlbinlog --stop-position=435 --database=hello /var/lib/mysql/mysql-bin.000006 | /usr/bin/mysql -uroot -p密碼 -v hello (其中整個命令的含義是通過mysqlbinlog讀取日誌內容並通過管道傳給mysql命令,-v表示執行此mysql命令)執行後查詢表發現如下:

備份之後插入的數據都出現了,目前還差一次修改的數據沒有找回來,接着看日誌6如圖,

發現執行更新操作的事務區間爲573到718,所以可以執行以下命令來恢復這段數據,/usr/bin/mysqlbinlog --start-position=573 --stop-position=718 --database=hello /var/lib/mysql/mysql-bin.000006 | /usr/bin/mysql -uroot -p密碼 -v hello注意其中的符號都是英文狀態下(只恢復這段事務區間的數據也就是更新的數據),恢復結果如下:

更改的數據回來了,也可以最開始的時候直接通過最終的pos結束點718來恢復

18,還有一種通過時間來恢復,還是先備份當前數據庫(備份之前先flush logs創建一個新的binlog日誌文件9),然後修改數據插入數據後如圖,

修改後將當前數據庫刪除,(刪除庫之後再執行一下flush logs創建一個新的日誌文件,這樣新的操作都寫入到這個文件中,上個日誌文件只用來恢復數據,不會有其餘數據混入)現在我們通過時間點來恢復從備份數據後到刪除數據庫這期間所有操作的數據,首先通過mysqlbinlog來了查看日誌文件9如圖所示,

19,執行命令:/usr/bin/mysqlbinlog --start-datetime="2018-04-27 20:57:55" --stop-datetime="2018-04-27 20:58:18" --database=hello /var/lib/mysql/mysql-bin.000009 | /usr/bin/mysql -uroot -p8856769abcd -v hello 更改的數據得到了恢復

20,插入數據的日誌時間如圖:

執行命令/usr/bin/mysqlbinlog --start-datetime="2018-04-27 20:58:18" --stop-datetime="2018-04-27 20:58:35" --database=hello /var/lib/mysql/mysql-bin.000009 | /usr/bin/mysql -uroot -p8856769abcd -v hello 插入的數據得到了恢復,如圖,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章