有了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-binlog-bin-index=mysql-bin.indexbinlog-rows-query-log-events = 1# expire_logs_days = 15 # 8.0 deprecatedbinlog_expire_logs_seconds = 604800 # 7 dayslog_slave_updates=1binlog_format = rowmax_binlog_size=1Gbinlog_cache_size=32768max_binlog_cache_size=4Grelay_log = relay-logrelay_log_recovery = 1relay_log_purge=0 # mha 场景下 disablebinlog_checksum=CRC32sync_binlog = 1gtid_mode = 1enforce_gtid_consistency = 1binlog_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等信息;事件数据部分为具体的数据修改;