文档章节

mysql的auto_increment注意点

kenyon_君羊
 kenyon_君羊
发布于 2015/12/01 14:40
字数 591
阅读 284
收藏 0
mysql的5.6.27版本修复了一些bugs,其中有一个bug是关于auto_increment的,链接地址在 http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-27.html,
第一条bug fixed就是

InnoDB: Reloading a table that was evicted while empty caused an AUTO_INCREMENT value to be reset. (Bug #21454472, Bug #77743),但是并没有解决数据库重启后空表的auto_increment被重置的场景

一、场景重现:
[root@Kenyon ~]# mysql test
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.27-log Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table tbl_kenyon(id int auto_increment primary key,vname varchar(32)) auto_increment 1000 engine innodb;
Query OK, 0 rows affected (0.16 sec)

mysql> create table tbl_kenyon2(id int auto_increment primary key,vname varchar(32)) auto_increment 1000 engine innodb;
Query OK, 0 rows affected (0.04 sec)

mysql> insert into tbl_kenyon (vname) values('Just test');
Query OK, 1 row affected (0.03 sec)

mysql> show create table tbl_kenyon \G
*************************** 1. row ***************************
       Table: tbl_kenyon
Create Table: CREATE TABLE `tbl_kenyon` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vname` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table tbl_kenyon2 \G
*************************** 1. row ***************************
       Table: tbl_kenyon2
Create Table: CREATE TABLE `tbl_kenyon2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vname` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
--重启数据库后,可以看到auto_increment变化了
mysql> show create table tbl_kenyon\G
*************************** 1. row ***************************
       Table: tbl_kenyon
Create Table: CREATE TABLE `tbl_kenyon` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vname` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table tbl_kenyon2\G
*************************** 1. row ***************************
       Table: tbl_kenyon2
Create Table: CREATE TABLE `tbl_kenyon2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vname` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

二、分析

innodb的auto_increment值并没有固化下来,而是在内存中,假如重启了db,那么会被重置为当前表中最大的自增值,myisam的不受此影响,因为值是存在.MYI文件里的。早期的版本中可能还有另一种奇葩的情况是建一个空表,alter表重置auto_increment,不去操作过一段时间后自己会被重置成1,不过这个bug官方给出的答复是在5.6.27被修复了。

三、影响

1.对自增值有要求的场景存在风险
2.与历史数据合并时可能存在主键冲突

四、参考:
1.http://bugs.mysql.com/bug.php?id=78491
2.https://bugs.mysql.com/bug.php?id=77743


© 著作权归作者所有

共有 人打赏支持
kenyon_君羊
粉丝 499
博文 170
码字总数 121714
作品 0
杭州
其他
私信 提问
加载中

评论(1)

宏哥
宏哥
你还有空弄mysql

其实好好把postgresql 推广起来就够了。

postgresql 其实可以做一些商业化探索
[Mysql]mysql原理之Auto_increment

引言 MySQL中autoincrement字段估计大家都经常用到,特别是innodb引擎。我也经常用,只知道mysql可以保证这个字段在多进程操作时的原子性,具体原理又是什么,后来查阅了MySQL手册以及相关资...

david0006
2016/08/25
104
0
玩转mysql主从和主主

++++++++++++++++++++++++ 在master上处理 ++++++++++++++++ #1 配置文件中添加并保证唯一 server-id=1 log-bin=/var/lib/mysql/mysql-bin #2 重启 /etc/init.d/mysqld restart #3 建立用于同......

cloves
2017/01/18
0
0
MySQL 复制在多源服务器下的auto_increment冲突问题

在以前的文章中《mysql同步复制M-M(master master)模式》 里,配置了这样一种双向同步机制,两台服务器都可以保持同步并且都可以读写,但是这种配置方案还不完善,生产上实际可能出现很多问题...

鉴客
2011/08/16
414
0
mysql集群(一)

一、mysql cluster 结构: sql + data + mgm节点 原理: 集群由3个概念 1,sql节点 sql node 2,数据节点 data node 3,管理节点 ndb managerment sql语句发送sql节点,sql节点发往数据节点,...

我心中有猛狗
2016/05/10
68
0
MySQL自增属性auto_increment_increment和auto_increment_offset

MySQL的系统变量或会话变量autoincrementincrement(自增步长)和autoincrementoffset(自增偏移量)控制着数据表的自增列ID。 获取指定数据表的下一个auto_increment自增值的两种方式: autoinc...

野雪球
2018/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
24分钟前
0
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
25分钟前
0
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
41分钟前
2
0
IntelliJ IDEA 第一个 Scala 程序

IntelliJ 安装完成 Scala 插件后,你需要尝试使用 IntelliJ 来创建并且运行第一个程序。 通常这个程序只是简单的输出 Hello World。 创建一个新工程 在文件下面选择新建,然后选择创建工程。...

honeymose
46分钟前
2
0
csapp 习题 - 如何实现异或 exclusive-or

阅读 csapp v3 时,练习题 2.13 很有意思。练习题描述如下。 位设置是对于参数 mask 中每一个为 1 的位,那么参数 x 中相应位则被设置为 1 ;位清除是对于参数 mask 中每一个为 1 的位,那么...

ylme
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部