使用mysqlbinlog查看MySQL二进制文件内容
一般都可以通过以下命令将二进制格式的binlog转换为方便查看的文本输出。下面会详细讲解各个参数的作用。
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -vv binlog.000130
目录
MySQL的二进制日志由包含“ 事件 ”(event)的文件组成,这些 事件描述了对数据库内容的修改。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 mysqlbinlog实用程序。你还可以使用 mysqlbinlog显示复制设置中从属服务器写入的中继日志文件的内容,因为中继日志的格式与二进制日志相同
statement格式记录的二进制日志
mysqlbinlog mysql-bin.000021
在binlog的格式为statement时,使用上面的命令查看二进制文件,会显示出SQL语句,其他输出的详细说明如下。
截取输出中的一段进行说明
- at 652 表示该时间的起始位置 或者 该时间 event在为禁止文件中的偏移量
- 200508 21:55:22 该日期和时间指示该语句在事件执行(发生)的服务器上何时启动。为了进行复制,此时间戳会传递到从属服务器。
- server id 101 事件执行(发生)的服务器的值。
- end_log_pos 652 指示下一个事件的开始位置(即,当前事件的结束位置+ 1)
- Query 事件类型
- thread_id=3 指示哪个线程执行了事件
- exec_time=0 是在主服务器上执行事件所花费的时间
复制延迟的指标 是如何计算的 On a slave, it is the difference of the end execution time on the slave minus the beginning execution time on the master. The difference serves as an indicator of how much replication lags behind the master
- error_code=0 指示执行事件的结果。零表示没有错误发生。
- update t set user_name='yanhaihang' where id = 5 可以看到执行的SQL语句
row格式的二进制日志
二进制日志格式为row格式,binlog中会有row events,比如 Update_rows event
mysqlbinlog mysql-bin.000022
当使用上面的命令查看二进制日志文件时,默认情况下 ,二进制日志是以编码为base-64字符串的binlog语句显示这些行事件,显示如下(看不懂数据库到底做了什么 o(╥﹏╥)o)
mysqlbinlog -v mysql-bin.000022
加上参数 -v 或--verbose 可以 以注释的伪SQL语句 去看这些行事件
mysqlbinlog -v -v mysql-bin.000022
使用两次 -v -v 或者 -vv 或者 --verbose --verbose可以额外显示字段的类型以及字段的一些元数据信息。更加详细了
mysqlbinlog -vv --base64-output=DECODE-ROWS mysql-bin.000022
加上--base64-output=DECODE-ROWS 选项后,行事件的binlog语句(那些看不懂的字符串)就不再显示。(*^▽^*)
选项 --base64-output=DECODE-ROWS -v 组合成为一个只看注释的伪SQL便捷组合。
--base64-output=never 如果为never 则遇到行事件报错退出
ERROR: --base64-output=never specified, but binlog contains a Update_rows event which must be printed in base64.
其他选项参数
--no-defaults 不会去读取一些默认的配置文件,因为读取这些文件的时候使用mysqlbinlog会报错。加上这个选项后可以避免读取配置文件而报错
--server-id=
仅显示该server_id的服务器创建的事件。你可以这么理解!是一个过滤选项,只过滤出该server_id的时间。像--databas 一样,只显示该库的时间id
更多的选项参考官方文档
https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html#option_mysqlbinlog_server-id