通過Binlog恢復(fù)數(shù)據(jù)

1.概念理解

MySQL 的二進制日志 binlog 可以說是 MySQL 最重要的日志,它記錄了所有的 DDLDML語句(除了數(shù)據(jù)查詢語句select、show等),以事件形式記錄,還包含語句所執(zhí)行的消耗的時間,MySQL的二進制日志是事務(wù)安全型的。binlog 的主要目的是復(fù)制和恢復(fù)。

2.開啟Binlog

找到mysql的配置文件,如:我的mysql配置文件在/etc/mysql/mysql.conf.d/mysqld.cnf

#binlog的存儲路徑
log_bin       = /var/log/mysql/mysql-bin.log
#binlog的日志格式,詳見標題5
binlog_format = STATEMENT
#binlog的自動清除時間 這里設(shè)置的是10天
expire_logs_days = 10
#binlog文件的最大容量,超過就會生成新的binlog文件
max_binlog_size   = 100M

然后需要重啟mysql,我的是sudo service mysql restart

3.常用的Binlog操作命令

# 是否啟用binlog日志
show variables like 'log_bin';

# 查看詳細的日志配置信息
show global variables like '%log%';

# mysql數(shù)據(jù)存儲目錄
show variables like '%dir%';

# 查看binlog的目錄
show global variables like "%log_bin%";

# 查看當前服務(wù)器使用的biglog文件及大小
show binary logs;

# 查看主服務(wù)器使用的biglog文件及大小

# 查看最新一個binlog日志文件名稱和Position
show master status;

4.什么時候?qū)態(tài)inlog

binlog什么時候?qū)懭氪疟P更sync_binlog參數(shù)有關(guān),改參數(shù)可以設(shè)置為0或者大于0的數(shù)

  • 設(shè)置為0:mysql不會控制binlog的寫入,是由文件系統(tǒng)來控制的
  • 設(shè)置為大于0: 每sync_binlog次事務(wù),mysql會調(diào)用文件系統(tǒng)把binlog寫入磁盤

sync_binlog設(shè)置為1是最安全的,每次只會丟失一個事務(wù)的更新

5.Binlog的日志格式

Binlog日志有三種格式,分別為:

  • STATEMENT:基于sql語句的復(fù)制,mysql 5.7.7之前默認為該格式
  • ROW: 基于行的復(fù)制,mysql 5.7.7之后默認為該格式
  • MIXED:混合模式復(fù)制

個人建議:binlog_format設(shè)置為STATEMENT,因為在遷移某張表的數(shù)據(jù)時,在遷移過程中產(chǎn)生的增刪改都會以sql語句的形式記錄在日志文件中,可以根據(jù)自己的需求對binlog文件進行過濾

6.mysqlbinlog命令的使用

binlog文件中的內(nèi)容是以二進制格式寫入的,如果想要以文本格式顯示內(nèi)容,需要用的mysqlbinlog命令

# mysqlbinlog 的執(zhí)行格式
mysqlbinlog [options] log_file ...

# 查看bin-log二進制文件(shell方式)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003

# 查看bin-log二進制文件(帶查詢條件)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \
    --start-datetime="2019-03-01 00:00:00"  \
    --stop-datetime="2019-03-10 00:00:00"   \
    --start-position="5000"    \
    --stop-position="20000"
  • --start-datetime--stop-datetime配合使用
  • --start-position--stop-position配合使用,通過show master status;查看當前的position

如果想要把數(shù)據(jù)遷移過程中的新產(chǎn)生的增刪改同步到新的數(shù)據(jù)表

1.首先查看數(shù)據(jù)庫是否開啟binlog,如果沒有,開啟binlog(詳見標題2)
2.查看配置文件中的binlog_format是否設(shè)置成STATEMENT
3.查看當前日志記錄到哪個文件和當前的position(進入數(shù)據(jù)庫中,show master status;)
4.同步數(shù)據(jù)表a數(shù)據(jù)到表a_copy
5.同步結(jié)束之后,獲取當前的positon
6.進入binlog所在目錄,執(zhí)行如下命令
# -d 選擇某個數(shù)據(jù)庫,start-position是開始做數(shù)據(jù)遷移前的position,stop-position是數(shù)據(jù)遷移之后的的positon
sudo mysqlbinlog --base64-output=decode-rows  -d plato2 --start-position=154  --stop-position=1939  mysql-bin.000009  > /home/vagrant/bak1.sql;
7.進入生成的sql文件所在目錄,執(zhí)行:
#搜索操作logs_business表的sql所在行及其下一行
grep -A 1 'logs_business_copy' bak1.sql > finded.sql
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容