上周在研究MySQL binlog格式的时候,发现了一些MySQL binlog的风险点,记录一下。
5.1版本后,MySQL引入了基于ROW方式的binlog格式,不同于Statement方式的是,ROW方式记录了变更的内容,而不仅仅是SQL。
通过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正