有了binlog日志,我们可以实现主从架构,可以用canal、maxwell等工具实现将MySQL数据同步到大数据环境;同时可以对binlog进行解析,可以实现快速的数据恢复(Flashback),如使用binlog2sql、Myflash、Mariadb mysqlbinlog等,要实现这些功能,对binlog的详细了解是有必要的。

一. binlog配置

要启动非常简单,通过配置log_bin选项即可启用binlog,5.7需要同时设置server_id参数,8.0开始server_id默认值为1

   常见配置参数如下:

log-bin=/mysql_data/mysql-bin
log-bin-index=/mysql_data/mysql-bin.index
binlog-rows-query-log-events = 1   ###on/off
expire_logs_days = 15
###二进制日志自动删除/过期的天数。默认值为0,表示不会自动删除。
15
表示日志保留15天,超过15天则设置为过期

  #关于过期日志自动删除补充:
  #Q:在什么时间会删除过期日志?
  #A:每次进行 LOG flush的时会自动删除过期的日志。
 
  #Q:什么时间才能触发log flush,手册上的解释为:

  #A:1. 重启;
  #   2. BINLOG文件大小达到参数max_binlog_size限制;
  #   3. 手工执行命令。

log_expire_logs_seconds = 604800   ####在MySQL8.0版本中新增参数binlog_expire_logs_seconds,可以精确到秒,而此前版本中expire_logs_days的单位为天,最小值为1
log_slave_updates=1

 ####################################

MySQL expire_logs_days 参数用于控制Binlog文件的保存时间,当Binlog文件存在的时间超过该参数设置的阈值时,Binlog文件就会被自动清除,该参数的时间单位是天,设置为0,表示Binlog文件永不过期,即不自动清除Binlog文件。

在MySQL 8.0 版本,expire_logs_days参数被废弃,使用新的参数binlog_expire_logs_seconds代替,新参数的时间粒度是秒,能够更加灵活的控制Binlog文件过期时间。

####################################


log-slave-updates参数默认时关闭的状态

从库做为其他从库的主库时 log-slave-updates参数是必须要添加的,因为从库要作为其他从库的主库,必须添加该参数。该参数就是为了让从库从主库复制数据时可以写入到 binlog日志,为什么要用这个参数写binlog日志呢,不是在配置文件中开启log-bin = /data/3307/mysql-bin选项就可以吗?

  答:从库开启log-bin参数,如果直接往从库写数据,是可以记录log-bin日志的,但是从库通过I0线程读取主库二进制日志文件,然后通过SQL线程写入的数据,是不会记录binlog日志的。也就是说从库从主库上复制的数据,是不写入从库的binlog日志的。所以从库做为其他从库的主库时需要在配置文件中添加log-slave-updates参数。

################################################

binlog_format = row
max_binlog_size=1Gb
inlog_cache_size=32768
max_binlog_cache_size=4
Grelay_log = relay-log
relay_log_recovery = 1
relay_log_purge=0  #####
 mha 场景下 disable
binlog_checksum=CRC32
sync_binlog = 1
gtid_mode = 1
force_gtid_consistency = 1
binlog_transaction_dependency_tracking=WRITESET
#版本是 5.7.22

相关参数解释:

binlog-rows-query-log-events使用ROW格式时可以在binlog日志里面记录一条Rows_query事件,即实际的SQL语句;

binlog保留时长 mysql purge binlog默认保存时间_mysql

二. 查看binlog

生成的binlog日志如何查看呢?有两种方式,使用SHOW BINLOG EVENTS命令和mysqlbinlog工具。 

show binlog events命令:可以在mysql客户端执行命令查看对应binlog文件中的事件;没有指定文件名时默认是查看第一个日志文件的事件。

# 查看有哪些binlog日志文件show binary logs;# 查看binlog 事件SHOW BINLOG EVENTS> [IN 'log_name']> [FROM pos]> [LIMIT [offset,] row_count]

binlog保留时长 mysql purge binlog默认保存时间_mysql_02

 

 

 

mysqlbinlog工具:

通过mysqlbinlog工具可以查看二进制日志文件或relay log内的事件,使用-vv可以显示出row格式的行信息,使用--start-datetime/--stop-datetime,--stop-position/--start-position 可以指定事件的开始/结束时间或位点。

 

使用--read-from-remote-server/--read-from-remote-master可以从远程服务器读取日志,并能写入到本地文件,或持续进行日志接收(实现备份,binlog server)。

read-from-remote-master支持选项BINLOG-DUMP-NON-GTIDS(非gtid模式下)和BINLOG-DUMP-GTIDS,使用BINLOG-DUMP-GTIDS可以结合--exclude-gtids实现事件过滤。

# 读取远程服务器的日志mysqlbinlog \--read-from-remote-server \--host=10.82.30.102 \--port=3308 \--password \--user=yau  \--stop-position=125 \mysql-bin.000041 # 使用read-from-remote-master选项从远程# 服务器读取日志mysqlbinlog \--read-from-remote-master=BINLOG-DUMP-NON-GTIDS \--host=10.82.30.102 \--port=3308 \--password \--user=yau  \--stop-position=125 \mysql-bin.000041

结合使用--stop-never、--connection-server-id=#、--raw选项可以实现远程实时备份binlog;

使用--result-file/-r指定保存事件的文件名;结合--raw选项,文件名为前缀名称;

mysqlbinlog \--read-from-remote-master=BINLOG-DUMP-NON-GTIDS \--host=10.82.30.102 \--port=3308 \--password \--user=yau  \--stop-never \--connection-server-id=1002 \--result-file=backup102- \--raw \mysql-bin.000042

下图为查看备份的日志,文件名用指定的前缀+源端二进制日志的文件名;

binlog保留时长 mysql purge binlog默认保存时间_文件名_03

三. binlog事件 

binlog_event.h中的Log_event_type定义了事件的各种类型,5.7.22有38种事件类型;每个日志文件开头有一个Format_desc事件,日志文件结尾有一个Rotate事件,表示日志结束。所有binlog事件都有一个通用的结构,由事件头和事件数据组成;每个版本的事件内容不同。事件头包括事件创建时间,server_id等信息;事件数据部分为具体的数据修改;

binlog保留时长 mysql purge binlog默认保存时间_数据_04