`
丁林.tb
  • 浏览: 797314 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL Q&A 解析binlog的两个问题

阅读更多

连续碰到两个同学问类似的问题,必须要记录一下。

 

问题:

    一个作解析binlog应用的同学发现不论用utf8还是gbk来解析binlog都可能会碰到无法解析的语句,因为有些用户会用utf8,有些用gbk。尤其在处理Query类型的SQL语句中的中文字符,比如建表语句中的中文注释。

     于是他想到用mysqlbinlog来看看binlog里面的内容。

     Mysqlbinlog这个工具的结果带来了新的疑问。

       开一个客户端,执行序列如下:

      set names utf8;

      create table a(c int);

      create table b(c int);

      set names gbk;

      drop table a;

      create table a(c int)comment='测试字符集';

  mysqlbinlog解析结果如下

    binlog的结果与预期相同。从结果看,可以通过

SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=28/*!*/;

 

    这句话的原始信息中得到当前使用的字符集,那么解析后续的binlog语句就没有问题。可以看到在drop table a之前我们修改了字符集,同样在binlog解析结果中可以看到一个设置字符集的语句。

 

     问题追问:但是解析工具是可以指定起始位置的。如果指定从drop table a这个语句的位置之后开始解析,那是不是就无法得知当前的字符集信息(gbk)?是不是只能到MySQL server里面才能得到这个表的正确建表语句?

 

    显然不会这么复杂,否则MySQL的从库上执行一个change master 改变同步位置的时候,从库应该使用什么字符集呢?碰到的问题是相同的。

    实际上,对于statement格式的binlog(类型为QUERY_EVENT)每个event中都记录了当前使用的字符集编号。无论主库、从库还是mysqlbinlog,都保存相同的一份编号到字符集的对应,能够决定使用什么字符集来解析binlog中的字符串。

    这里也可以得到为什么官方无法保证从库版本低于主库版本的主从结构正确性的一个原因。

     至于为什么mysqlbinlog工具不会每行都输出当前使用的字符集?其实有点洁癖的程序员都会这么干的吧,当前的语句与上一个语句使用相同的环境变量,就不重复输出了。

 

问题2mysqlbinlog结果中有use一个db以后,执行多个语句,此时mysqlbinlog的结果中看到,只会在切换的时候显示一次use db。那如果从之后的第二个语句开始解析binlog,会不会导致这些语句执行到另外一个库去?

同理。

 

 

  • 大小: 150.9 KB
0
1
分享到:
评论

相关推荐

    Mysql binlog查看工具

    MySQL的二进制日志(Binary Log,简称binlog)是数据库系统中非常重要的一个功能,主要用于数据恢复、数据同步以及审计。它记录了所有改变数据库状态的事务,包括INSERT、UPDATE、DELETE等操作,为数据库提供了事务...

    基于Python实现用于解析和转换 MySQL 二进制日志(binlog)的工具源码

    - **Python库**:Python中有多个库支持解析binlog,例如`pymysqlreplication`,`mysqlbinlog`等。这些库提供API,能够方便地读取binlog事件并进行处理。 - **事件类型**:binlog中的事件包括Format Description ...

    mysql binlog日志恢复【亲测有效,有例子实测】

    2. **数据恢复**:当发生数据丢失或错误时,可以通过mysqlbinlog工具解析binlog文件并应用相应的操作来恢复数据。这在灾难恢复或误操作后恢复数据时非常有用。 以下是如何在MySQL中配置和使用binlog的具体步骤: 1...

    分析 MySQL 的 binlog 日志的工具

    此外,还有`pump`和`binlogStreamReader`等工具,它们可以解析binlog并提供更高级的分析功能。在我们的场景中,可能需要编写脚本或者使用特定的工具来统计特定时间段内的DML操作。 为了统计DML,我们需要关注binlog...

    php-binlog-parser:用纯PHP实现MySQL Binlog解析器

    为了解决这个问题,开发者们通常会依赖于特定的工具来解析和利用这些日志。本文将深入探讨一个纯PHP实现的MySQL Binlog解析器——php-binlog-parser。 PHP是一种广泛使用的服务器端脚本语言,尤其在Web开发领域。...

    8、NIFI综合应用场景-NiFi监控MySQL binlog进行实时同步到hive

    1. **模板配置**:在NiFi中,可以创建一个名为`mysql_to_hive_realtime`的模板,用于处理从MySQL binlog到Hive的数据流。模板中的处理器配置将包含捕获binlog事件、解析事件、转换数据格式以及将数据写入Hive的逻辑...

    mysql-parser:一个mysql binlog解析器,从mysql-tracker中获取binlog数据,用protobuf解析binlog到entry

    源代码通常会包含解析binlog的逻辑,可能包括读取binlog事件、识别事件类型、解码事件内容等步骤。此外,可能还会有一个示例或者API指南来展示如何使用这个解析器来处理binlog数据。 对于开发者来说,了解并使用...

    binlog文件解析相关.docx

    同样,我们可以用`show binlog events`查看binlog中的事件,并使用`mysqlbinlog`命令解析binlog文件,但此时不会包含行级别的详细信息。 GTID与ROW和STATEMENT模式的配合使用,使得在多服务器环境中跟踪和管理事务...

    [MySQL binlog]mysql如何彻底解析Mixed日志格式的binlog

    结合上述两个选项,可以更有效地解析mixed格式的binlog。举例来说: ```bash mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000144 | more ``` 在上述命令中,`mysql-bin.000144`是需要解析的binlog...

    java实现两个mysql同步主库的数据

    下面我们将深入探讨如何使用Java实现两个MySQL数据库之间的数据同步,以及涉及的相关知识点。 首先,我们需要理解MySQL的复制原理。MySQL的主从复制是基于日志的,主库上的所有更改都会被记录到二进制日志(binlog...

    mysql-binlog-in-realtime 源代码包

    "mysql-binlog-in-realtime"源代码包就是针对MySQL binlog进行实时处理的一个工具,它允许开发者在事务发生时立即读取和解析binlog事件,从而实现对数据变更的实时响应。 1. **MySQL Binlog简介** MySQL的binlog是...

    binlog2sql 离线包+python扩展包

    3. **Python绑定**:binlog2sql 提供的Python扩展包让开发者可以通过Python调用其API,实现与MySQL binlog的交互,比如实时读取binlog、解析binlog事件,或者在程序中自动化执行SQL恢复。 4. **离线安装**:离线包...

    binlog2sql-master.zip

    1. **解析binlog**:binlog2sql能够读取MySQL的binlog文件,并将其转换为易于理解的SQL语句。 2. **支持多种模式**:它可以处理STATEMENT和ROW两种模式的binlog,适应不同的场景需求。 3. **数据恢复**:通过反解析...

    轻量级 Mysql/MariaDB Binlog 客户端,为第三方提供数据订阅服务

    2. **高效解析**:客户端需要能够快速解析Binlog事件,提取出相关的SQL语句或操作信息,减少延迟,提高性能。 3. **兼容性**:由于MySQL和MariaDB的不同版本可能存在差异,客户端应具有良好的版本兼容性,能处理...

    同步MySQL binlog 将分库分表合并到另外一个库表中-py_sync_binlog.zip

    解析binlog可以使用开源库如`pymysqlreplication`或`mysql-binlog-connector-python`。 接下来,项目需要处理分库分表的情况。在多库多表环境中,数据可能按照某种规则分散存储,例如基于哈希或范围分区。同步时,...

    mycacher:使用MySQL Binlog自动刷新Redis缓存

    mycacher的实现原理主要依赖于两个关键库:一个是用于解析MySQL Binlog的开源库,如`mysql-binlog-connector-java`或`go-mysql-elasticsearch`;另一个是用于与Redis交互的库,如`redis-cli`或`redis-py`。这些库...

    binlog2sql

    `binlog2sql`是一个开源工具,用于解析MySQL的binlog文件,并将其转换为可执行的SQL语句。这对于误删数据后的快速恢复,或者对历史操作进行审计非常有帮助。这个工具通常需要与MySQL服务器的binlog文件和配置文件...

    canal同步mysql

    将这两个概念结合,我们可以理解为canal通过解析mysql的binlog,实现了数据库间的实时同步。 【详细知识点】: 1. **Canal**:Canal是Java实现的MySQL数据库增量日志解析组件,它可以实时捕获MySQL的binlog事件,...

    基于binlog的异步增量实现MySQL分库分表(kafka做数据源)-luna-mysql.zip

    这样的工具通常需要处理binlog解析、错误恢复、数据一致性等问题。 6. **数据一致性保证**: 在这种架构下,确保数据的一致性是一项挑战。使用Kafka的 Exactly-Once 语义和binlog的GTID(全局事务ID)可以有效解决此...

Global site tag (gtag.js) - Google Analytics