前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysqlbinlog命令详解 Part 4 -查看行事件具体SQL语句

mysqlbinlog命令详解 Part 4 -查看行事件具体SQL语句

作者头像
bsbforever
发布2020-08-19 16:48:08
1.4K0
发布2020-08-19 16:48:08
举报

前情提要

此次实验的环境如下

  • MySQL 5.7.25
  • Redhat 6.10
  • binlog模式采用row模式

前面的一些章节我们对mysqldump常用命令进行了讲解

这个专题的内容为mysqlbinlog命令的详解

mysqlbinlog是MySQL中用来处理binlog的工具

这节内容讲如何将binlog日志的行事件中的SQL提取出来

行事件包含

  • WRITE_ROWS_EVENT
  • UPDATE_ROWS_EVENT
  • DELETE_ROWS_EVENT

1. 具体命令

以下为一些命令参数的使用

在演示前请先重置binlog并新建innodb_table表,并插入一条数据

具体步骤见mysqlbinlog的第一章

1.1 只查看二进制内容

mysqlbinlog命令默认使用binlog语句将行事件以base-64字符串编码 

shell> mysqlbinlog  /path/to/log/master-bin.000001
1.png
1.png

可以看到create table是个Query事件

这里显示出了具体的建表语句,说明建表不属于行事件

2_2.png
2_2.png

BINLOG关键字后为经过编码后的二进制日志

可以看到一个insert语句包含如下事件

  • Query 事件 负责开始一个事务(BEGIN)
  • Table_map事件 负责映射需要的表
  • Write_rows事件 负责写入数据
  • Xid事件 负责结束事务

1.2 显示行事件的伪SQL

下面命令将行事件以伪SQL(pseudo-SQL)的形式表现出来

伪SQL会被注释,即开始位置会有###标志

这些伪SQL只是为了便于查看,无其他作用

shell> mysqlbinlog  -v /path/to/log/master-bin.000001

或者

shell> mysqlbinlog  -verbose  /path/to/log/master-bin.000001
3.png
3.png

可以看到具体的insert语句以及显示出来了

大家可能注意到了,其结构和原始语句是不一致的 values被替换成了set

而且列名被@N代替,N为列名称

使用-v或这-verbose 两次会多显示一些其他信息,如列的类型和一些元数据

shell> mysqlbinlog  -vv /path/to/log/master-bin.000001
4.png
4.png

可以看到多了一些元数据和列的名称

大家可能又注意了varchar(20)类型被显示成varstring(60)

1.3 显示去掉BINLOG格式的伪SQL

1.2 中的命令同时显示BINLOG格式的语句,使用如下命令不显示它

mysqlbinlog -v --base64-output=DECODE-ROWS /path/to/log/master-bin.000001
5.png
5.png

注意如果你想使用mysqlbinlog的输出来重新执行SQL,你不应该使用该参数

关于重新执行SQL 后面再说

2. 注意事项

2.1 hexdump参数

shell> mysqlbinlog --hexdump  -v /path/to/log/master-bin.000001

可以看到上面的输出没有事件代码等信息,加入-hexdump参数可查看所有事件的详细信息

Query事件

6.png
6.png

TABLE_MAP_EVENT事件

7.png
7.png

WRITE_ROWS_EVENT事件

8.png
8.png

2.2  --base64-output=NEVER

在有行事件(数据修改)的情况下,使用mysqldump会在输出的前面显示格式描述的二进制内容

如果你确定该日志没有行事件则使用该参数不显示他

mysqlbinlog -v --base64-output=NEVER  /path/to/log/master-bin.000001
9.png
9.png

2.3 伪SQL显示的一些限制

正如上面所说,伪SQL在显示上可能有如下问题

  • 原始的列名会丢失,用@N代替
  • 数据类型显示不对应
  • 数据的长度显示不对应,伪SQL是以字节为单位,而不是字符

3. 参考链接

https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html

好了 今天的内容就说到这里,下节再见

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宅必备 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前情提要
  • 1. 具体命令
    • 1.1 只查看二进制内容
      • 1.2 显示行事件的伪SQL
        • 1.3 显示去掉BINLOG格式的伪SQL
        • 2. 注意事项
          • 2.1 hexdump参数
            • 2.2  --base64-output=NEVER
              • 2.3 伪SQL显示的一些限制
              • 3. 参考链接
              相关产品与服务
              云数据库 SQL Server
              腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档