设为首页 加入收藏

TOP

MySQL主备复制数据不一致的情况(一)
2015-12-15 22:18:14 来源: 作者: 【 】 浏览:18
Tags:MySQL 复制 数据 一致 情况

在主备复制架构下,mysql5.6默认的复制的方式是SBR(基于SQL语句的复制),如果主从库的上下文不一致(如时间不一样、主从库发生了延迟),使用了sysdate()函数,UUID()函数,user()函数,将出现主库与备库数据不一致。假设备库数据比主库多的情况,进行数据更新,也将产生不一致。


结论:


从下面的实验可以看出,主备复制,复制的方式不推荐使用statement,使用statement,在上下文不一致的情况,会造成主备复制,产生数据不一致。


1、实验环境:


MySQL主备复制数据不一致的情况


2、实验一:主从库时间不一样的情况


1.1、主库操作:



(1)? 查看时间


mysql>select sysdate();


+---------------------+


|sysdate()? ? ? ? ? |


+---------------------+


| 2015-12-07 13:46:55 |


+---------------------+


1row in set (0.00 sec)


(2)? 查看使用哪种方式进行复制


mysql>show variables like 'binlog_format';


+---------------+-----------+


|Variable_name | Value? ? |


+---------------+-----------+


|binlog_format | STATEMENT |


+---------------+-----------+


1row in set (0.00 sec)


STATEMENT表示基于sql语句的复制。


(3)? 创建表


createtable temporal_test( d DATE,dt DATETIME,t TIME,ts TIMESTAMP);


(4)? 插入数据


mysql>insert into temporal_test values(sysdate(),sysdate(),sysdate(),sysdate());


QueryOK, 1 row affected, 2 warnings (0.01 sec)


(5)? 查询结果


?mysql> select * from temporal_test;


+------------+---------------------+----------+---------------------+


|d? ? ? ? ? | dt? ? ? ? ? ? ? ? ? | t? ? ? ? | ts? ? ? ? ? ? ? ? ? |


+------------+---------------------+----------+---------------------+


| 2015-12-07 | 2015-12-07 13:52:33 | 13:52:33 | 2015-12-07 13:52:33|


+------------+---------------------+----------+---------------------+


1row in set (0.00 sec)


1.2、备库操作:



(1)? 查询当前时间


mysql>select sysdate();


+---------------------+


|sysdate()? ? ? ? ? |


+---------------------+


| 2014-01-10 01:39:41 |


+---------------------+


1row in set (0.00 sec)


(2)? 查看使用哪种方式进行复制


mysql>show variables like 'binlog_format';


+---------------+-----------+


|Variable_name | Value? ? |


+---------------+-----------+


|binlog_format | STATEMENT |


+---------------+-----------+


1row in set (0.00 sec)


(3)? 查询结果


mysql>select * from temporal_test;


+------------+---------------------+----------+---------------------+


|d? ? ? ? ? | dt? ? ? ? ? ? ? ? ? | t? ? ? ? | ts? ? ? ? ? ? ? ? ? |


+------------+---------------------+----------+---------------------+


| 2014-01-10 | 2014-01-10 01:45:19 | 01:45:19 | 2014-01-10 01:45:19|


+------------+---------------------+----------+---------------------+


1row in set (0.00 sec)


? 结论:使用mysql主备架构,复制方式使用statement,一定要进行时间同步,否则会出现主备库不同步。


3、实验二:主备库发生延迟情况


备库暂时停止slave复制,来模拟主备库发生延迟。


具体操作:


1.1、备库操作:



stopslave;


1.2、主库操作:



(1)查询当前时间


mysql>? select sysdate();


+---------------------+


|sysdate()? ? ? ? ? |


+---------------------+


|2015-12-07 14:22:15 |


+---------------------+


1row in set (0.00 sec)


(2)插入数据


insertinto temporal_test values(sysdate(),sysdate(),sysdate(),sysdate());


(3)查询插入结果


mysql>select * from temporal_test;


+------------+---------------------+----------+---------------------+


|d? ? ? ? ? | dt? ? ? ? ? ? ? ? ? | t? ? ? ? | ts? ? ? ? ? ? ? ? ? |


+------------+---------------------+----------+---------------------+


|2015-12-07 | 2015-12-07 13:52:33 | 13:52:33 | 2015-12-07 13:52:33 |


| 2015-12-07 | 2015-12-07 14:23:17 | 14:23:17 | 2015-12-07 14:23:17|


+------------+---------------------+----------+---------------------+


2rows in set (0.00 sec)


3.3、从库操作:


(1)查询当前时间


mysql>? select sysdate();


+---------------------+


|sysdate()? ? ? ? ? |


+---------------------+


|2015-12-07 14:22:15 |


+---------------------+


1row in set (0.02 sec)


(2)过一段时间后


startslave;


(3)查询插入结果


mysql>select * from temporal_test;


+------------+---------------------+----------+------------------

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于MongoDB的九个成功故事 下一篇Ubuntu 15.10 上将数据库 MySQL ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: