设为首页 收藏本站
查看: 347|回复: 0

[经验分享] MySQL Q&A 解析binlog的两个问题

[复制链接]

尚未签到

发表于 2016-10-17 08:41:07 | 显示全部楼层 |阅读模式
连续碰到两个同学问类似的问题,必须要记录一下。
 
问题:
    一个作解析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解析结果如下
DSC0000.jpg
    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,会不会导致这些语句执行到另外一个库去?
同理。
  
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287206-1-1.html 上篇帖子: 【转载】Hibernate与mysql映射类型对照表 下篇帖子: 基于Java获取Mysql表结构的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表