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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

 

问题:

    一个作解析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,会不会导致这些语句执行到另外一个库去?

同理。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
存储 安全 关系型数据库
Mysql 的binlog日志的优缺点
MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它包含了所有对数据库执行的更改操作,如INSERT、UPDATE和DELETE等。binlog的主要目的是复制和恢复。以下是binlog日志的优缺点: ### 优点: 1. **数据恢复**:当数据库出现意外故障或数据丢失时,可以利用binlog进行点恢复(point-in-time recovery),将数据恢复到某一特定时间点。 2. **主从复制**:binlog是实现MySQL主从复制功能的核心组件。主服务器将binlog中的事件发送到从服务器,从服务器再重放这些事件,从而实现数据的同步。 3. **审计**:b
|
18天前
|
SQL 关系型数据库 MySQL
mysql的binlog恢复数据
mysql的binlog恢复数据
19 0
|
5天前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
14 0
|
18天前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
66 0
|
28天前
|
存储 关系型数据库 MySQL
|
2月前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因
【2月更文挑战第5天】PolarDB for MySQL数据库外网连接解析失败的原因
63 8
|
8天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
26天前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
78 1
|
21天前
|
Ubuntu 关系型数据库 MySQL
Ubuntu 中apt 安装MySQL数据库
Ubuntu 中apt 安装MySQL数据库
65 0

推荐镜像

更多