admin

Mysql binlog 日志查看
首先,通过以下命令,可以查看到Mysql有关binlog的参数配置:# show variables like '...
扫描右侧二维码阅读全文
23
2018/11

Mysql binlog 日志查看

首先,通过以下命令,可以查看到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 的可以去尝试下)。

Last modification:November 23rd, 2018 at 04:21 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment