1.概念理解
MySQL 的二進制日志 binlog 可以說是 MySQL 最重要的日志,它記錄了所有的 DDL 和 DML語句(除了數(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