MYSQL bin_log 開啓及數據恢復

參考博客:

A:https://www.jianshu.com/p/55b0d52edca2

B:https://www.cnblogs.com/martinzhang/p/3454358.html

C:https://www.cnblogs.com/xxoome/p/9802684.html

 

本文基於Mysql 5.7.27,Centos7.4。

1:如何開啓bin_log

1.1:查看是否開啓bin_log

1.2:修改mysql配置文件,開啓bin_log

(1)我的配置文件在 /etc/my.cnf,也可以使用 whereis my.cnf 查看位置。

 注意點:

1.binlog_format 有三種格式,分別是STATEMENT、ROW、MIXED。自5.7.7之後默認爲ROW 格式。具體區別可自行百度之。

2.mysql-bin-log 爲日誌文件前綴,生成的日誌文件格式爲 mysql-bin-log.000001 。

(2)重啓mysql,在檢查bin_log 是否開啓

 

   上述則表示已成功開啓bin_log 了,後面開始進行數據恢復測試。

2:如何恢復數據

(1)方便測試,可以導入一下數據:

###建庫:
CREATE DATABASE `back_master` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';

### 建表
CREATE TABLE `back_master`.`tb_user`  (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);
### 插入數據
insert into tb_user(name) values('wew'),('1233'),('sdsa'),('wqewq');
測試sql

(2)常用binlog日誌操作命令
1.查看所有binlog日誌列表
  mysql> show master logs;

2.查看master狀態,即最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)值
  mysql> show master status;

3.刷新log日誌,自此刻開始產生一個新編號的binlog日誌文件
  mysql> flush logs;
 注:每當mysqld服務重啓時,會自動執行此命令,刷新binlog日誌;在mysqldump備份數據時加 -F 選項也會刷新binlog日誌;

4.重置(清空)所有binlog日誌
  mysql> reset master;

(3)binlog_format=Row 模式下查看sql命令

1.按時間
  /usr/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin-log.000007 \
  --start-datetime="2020-05-11 17:00:00" \
  --stop-datetime="2020-05-11 18:00:00"
2.按節點
  /usr/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin-log.000001 \
  --start-position=454 \
  --stop-position=665

3. 在mysql 中顯示某個文件的具體幾條

  show binlog events in 'mysql-bin-log.000001' from 1 limte 10 ;

2.1:單恢復某個表

(1)導入數據,然後刪除表 tb_user

 (2)進入bin_log 日誌文件夾,使用命令查看 SQL 日誌。

我們在刪除tb_user 之前,日誌是放在 msysql-bin-log.000002 中的,因此我們查看這個文件的日誌即可。

命令/usr/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin-log.000002

 部分截圖:

 因爲binlog_format 格式是ROW,因此在Mysql 中使用命令 show binlog events in 'mysql-bin-log.000002'  是無法看到sql的。

 可以看到在 pos=1044 之後進行了表刪除操作,因此我們要恢復數據的話,mysqlbinlog 讀取的節點應該在 pos=665 和 pos=1044 之間。

 命令:/usr/bin/mysqlbinlog --start-position=454 --stop-position=1044  mysql-bin-log.000002 | mysql -uroot -pZgq@123456 -v back_master

 部分截圖:

 

 可以看到數據被成功恢復了。

2.2:刪庫之後進行數據恢復

本人重新導入數據,並把本次實驗日誌寫到 mysql-bin-log.00005 文件中。所以可以看到:

 執行命令:/usr/bin/mysqlbinlog --stop-position=1033  mysql-bin-log.000005 | mysql -uroot -pZgq@123456 -v 

可以看到:

 

庫結構、表結構、數據都得到恢復了。

2.2.1:爲什麼我要把刪除和刪表分開描述

那爲什麼我要單獨廢話再講一遍?因爲筆者在這裏走了彎路。明明一句命令就可以搞定,因爲操作不當,走了彎路,

因此特意提醒,留心!

我復現一下:

1:我flush logs 生成新的log 文件,重新導入數據,然後直接刪庫(與2.2的前置操作一樣)

log 日誌:

 

2:使用命令 /usr/bin/mysqlbinlog --stop-position=1033  mysql-bin-log.000005 | mysql -uroot -pZgq@123456 -v back_master 

報錯:提示庫不存在

3:使用命令 /usr/bin/mysqlbinlog --stop-position=1033  --database=back_master mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v

執行到最後報錯:提示表不存在

 此時我已不在 mysql-bin-log.000008 中寫入日誌了,因此我再次刪庫以方便第四次測試

4:使用命令 

(1)恢復庫結構

  /usr/bin/mysqlbinlog --start-position=219 --stop-position=454  --database=back_master mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v

執行結果:成功

(2)恢復表結構及數據

  /usr/bin/mysqlbinlog --start-position=454 --stop-position=1033  --database=back_master mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v 

執行到最後報錯:提示表不存在

顯然恢復表結構和表數據失敗了。換個思路,執行命令:

(3)再次嘗試恢復表結構和數據

  /usr/bin/mysqlbinlog --start-position=454 --stop-position=1033  mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v back_master

執行結果:成功

5:總結原因

(1):恢復庫結構的時候,可以附帶參數 --database=back_master 但不能在 -v 後面帶 back_master

(2):恢復表結構和數據的時候,不可以附帶參數 --database=back_master,但是 -v 後面可以帶 back_master

 但凡我再聰明點也不會吃這個虧了啊。。

2.2.2:binlog_format由Row改Statement後不立即生效

日誌對比:

 

設置爲statement 之後沒有立即生效

隔了大概半個小時生效了

咱也不知道爲啥。。。

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