mysqlbinlog命令详解 Part 4 -查看行事件具体SQL语句
前情提要
此次实验的环境如下
- 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
可以看到create table是个Query事件
这里显示出了具体的建表语句,说明建表不属于行事件
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
可以看到具体的insert语句以及显示出来了
大家可能注意到了,其结构和原始语句是不一致的 values被替换成了set
而且列名被@N代替,N为列名称
使用-v或这-verbose 两次会多显示一些其他信息,如列的类型和一些元数据
shell> mysqlbinlog -vv /path/to/log/master-bin.000001
可以看到多了一些元数据和列的名称
大家可能又注意了varchar(20)类型被显示成varstring(60)
1.3 显示去掉BINLOG格式的伪SQL
1.2 中的命令同时显示BINLOG格式的语句,使用如下命令不显示它
mysqlbinlog -v --base64-output=DECODE-ROWS /path/to/log/master-bin.000001
注意如果你想使用mysqlbinlog的输出来重新执行SQL,你不应该使用该参数
关于重新执行SQL 后面再说
2. 注意事项
2.1 hexdump参数
shell> mysqlbinlog --hexdump -v /path/to/log/master-bin.000001
可以看到上面的输出没有事件代码等信息,加入-hexdump参数可查看所有事件的详细信息
Query事件
TABLE_MAP_EVENT事件
WRITE_ROWS_EVENT事件
2.2 --base64-output=NEVER
在有行事件(数据修改)的情况下,使用mysqldump会在输出的前面显示格式描述的二进制内容
如果你确定该日志没有行事件则使用该参数不显示他
mysqlbinlog -v --base64-output=NEVER /path/to/log/master-bin.000001
2.3 伪SQL显示的一些限制
正如上面所说,伪SQL在显示上可能有如下问题
- 原始的列名会丢失,用@N代替
- 数据类型显示不对应
- 数据的长度显示不对应,伪SQL是以字节为单位,而不是字符
3. 参考链接
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html
好了 今天的内容就说到这里,下节再见
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Android |《看完不忘系列》之okhttp
- pt-osc改表过程中的中文乱码问题
- Hive Query生命周期 —— 钩子(Hook)函数篇
- python快速排序
- 扩展 Microsoft.Owin.Security
- Angular 2 版本的 ng-bootstrap 初体验
- 揭开MySQL“锁”的神秘面纱
- 从0到1开发测试平台(九)后端对接口response的封装
- 在 Mac OS X 上安装和配置 Wine
- 性能测试之nginx访问日志分析
- Pytest之断言
- R语言单因素方差分析简单小例子
- 回炉重造:计算图
- CenterNet的骨干网络之DLASeg
- 一份朴实无华的移动端盒子滤波算法优化笔记