MySQL里面有一个问题尤其值得注意,那就是自增列的重复值问题,之前也简单分析过一篇,但是在后续我想了下,还有很多地方需要解释,一个就是从库的自增列是如何维护的,是否重启从库,自增列会受到影响。

我们继续来测试一下。首先复现这个问题。

创建表t1,插入3行数据。

use test;

[test]> drop table if exists t1;

Query OK, 0 rows affected, 1 warning (0.01 sec)

> create table t1(id int auto_increment, a int, primary key (id)) engine=innodb;

Query OK, 0 rows affected (0.02 sec)

insert into t1 values (1,2);

insert into t1 values (null,2);

insert into t1 values (null,2);

[test]> select *from t1;

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

| id | a    |

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

|  1 |    2 |

|  2 |    2 |

|  3 |    2 |

+----+------+因为存在3行数据,这个时候自增列的值是4.

[test]> show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

1 row in set (0.00 sec)我们删除id值最大的记录id=3

mysql> delete from t1 where id=3;

Query OK, 1 row affected (0.02 sec)这个时候会发现AUTO_INCREMENT=4的值不会有任何变化。

我们来挖掘一下binlog的内容,就会发现insert语句很特别。

# /usr/local/mysql_5.7.17/bin/mysqlbinlog --socket=/home/data/s1/s1.sock --port=24801 -vv  /home/data/s1/binlog.000001可以看到insert语句是MySQL独有的语法形式。

### SET

###   @1=3 /* INT meta=0 nullable=0 is_null=0 */

###   @2=2 /* INT meta=0 nullable=1 is_null=0 */

# at 2271

delete也会基于行级变更,定位到具体的记录的方式来删除。

### DELETE FROM `test`.`t1`

### WHERE

###   @1=3 /* INT meta=0 nullable=0 is_null=0 */

###   @2=2 /* INT meta=0 nullable=1 is_null=0 */

# at 2509

我们重启一下数据库。

# mysqladmin --socket=/home/data/s1/s1.sock --port=24801 shutdown

# /bin/sh /usr/local/mysql_5.7.17/bin/mysqld_safe --defaults-file=/home/data/s1/s1.cnf &重启之后就会发现情况发生了变化,原来的自增值4现在变为了3,这个也是基于max(id)+1的方式来计算的。

mysql> show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

1 row in set (0.00 sec)这个时候我们来关注一下从库,从库的自增列值会变化吗?

mysql> show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

1 row in set (0.00 sec)这个时候就会发现重启数据库以后,主从的自增列的值不同了。

那么我们来进一步测试,在主库插入一条记录,这样自增列的值就是4.

mysql> insert into t1 values (null,2);

Query OK, 1 row affected (0.01 sec)自增列的值为4,而从库的自增列的值依旧没有任何变化。

继续插入一条记录,这个时候主库的自增列就会是5

mysql> insert into t1 values (null,2);

Query OK, 1 row affected (0.00 sec)而从库呢,这个时候自增列会持续发生变化吗?我们来验证一下,这个时候从库的自增列又开始生效了。

mysql> show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

还有一点需要注意,那就是指定了自增列的值,这一点上和Oracle有一定的差距,但是又很相似。

这个时候数据库主库中的数据如下:

mysql> select * from t1;

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

| id | a    |

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

|  1 |    2 |

|  2 |    2 |

|  3 |    2 |

|  4 |    2 |

|  5 |    2 |

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

5 rows in set (0.00 sec)为了方便测试,我们继续插入一条数据,这一次我指定了id值。

mysql> insert into t1 values(6,2);

Query OK, 1 row affected (0.00 sec)让人感到安慰的是,这张情况下自增列还是会持续增加。

mysql> show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

1 row in set (0.00 sec)此时查看从库,这个自增列也还是7,,

通过这个案例,我们能够看到在MySQL会存在这样一类问题,实际上在多环境历史数据归档的情况下,如果主库重启,很可能会出现数据不一致的情况。

我也在MySQL的官方bug列表中看到很多人在讨论这个问题,看来很多人碰到这个坑。而这个问题其实细究起来实现也不是一个很繁琐的工作,为什么一直没有修复。

这个问题在MySQL很久以前就有,在现在依旧存在,什么时候会修复呢,根据官方的计划会在8.0中修复。让我们拭目以待。

mysql主从配置自增id_MySQL自增列主从不一致的测试(r12笔记第37天)相关推荐

  1. mysql slave 配置_【mysql5.6】 数据库主从(Master/Slave)配置记录

    freddon 发表于2018-04-01 阅读 661 | 评论 0 前一段时间迫于服务器的捉急内存,将redis数据库停掉了,鉴于redis的主从配置,在centos配置下mysql记录下过程. ...

  2. Redis—主从配置

    在多个redis实例建⽴起主从关系,当 主redis 中的数据发⽣变化, 从redis 中的数据也会同步变化. 通过主从配置可以实现redis数据的备份( 从redis 就是对 主redis 的备份) ...

  3. mysql数据库配置环境变量

    mysql数据库配置环境变量 这是我最初学习时记录下来的笔记,有些简陋! 1.下载最新版mysql软件,将mysql安装到系统目录中,记录当前安装目录: 如安装mysql到C:/program fil ...

  4. python增删改查的框架_python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查...

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  5. mysql hugepage_因未配置Hugepage会话数添增悲剧案例

    今天一朋友反馈他们的一个数据库hang住了,通过ssh也不能登录系统,他们没有办法重启系统解决问题,现在想让我帮忙找出问题原因 分析awr得出 询问朋友,他们的库一般session保持在200个左右, ...

  6. mysql replication 配置_MySQL Replication配置主从的教程

    MySQL主从原理 主(master)在执行sql之后,记录二进制log文件(bin-log) 从(slave)连接主(master),并从主(master)获取binlog,存于本地relay-lo ...

  7. day62:mysql主从配置

    2019独角兽企业重金招聘Python工程师标准>>> 1.主从介绍:mysql主从又叫Replication,AB两台机器复制,也就是说是AB两台机器做了主从后,在A机器上写数据, ...

  8. mysql的增_MySQL之增_insert-replace

    MySQL增删改查之增insert.replace 一.INSERT语句 带有values子句的insert语句,用于数据的增加 语法: INSERT [INTO] tbl_name[(col_nam ...

  9. 虚拟机CENTOS7下 安装8.0版本MySQL MySQL主从配置详细~

    全部代码,写在后面吧! 全部的代码在后面. 1.安装mysql 先rz命令上传一下!出现未响应是很正常的情况!等会就好啦. ls查看一下,已经出现啦~ xz -d mysql-8.0.13-linux ...

最新文章

  1. Wapiti一款小巧的开源安全测试漏洞检测工具
  2. 字符串的相关方法 2101 0310
  3. 国土部明确地面光伏、分布式光伏用地政策
  4. Linux学习之二十、循环
  5. Android Studio 2.3.1导出jar文件不能生成release解决办法
  6. J - 免费馅饼(动态规划)数塔
  7. vue 中使用axios的总结
  8. vmware 14 激活码
  9. 大连理工大学c语言第三次上机作业答案,第一次上机作业参考答案
  10. 证件照素材大合集(全网最全版本),满足证件照的一切需求!
  11. 《走近心理学》第二章之心理学的生物学理论
  12. ag-grid在Vue项目中的基本使用
  13. 市场营销工作重中之重——提升工作效率
  14. 【唐诗学习】一、古诗概述
  15. html excel 在线查看,web在线查看服务器的Excel文件
  16. HTML的无序(ul)、有序(ol)、定义(dl)列表标签
  17. C++ 学生姓名学号 字符串
  18. 消息队列MQ常见面试题
  19. SCI和SCIE的区别和联系
  20. 用什么软件工具可以一键添加马赛克同时虚化边框背景呢?

热门文章

  1. ​EMC存储产品介绍分析(二):大数据利器Isilon (2)
  2. C#: using JsonReader avoid Deserialize Json to dynamic
  3. js 添加事件 attachEvent 和addEventListener 的用法
  4. 实现1-2+3-4+5-6+…+99-100的算法的程序
  5. 三层交换机关于VLAN的划分以及ACL的使用
  6. Linux 命令(127)—— wget 命令
  7. ARP-地址解析协议
  8. UWP 实现分享功能
  9. Bigendian 奇数内存地址取整形crash
  10. vim 显示tab键