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

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

博客分类:

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

同理。

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

时间: 2024-10-12 14:27:40

MySQL Q&A 解析binlog的两个问题的相关文章

MySQL Study之--MySQL体系结构深入解析

MySQL Study之--MySQL体系结构深入解析 MySQL体系架构 由连接池组件.管理服务和工具组件.sql接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理文件组成.mysql是独有的插件式体系结构,各个存储引擎有自己的特点. MySQL内存结构: Mysql 进程结构 Mysql不像oracle那样是通过多进程来完成其功能的.默认情况下,InnoDB存储引擎的后台线程有7个: 4个IO thread, 1个master thread, 1个锁(lock)监控线程,

mysql日志详细解析

MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默认开启的.并且,错误日志无法被禁止.默认情况下,错误日志存储在mysql数据库的数据文件中.错误日志

mysql日志详细解析 [转]

原文出处:http://pangge.blog.51cto.com/6013757/1319304 MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默

mysql日志详细解析【转载】

转自:http://pangge.blog.51cto.com/6013757/1319304 MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默认开

不停止MySQL服务增加从库的两种方式

转载自:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具

不停止 MySQL 服务增加从库的两种方式

不停止 MySQL 服务增加从库的两种方式 提交 我的评论 加载中 已评论 不停止 MySQL 服务增加从库的两种方式 2015-07-12 数据库开发 数据库开发 数据库开发 微信号 DBDevs 功能介绍 分享数据库相关技术文章.教程和工具,另外还包括数据库相关的工作.偶尔也谈谈程序员人生 :) (点击上方蓝字,快速关注我们) 作者:李振良 网址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业

Mysql Join语法解析与性能分析详解

一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEF

MySQL源码 解析器

sql请求发送到server端,需要经过解析器生成内部的数据结构对象,以方便进行优化和生成执行计划.解析器主要做了两件事情,词法分析和语法分析. 词法和语法分析:mysql使用lex词法分析器,yacc语法分析器进行分析,最后保存到lex对象结构中. 例如:     select id, name from xpchild where id=1 1. 在mysql_parse函数中使用lex_start初始化thd->lex对象,然后调用yacc中的MYSQLparse函数进行词法和语法分析.

不停止MySQL服务增加从库的两种方式【转载】

现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快,不锁表.为什么不锁表?因为自身会监控主库日