mysql版本不一致会导致uuid_使用uuid函数导致主从数据不一致

有时在使用一些函数,比如uuid()时,可能会发现主从有数据不一致的情况,这很大程度与日志模式有关,一起来探究下。STATEMENT模式

主库执行

mysql> create table test(id int(11),`uuid_num` varchar(50));

mysql> set session binlog_format='STATEMENT';

mysql> insert into test values(1,uuid());

mysql> select * from test;

bc4c0022fa749d9d5840c11ecad7b0ef.png

从库执行

mysql> select * from test;

0ef0a24fa6845595d568a88459b1fbf1.png

现在导致主从数据不一致了

原因:

Binlog在 statement模式下每一条会修改数据的sql都会记录到master的binlog中,slave在复制时sql进程会解析成和原来master端执行过的相同的sql再次执行。因此uuid()函数是分别在主从库执行的结构,导致主从数据不一致。

那么ROW模式和MIXED模式下结果又会怎样呢?继续试验

ROW模式

主库执行

mysql> set session binlog_format='ROW';

mysql> insert into test values(2,uuid());

mysql> select * from test;

27f1d2a96e49536d627ba63766b4d933.png

从库执行

mysql> select * from test;

38557eb836f9ff369215522ab718059e.png

是一样的,说明row模式不会出现时UUID函数导致数据不一致的情况。

原因:

ROW模式下,日志中会记录成每一行数据被修改的形式,然后再slave端再对相同的数据进行修改。

MIXED模式

主库执行

mysql> set session binlog_format='MIXED';

mysql> insert into test values(3,uuid());

mysql> select * from test;

89734e6863bb506221ecff00f3407199.png

从库执行

mysql> select * from test;

cd71998bc182084778a018f7b1bf4bd4.png

也是一样的

原因:

在MIXED模式下,一般采用statement格式进行二进制日志文件的记录,但是在一些情况下会使用row格式,可能的情况有:表的存储引擎为NDB,此时对表的DML操作都会以ROW格式记录

使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_count()等不确定函数时

使用了insert delay语句

使用了用户定义函数(UDF)

使用了临时表

因此,在使用statement模式下,很有可能是有部分函数会导致主从的结果不一致。所以,多数情况不建议使用statement模式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值