开发者社区 > 博文 > 如何看到binlog中执行的sql?
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

如何看到binlog中执行的sql?

  • 京东云技术交付部
  • 2021-01-26
  • IP归属:未知
  • 181000浏览

线上rds,如果需要查看实际执行的语句,是看不到的,解析binlog只能看到具体sql的变化。

比如update t3 set a=now()这个语句,如果直接mysqlbinlog查看是经过base64加密的文本:
mysqlbinlog mysql_bin.000009
# at 2549
#200907 17:42:44 server id 1  end_log_pos 2609 CRC32 0x855e560b         Update_rows: table id 112 flags: STMT_END_F

BINLOG '
lABWXxMBAAAALAAAAPUJAAAAAHAAAAAAAAEAA2RiMQACdDMAAQoAAXihZ7s=
lABWXx8BAAAAPAAAADEKAAAAAHAAAAAAAAEAAgAB///+AAAA/ifJD/4AAAD+J8kP/gDGD/4nyQ8L
Vl6F
'/*!*/;

如果想看实际sql,实际看到的是下面的样子:
mysqlbinlog --base64-output=decode-rows -vv  mysql_bin.000009

# at 2549
#200907 17:42:44 server id 1  end_log_pos 2609 CRC32 0x855e560b         Update_rows: table id 112 flags: STMT_END_F
### UPDATE `db1`.`t3`
### WHERE
###   @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */
### SET
###   @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */
### UPDATE `db1`.`t3`
### WHERE
###   @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */
### SET
###   @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */
### UPDATE `db1`.`t3`
### WHERE
###   @1='2019:00:00' /* DATE meta=0 nullable=1 is_null=0 */
### SET
###   @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

修改的每行都对应有一个update语句,记录了每行的改变。

但仍然看不出来之前执行的语句。

mysql
提供了一个参数,可以在binlog中记录实际sql,且类型为Rows_query,重放时不会导致语句重复执行:
设置语句如下:
set binlog_rows_query_log_events=on;
此时查看binlog,发现多了一部分内容:
# at 2460
# at 2460
#200907 17:42:44 server id 1  end_log_pos 2505 CRC32 0x65ba7849         Rows_query
# update t3 set a=now()   
# at 2505
#200907 17:42:44 server id 1  end_log_pos 2549 CRC32 0xbb67a178         Table_map: `db1`.`t3` mapped to number 112
# at 2549
#200907 17:42:44 server id 1  end_log_pos 2609 CRC32 0x855e560b         Update_rows: table id 112 flags: STMT_END_F
### UPDATE `db1`.`t3`
### WHERE
###   @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */
### SET
###   @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */
### UPDATE `db1`.`t3`
### WHERE
###   @1='0000:00:00' /* DATE meta=0 nullable=1 is_null=0 */
### SET
###   @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */
### UPDATE `db1`.`t3`
### WHERE
###   @1='2019:00:00' /* DATE meta=0 nullable=1 is_null=0 */
### SET
###   @1='2020:09:07' /* DATE meta=0 nullable=1 is_null=0 */

红字显示了实际sql,通过这种方式,可以不打开general_log,达到记录dml语句的目的,但无法记录select操作。


在此感谢各位童鞋阅读,如果能够对大家有所帮助,欢迎点赞转发。

同时欢迎扫码关注京东云技术中台团队的公众号:云服务飞行团;更多精彩内容会持续放送!

 

共0条评论