MySQL使用binlog日志做數據恢復的實現
MySQL的binlog日志是MySQL日志中非常重要的一種日志,記錄瞭數據庫所有的DML操作。通過binlog日志我們可以進行數據庫的讀寫分離、數據增量備份以及服務器宕機時的數據恢復。
定期備份固然可以在服務器發生宕機的時候快速的恢復數據,但傳統的全量備份不可能做到實時,所以在發生宕機的時候,也會損傷一部分數據,如果這個時候開啟瞭binlog日志,那麼可以通過binlog來對沒有做備份的這一階段損失的數據進行恢復。如果瞭解Redis的朋友,可能想到瞭,Redis有兩種持久化方式,分別是AOF和RDB。RDB就類似於MySQL的全量復制,AOF就類似於MySQL的binlog。
關於數據的恢復這裡在說一點,既然binlog這麼好,是不是開啟瞭binlog就不需要定期做備份瞭呢,不要這樣做。為什麼呢,因為binlog的數據量非常大,另外就是使用binlog做數據的恢復性能會非常低。因為binlog是對操作的記錄,比如某一時刻,我先插入瞭一條數據,然後將這條數據刪除瞭,本身數據是沒瞭,但有兩條操作。如果是全量備份,肯定沒有這條數據,如果使用binlog需要執行一條插入和一條刪除操作,因此性能和文件大小都是比較大的。
囉嗦瞭一堆,下面說關於數據恢復的問題:
在正式開始之前,先來說一說mysql完整備份數據庫,以及恢復數據庫的方法
備份數據庫:
首先我們來創建一個數據庫,mytest
create database mytest;
接著我們來創建一張表
use mytest; create table t1(id int ,name varchar(20));
然後我們插入兩條數據
insert into t1 values (1,'xiaoming'); insert into t1 values (2,'xiaohong');
下面我們對mytest數據庫進行備份,備份到/root/bakup/
mysqldump -uroot -p -B -F -R -x --master-data=2 mytest | gzip > /root/backup/bak_$(date +%F).sql.gz
參數說明:
-B:指定數據庫
-F:刷新日志
-R:備份存儲過程等
-x:鎖表
–master-data:在備份語句裡添加CHANGE MASTER語句以及binlog文件及位置點信息
查看備份文件
這樣呢,我們就把數據做瞭一個完整的備份。下面來刪除數據庫,然後通過備份數據進行恢復數據庫。
gzip -d bakup_xxx.gz mysql -uroot -p < bakup_xxx.sql
這樣我們就把數據導入到庫裡瞭。
繼續上面的操做,我們新增xiaoli和xiaozhao這兩條數據,並把xiaozhao這條記錄刪除掉。
在刪除之前,我們先來刷新binlog日志,生成一個新的日志,那麼我們之後所要操做的內容都會被記錄到新的日志文件中。(通過前面binlog日志的詳細說明我們知道,每次刷新和服務重啟的時候,都會生成一個binlog日志文件。)
flush logs; show master status;
我們註意,binlog的文件是0009,位置是在154,這兩個信息很重要
下面我們來做插入和刪除操作
這個時候我們應該是來查看一下binlog日志的狀態,以便與我們一會來進行恢復到此狀態,但是,真正的環境中我們並不知道這個狀態,因此這裡也就不去查看這個狀態瞭,這個狀態的值可以通過後面查看binlog日志文件來進行分析。下面我們開始誤操作:
我們來把xiaozhao刪除掉
這樣數據就刪除掉瞭,下面我們再來查看binlog的狀態
show master status;
這個時候我們發現我刪除操作是個錯誤的操作,要進行恢復,那麼該如何恢復呢?這個時候我們就可以通過binlog的position來進行恢復。
在進行其他的處理之前,我們建議,馬上再執行一次flush logs,也就是讓出錯的部分就集中在這麼一個binlog日志文件中。
我們來查看0009的binlog日志。
我們看到delete_rows 結束點是928這個點,起始點是在755這個點,我們可以把操作的這些數據刪除到我們上次備份的內容,然後通過執行binlog來進行恢復,當然恢復到755這個點之前。
比如我上次備份的是整個數據庫,我就可以把整個數據庫刪除,然後通過備份文件恢復,然後再通過binlog做增量恢復。這樣數據就回來瞭。這裡就不再進行刪庫瞭,我們直接演示使用binlog日志恢復數據的方法
語法如下
mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數據庫名
比如我們要把所有的操作都恢復(不包括我們的刪除,我們知道刪除是在755點上):
mysqlbinlog mysql-bin.000009 --start-position 154 --stop-position 755 | mysql -uroot -p mytest
再來查看表
我們發現xiaozhao又回來瞭,當然瞭,這裡多瞭一個xiali,是因為我之前並沒有刪除備份前的數據。當然瞭,我們在恢復的過程中可以選擇隻恢復xiaozhao這麼一塊內容
下面是binlog日志恢復中一些常用的參數
–start-datetime:從二進制日志中讀取指定等於時間戳或者晚於本地計算機的時間
–stop-datetime:從二進制日志中讀取指定小於時間戳或者等於本地計算機的時間 取值和上述一樣
–start-position:從二進制日志中讀取指定position 事件位置作為開始。
–stop-position:從二進制日志中讀取指定position 事件位置作為事件截至
到此這篇關於MySQL使用binlog日志做數據恢復的實現的文章就介紹到這瞭,更多相關MySQL binlog數據恢復內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- mysql5.7使用binlog 恢復數據的方法
- MySQL數據庫通過Binlog恢復數據的詳細步驟
- MySQL的binlog日志使用詳解
- MySQL 配置主從復制實踐分享
- mysql備份策略的實現(全量備份+增量備份)