Mysql binlog 日志查看 时间: 2018-11-23 16:21 分类: mysql,数据库 首先,通过以下命令,可以查看到`Mysql`有关`binlog`的参数配置: > \# show variables like '%binlog%'; 除此之外,还可以通过以下命令查看与`binlog`的相关配置: > \# show variables like '%binlog%'; 有关变量的作用就不一一介绍了,这里我也就主要了解了几个变量的作用: 1. `binlog_format`日志格式:STATEMENT、ROW、MIXED 2. `log_bin`二进制日志开关:0 关闭,1 开启 3. `log_bin_basename`日志文件名 4. `log_bin_index`日志文件索引 `binlog`的作用不仅仅可以用来还原数据(误删)、还能用作主从同步。 除了上面两个主要的作用以外,有时候它也能够帮我们定位线上系统的问题,由于系统中的日志不可能针对所有的数据库操作都进行日志输出,所以有时候一旦数据出了问题,从系统层面是很难找到原因的。 比如我现在有个车辆里程表,里面记录了每台车每天行驶的总里程,而这个里程是由车上设备定时上报的,也就是定时累加更新到数据库的,某天发现所有车辆的里程数都变得非常大,到底是设备的原因还是系统的原因呢?由于我们数据库表中只记录了每天的里程最后统计值,定时更新的过程肯定是不会记录的,这个时候就需要去查看数据库的日志了(前提是开启日志)。 由于`binlog`是二进制存储的,所以肯定不能用`vim`去查看了,所以一开始使用如下命令去查看`binlog`日志: > \# mysqlbinlog --no-defaults --database=vehicle --start-datetime="2018-11-22 00:00:00" --stop-datetime="2018-11-23 23:59:59" -v mysql-bin.000386 | more 结果发现里面并没有任何 sql 语句,第一眼就是 sql 用 BASE64 编码了,但即使复制出来用 BASE64 解码还是有部分乱码现象,我们也不可能把每个 sql 都复制出来解码。 于是通过搜索发现可以通过添加`--base64-output=DECODE-ROWS`来查看: > \# mysqlbinlog --no-defaults --database=vehicle --start-datetime="2018-11-22 00:00:00" --stop-datetime="2018-11-23 23:59:59" --base64-output=DECODE-ROWS -v mysql-bin.000386 | more 此时查看的 sql 日志是这样子的: ``` #181122 7:55:56 server id 1001 end_log_pos 827198 CRC32 0xeee859e1 Update_rows: table id 11617 flags: STMT_END_F ### UPDATE `vehicle`.`nd_vehicle_mileage_day` ### WHERE ### @1='b56c5c88edd711e8bb8200163e046f21' ### @2='6A566C71BF9304C8E0530501A8C0F929' ### @3=160.80 ### @4='2018:11:22' -- #181122 7:55:56 server id 1001 end_log_pos 828455 CRC32 0xb07e419b Table_map: `vehicle`.`nd_vehicle_mileage_day` mapped to number 11617 ``` 上面的格式对我来说,只要有更新的参数值就够了,所以也不用看到完整的 sql,我的数据库配置`binlog_format`的值是`ROW`,所以解码了是上面的结果,如果想要看到完整的 sql,貌似需要将`binlog_format`设置为`STATEMENT`(没有去实践测试了,需要查看完整 sql 的可以去尝试下)。 标签: 无