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