mysql主从配置自增id_MySQL自增列主从不一致的测试(r12笔记第37天)
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天)相关推荐
- mysql slave 配置_【mysql5.6】 数据库主从(Master/Slave)配置记录
freddon 发表于2018-04-01 阅读 661 | 评论 0 前一段时间迫于服务器的捉急内存,将redis数据库停掉了,鉴于redis的主从配置,在centos配置下mysql记录下过程. ...
- Redis—主从配置
在多个redis实例建⽴起主从关系,当 主redis 中的数据发⽣变化, 从redis 中的数据也会同步变化. 通过主从配置可以实现redis数据的备份( 从redis 就是对 主redis 的备份) ...
- mysql数据库配置环境变量
mysql数据库配置环境变量 这是我最初学习时记录下来的笔记,有些简陋! 1.下载最新版mysql软件,将mysql安装到系统目录中,记录当前安装目录: 如安装mysql到C:/program fil ...
- python增删改查的框架_python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查...
Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...
- mysql hugepage_因未配置Hugepage会话数添增悲剧案例
今天一朋友反馈他们的一个数据库hang住了,通过ssh也不能登录系统,他们没有办法重启系统解决问题,现在想让我帮忙找出问题原因 分析awr得出 询问朋友,他们的库一般session保持在200个左右, ...
- mysql replication 配置_MySQL Replication配置主从的教程
MySQL主从原理 主(master)在执行sql之后,记录二进制log文件(bin-log) 从(slave)连接主(master),并从主(master)获取binlog,存于本地relay-lo ...
- day62:mysql主从配置
2019独角兽企业重金招聘Python工程师标准>>> 1.主从介绍:mysql主从又叫Replication,AB两台机器复制,也就是说是AB两台机器做了主从后,在A机器上写数据, ...
- mysql的增_MySQL之增_insert-replace
MySQL增删改查之增insert.replace 一.INSERT语句 带有values子句的insert语句,用于数据的增加 语法: INSERT [INTO] tbl_name[(col_nam ...
- 虚拟机CENTOS7下 安装8.0版本MySQL MySQL主从配置详细~
全部代码,写在后面吧! 全部的代码在后面. 1.安装mysql 先rz命令上传一下!出现未响应是很正常的情况!等会就好啦. ls查看一下,已经出现啦~ xz -d mysql-8.0.13-linux ...
最新文章
- Wapiti一款小巧的开源安全测试漏洞检测工具
- 字符串的相关方法 2101 0310
- 国土部明确地面光伏、分布式光伏用地政策
- Linux学习之二十、循环
- Android Studio 2.3.1导出jar文件不能生成release解决办法
- J - 免费馅饼(动态规划)数塔
- vue 中使用axios的总结
- vmware 14 激活码
- 大连理工大学c语言第三次上机作业答案,第一次上机作业参考答案
- 证件照素材大合集(全网最全版本),满足证件照的一切需求!
- 《走近心理学》第二章之心理学的生物学理论
- ag-grid在Vue项目中的基本使用
- 市场营销工作重中之重——提升工作效率
- 【唐诗学习】一、古诗概述
- html excel 在线查看,web在线查看服务器的Excel文件
- HTML的无序(ul)、有序(ol)、定义(dl)列表标签
- C++ 学生姓名学号 字符串
- 消息队列MQ常见面试题
- SCI和SCIE的区别和联系
- 用什么软件工具可以一键添加马赛克同时虚化边框背景呢?
热门文章
- ​EMC存储产品介绍分析(二):大数据利器Isilon (2)
- C#: using JsonReader avoid Deserialize Json to dynamic
- js 添加事件 attachEvent 和addEventListener 的用法
- 实现1-2+3-4+5-6+…+99-100的算法的程序
- 三层交换机关于VLAN的划分以及ACL的使用
- Linux 命令(127)—— wget 命令
- ARP-地址解析协议
- UWP 实现分享功能
- Bigendian 奇数内存地址取整形crash
- vim 显示tab键