首先咱們來建立一個數據庫,mytestmysql
create database mytest;
接着咱們來建立一張表sql
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
參數說明:3d
-B:指定數據庫 -F:刷新日誌 -R:備份存儲過程等 -x:鎖表 --master-data:在備份語句裏添加CHANGE MASTER語句以及binlog文件及位置點信息
查看備份文件日誌
這樣呢,咱們就把數據作了一個完整的備份。下面來刪除數據庫,而後經過備份數據進行恢復數據庫。code
gzip -d bakup_xxx.gz mysql -uroot -p < bakup_xxx.sql
這樣咱們就把數據導入到庫裏了。blog
繼續上面的操作,咱們新增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 事件位置做爲事件截至