mysql從binlog恢復數據


首先, 要有一個可用的mysql, 安裝步驟在這里不表了, 之前文章里有一篇介紹安裝的.

1. 開啟binlog.

為了可以從binlog里恢復, 首先要開啟記錄binlog:

cat /etc/my.cnf

添加如下幾行:

log-bin=mysql-bin  #表示開啟binlog, 且binlog物理文件在/var/lib/mysql/mysql-bin.000000x, 同一目錄下還有一個mysql-bin.index文件
sync_binlog=1  #每次事物提交都把binlog寫入到磁盤里, 這個很重要, 如果不開啟, 在做主從復制的時候有可能造成主從數據不一致
innodb_support_xa=1  #開啟xa分布式事物支持, 也是為通過內部xa事務保證binlog和實際數據一致
binlog_format=ROW  #binlog格式為ROW, 三個可選項: STATEMENT, ROW, MIXED
server-id=7  #一定要寫這個, 如果只配置log-bin而不配置這一項, mysql服務將因報錯而會無法啟動, 據說推薦寫成服務器IP最后一位

修改好之后, 重啟mysql服務:

systemctl restart mysqld.service

好了, 現已開啟了binlog了, 可以在 /var/lib/mysql下找到如下文件:

 

先登錄進去mysql的命令行( mysql -uroot -pxxxxxx ), 看一下狀態:

可以看到當前是使用mysql-bin.000001這個文件來記錄binlog的. 當前位置是154, 我觀察到對每個binlog在文件, 當還沒有什么操作的時候, 位置都會是154.

也可以看一下binlog相關的幾個變量:

 

2. 測試恢復數據

下面添加一些測試數據:

create database testbindb;
use testbindb;
create table test_order(id int(10), primary key(id) ) engine=innodb;
insert into test_order values(1);
insert into test_order values(2);
insert into test_order values(3);
insert into test_order values(4);
insert into test_order values(5);
insert into test_order values(6);
insert into test_order values(7);

完事看一眼表:

 

 然后刪除這個表:

drop table test_order;

然后把binlog強制寫入並重開一個binlog文件:

flush logs;

再看一眼表, 已經不在了:

 

再看一眼狀態:

可以看到已經在使用第二個binlog文件了, 相當於之前的建表, 添加測試數據, 再刪除表等操作都記錄在了mysql-bin.000001里了.

先看一眼這個binlog文件里的內容:

假設我們刪除表的操作是誤操作, 所以我們希望數據可以恢復到刪除前一個操作結束后的狀態.

使用mysqlbinlog命令可以達到目的:

mysqlbinlog /var/lib/mysql/mysql-bin.000001 --start-position 154 --stop-position 2327 | mysql -uroot -p

這里表示要把 mysql-bin.000001 文件里位置154到2327之間的操作進行恢復. 這里有兩個要注意的地方:

  1. binlog文件位置要使用絕對路徑, 否則會說找不到文件, 從而無法恢復
  2. 后面接的 | mysql -uroot -p 不能省略, 我個人認為是恢復的時候需要登錄, 可以理解

恢復完成后, 剛剛刪除的那張表就回來了:

mysqlbinlog命令據說還有以下參數可用: 

  1. --start-datetime:從二進制日志中讀取指定等於時間戳或者晚於本地計算機的時間
  2. --stop-datetime:從二進制日志中讀取指定小於時間戳或者等於本地計算機的時間 取值和上述一樣
  3. --start-position:從二進制日志中讀取指定position 事件位置作為開始。
  4. --stop-position:從二進制日志中讀取指定position 事件位置作為事件截至


免責聲明!

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



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