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;

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/abfecbe90aa6685e9037a3dcdf2a6cbe.html