如何查看二进制日志ROW模式下最原始的SQL语句

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 如何查看二进制日志ROW模式下最原始的SQL语句
如何查看二进制日志ROW模式下最原始的SQL语句

 MySQL的binlog的ROW模式解析
     在mysql5.6以后,对主从数据一致性要求变高了,statement格式逐渐不太适合业务的需求了,所以生产环境大家都采用了row模
  式,row模式是传输最底层的数据变化的insert的模块来进行主从数据的传输,那么在binlog里面就和普通的statement模式有何差
  别?能否看到最原始的sql语句呢?
1、准备录入数据
   ①create table test1(id int,name varchar(20),sex enum('man','woman'),address varchar(20),grade tinyint(2));

     ee2b5897fa05642e6935aaa9bcbdade79f77c226

   ②INSERT INTO test1 VALUES (0001,'tim','man','hebei','03'); 
     INSERT INTO test1 VALUES (0002,'scott','man','beijing','03');

     a49d0dfc517468373f6797b04c2e8b6c9e2505d8

2、Row模式binlog是乱码
   Row模式下面,binlog里面的ddl语句是正常显示的,但是dml是乱码
    /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000005

    9bbd8d49af47b2e7186ed7ec1c118ebd38f6877e
    0ed2acd124399b28cbe0e0bedca9191b4416f329
    6263cb984d619151e4f57c7f8584ebd0350015a8

3、通过--base64-output=decode-rows -v来查看dml语句
    /usr/bin/mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000005
    可以看到如下效果,不过都是最原始的dml块sql语句

    ef203839d044439b8890c2317eb8c4b342a7e863
    1fcc9abbd4c3916f360e3a4c0d3de23487f2b3c2
    
   PS:这时可以看到dml的insert语句,但是只看到了最终的insert块,而看不到原始的过来的insert语句,很多时候排查问题
   需要原始的insert语句而不是底层的insert块。

4、通过binlog_rows_query_log_events参数来查看最原始的insert sql
  ①先在线设置全局的binlog_rows_query_log_events参数,刷新日志:
     set binlog_rows_query_log_events=1;     
  ②然后刷新日志录入新的数据记录
     flush logs;
     INSERT INTO test1 VALUES(0003,'tiger','man','beijing','03');
  ③解析binlog,没有看到原始的insert语句

    3e3e36882f75b9d4c2b89e69f22352e5575d4dd7
   
  ④通过mysql的命令行查看最原始的insert sql语句
     show binlog events in 'mysql-bin.000007';
     
    bcb9f2399ee7159dc2cde493fa8b7bf8fc5afd80

5、试验总结
     基于以上的试验,可以得出在row模式下,可以通过mysqlbinlog --base64-output=decode-rows –v查看最底层的insert数据
 模块,也可以通过命令行show binlog events in 'mysql-bin.000216';来实时查看最原始的insertsql记录。

   我们可以在搭建数据库的时候,在启动参数文件my.cnf里面事先设置好,如下所示:
     # vim my.cnf
     [mysqld]
     binlog_format=row  # binlog 日志格式
     binlog_rows_query_log_events = 1  # 将原始的操作sql记录写入事件中
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
3月前
|
SQL 存储 JSON
更快更强,SLS 推出高性能 SPL 日志查询模式
从海量的日志数据中,按照各种灵活的条件进行即时查询搜索,是可观测场景下的基本需求。本文介绍了 SLS 新推出的高性能 SPL 日志查询模式,支持 Unix 风格级联管道式语法,以及各种丰富的 SQL 处理函数。同时通过计算下推、向量化计算等优化,使得 SPL 查询可以在数秒内处理亿级数据,并支持 SPL 过滤结果分布图、随机翻页等特性。
12042 107
|
1月前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
1月前
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
28 1
|
2月前
|
SQL 存储 缓存
高基数 GroupBy 在 SLS SQL 中的查询加速
本文详细介绍了SLS中的高基数GroupBy查询加速技术。
122 17
|
1月前
|
SQL 数据库
为什么SQL日志文件很大,该如何处理?
为什么SQL日志文件很大,该如何处理?
|
3月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
126 0
|
3月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
58 0
|
3月前
|
SQL 安全 数据库
下一篇
无影云桌面