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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

结论:

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

1、实验环境:

wKiom1ZmMYzyfsPeAABTbdO9kiI350.png

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;

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

|d          | dt                  | t        | ts                  |

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

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

| 2015-12-07 | 2015-12-07 14:24:38 | 14:24:38 | 2015-12-07 14:24:38|

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

2rows in set (0.00 sec)

4、实验三:假设备库数据比主库多的情况,进行数据更新,将产生不一致。

4.1、主库操作:创建表t,插入数据,查看结果

mysql>create table t(id int,name varchar(20));

QueryOK, 0 rows affected (0.01 sec)

 

mysql>insert into t values(1,'xiao');

QueryOK, 1 row affected (0.00 sec)

 

mysql>insert into t values(2,'xiao');

QueryOK, 1 row affected (0.02 sec)

 

mysql>insert into t values(3,'xiao');

QueryOK, 1 row affected (0.01 sec)

 

mysql>insert into t values(1,'xiao');

QueryOK, 1 row affected (0.01 sec)

 

mysql>select * from t;

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

|id   | name |

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

|    1 | xiao |

|    2 | xiao |

|    3 | xiao |

|    1 | xiao |

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

4 rowsin set (0.00 sec)

4.2、从库操作:查看结果,插入一条数据(使得备库比主库多一条数据)。

mysql>select * from t;

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

|id   | name |

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

|    1 | xiao |

|    2 | xiao |

|    3 | xiao |

|    1 | xiao |

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

4 rowsin set (0.00 sec)

 

mysql>insert into t values(1,'huang');

QueryOK, 1 row affected (0.00 sec)

 

mysql>select * from t;

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

|id   | name  |

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

|    1 | xiao |

|    2 | xiao |

|    3 | xiao |

|    1 | xiao |

|    1 | huang |

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

5 rowsin set (0.00 sec)

4.3、主库操作:把id为1更新为id为10

mysql>update t set id=10 where id=1;

mysql>select * from t;

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

|id   | name |

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

|   10 | xiao |

|    2 | xiao |

|    3 | xiao |

|   10 | xiao |

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

4 rowsin set (0.00 sec)

4.4、从库操作:查询更新结果

mysql>select * from t;

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

|id   | name  |

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

|   10 | xiao  |

|    2 | xiao |

|    3 | xiao |

|   10 | xiao  |

|   10 | huang |

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

5 rowsin set (0.00 sec)

主库更新了两条记录,备库更新了三条记录。从这个实验可以得出,如果主库与备库上下文不一样,那么相同的一条sql在主库与备库执行,产生的效果是不一样,带来了主备数据的不一样。

5、实验四、使用UUID()函数情况,也将使主备库数据不一致

5.1、主库操作

mysql> showvariables like 'binlog_format';

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

| Variable_name |Value     |

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

| binlog_format |STATEMENT |

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

1 row in set (0.00sec)


mysql> createtable test(id varchar(100));

Query OK, 0 rowsaffected (0.01 sec)


mysql> insertinto test values(uuid());

Query OK, 1 rowaffected, 1 warning (0.00 sec)


mysql> select *from test;

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

| id                                   |

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

156bb13f-9cb6-11e5-ab3f-000c29133345 |

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

1 row in set (0.00sec)

5.2、从库操作

mysql> showvariables like 'binlog_format';

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

| Variable_name |Value     |

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

| binlog_format |STATEMENT |

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

1 row in set (0.00sec)


mysql> select *from test;

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

| id                                   |

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

1566e5cb-9cb6-11e5-be5b-000c297f9303 |

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

1row in set (0.00 sec)

6、实验六、使用user()函数情况,也将使主备库数据不一致

6.1、主库操作

mysql> createtable test(user varchar(100));

ERROR 1050(42S01): Table 'test' already exists

mysql> createtable Atest(user varchar(100));

Query OK, 0 rowsaffected (0.05 sec)


mysql> insertinto Atest values(user());

Query OK, 1 rowaffected, 1 warning (0.01 sec)


mysql> select *from Atest;

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

| user           |

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

| root@localhost |

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

1 row in set (0.00sec)

6.2、从库操作

mysql> select *from Atest;

+------+

| user |

+------+

|      |

+------+

1 row in set (0.00sec)


mysql> selectcount(*) from Atest;

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

| count(*) |

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

|        1 |

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

1 row in set (0.00sec)

 



本文转自 corasql 51CTO博客,原文链接:http://blog.51cto.com/corasql/1720609,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
40 6
|
22天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
29天前
|
关系型数据库 MySQL
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
21 0
|
1月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
21 1
|
1月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
2天前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
27天前
|
关系型数据库 MySQL
MySQL查询当天昨天明天本月上月今年等数据
MySQL查询当天昨天明天本月上月今年等数据
19 2
|
28天前
|
关系型数据库 MySQL 开发工具
MySQL分组后,组内排序,然后取每组的第一条数据
MySQL分组后,组内排序,然后取每组的第一条数据
15 1
|
28天前
|
canal SQL 关系型数据库
MySQL数据直接实时同步到ES
MySQL数据直接实时同步到ES
33 0
|
1月前
|
Java 数据库连接 mybatis
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
20 1