首先, 要有一個可用的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之間的操作進行恢復. 這里有兩個要注意的地方:
- binlog文件位置要使用絕對路徑, 否則會說找不到文件, 從而無法恢復
- 后面接的 | mysql -uroot -p 不能省略, 我個人認為是恢復的時候需要登錄, 可以理解
恢復完成后, 剛剛刪除的那張表就回來了:
mysqlbinlog命令據說還有以下參數可用:
- --start-datetime:從二進制日志中讀取指定等於時間戳或者晚於本地計算機的時間
- --stop-datetime:從二進制日志中讀取指定小於時間戳或者等於本地計算機的時間 取值和上述一樣
- --start-position:從二進制日志中讀取指定position 事件位置作為開始。
- --stop-position:從二進制日志中讀取指定position 事件位置作為事件截至