mysql row模式的一些小问题(一)
来源:互联网 发布:09和冷冷的故事 知乎 编辑:程序博客网 时间:2024/06/16 10:13
通过mysqlbinlog工具可以解析查看,mysqlbinlog mysql-bin.000001就可以查看解出后的格式,Statement方式记录的SQL被还原,但是Row方式记录的内容,还是BASE64的结构。
mysqlbinlog -vv mysql-bin.000001就可以将Row方式记录的内容也解开来,可以看到类似这样的内容:### UPDATE test.a
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=’abc’ /* VARSTRING(32) meta=32 nullable=1 is_null=0 */
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=’cba’ /* VARSTRING(32) meta=32 nullable=1 is_null=0 */
我们可以发现,binlog中并没有记录列名,只记录了顺序,这样会有什么风险呢?
单机的时候问题不大,但是在双Master的结构下,这问题可就大了,假设Master A <--> Master B正在相互复制,我在Master B做一个DDL改变了字段顺序,那么从B DDL完成开始,到A接受执行完这个DDL为止,之间A产生的这张表的数据复制到B都是错误的!因为MySQL只按字段顺序应用binlog。
如何避免这个问题呢?有两个办法,最保险的只加字段不删字段,加字段总是在表末尾,一句话:不改变字段的顺序。另一个办法就是改变字段顺序的DDL只在提供服务的主机上执行,如果双Master都提供服务,这就不行了,只能在末尾添加字段。
这只是地雷之一,还有第二个地雷。mysqlbinlog这个工具的作者真的比较懒,-d参数过滤数据库的时候,只有Statement方式记录的SQL能被过滤,所有按Row方式记录的SQL都没有被过滤!也就是说,假设你的数据库是基于Row方式记录binlog的,你想通过mysqlbinlog -d db1来过滤出db1的SQL,这是不靠谱的,所有Row方式记录的SQL全部被解出来了,你要是到数据库去应用这些解出来的SQL,你就准备悲剧了,各种Duplicate Key!
还有一个不算地雷但是值得说一下的是,即使不需要使用-d参数,你需要全部binlog都解出来,到数据库去应用,也会有一个悲剧点,Row方式记录的SQL都是Base64格式,解出来还是一样,传到数据库去执行的话,MySQL还会把这些BASE64的字串解成SQL,再去应用,所以数据库Load可能会增长的很高。
阅读全文
0 0
- mysql row模式的一些小问题(一)
- MySQL数据传输的一些小问题
- 关于mysql安装的一些小问题
- JavaWeb项目遇到的一些小问题(一)
- 应用TP3.2.3的一些小问题(一)
- c++ mysql 一些小问题
- mysql遇到的一些常用的查询小问题
- MySQL Binlog ROW模式分析
- mysql学习一(常用一些小函数)
- Delphi的一些小技巧(一)
- 一些编程的小技巧(一)
- 一些C++的小程序(一)
- 关于MySQL远程连接的一些小问题
- 记MyBatis和MySQL中遇到的一些小问题
- VS2008 MFC C++ 遇到的一些小问题总结一
- MySQL下bin-log的三种模式(ROW、Statement、Mixed)
- IPv6的一些小技巧(一)不同网段内IPv6不能相互访问的问题
- IPv6的一些小技巧(一)不同网段内IPv6不能相互访问的问题
- 修饰词的用法
- 简单了解Effective java
- 单链表一些总结
- Gym-100820 Racing Gems(二维LIS)
- Alice, Bob, Two Teams CodeForces
- mysql row模式的一些小问题(一)
- 浅拷贝、深拷贝与写时拷贝
- Integer源码(toHexString).md
- 构造代码块笔记
- ActiveMQ实战(三)--ActiveMQ的通信方式之主题发布订阅式(publish-subscribe)
- Codeforces 822C Hacker pack your bags! 区间
- 多态笔记
- android 网格布局
- Leetcode 111. Minimum Depth of Binary Tree