背景

在上一期的月报中,我们在InnoDB自增列重复值问题 中提到,InnoDB 自增列在重启后会丢失,因为MySQL没有持久化自增值,平时是存在内存表对象中的。如果实例重启的话,内存值丢失,其初始化过程是做了一个类似 select max(id) + 1 操作。实际上存在另外一种场景,实例即使不重启,也会导致自增值丢失。

问题说明

实例运行过种中,InnoDB表自增值是存储在表对象中的,表对象又是放在缓存中的,如果表太多而不能全部放在缓存中的话,老的表就会被置换出来,这种被置换出来的表下次再使用的时候,就要重新打开一遍,对自增列来说,这个过程就和实例重启类似,需要 select max(id) + 1 算一下自增值。

对InnoDB来说,其数据字典中表对象缓存大小由 table_definition_cache 系统变量控制,在5.6.8之后,其最小值是400。和表缓存相关的另一个系统变量是table_open_cache,这个控制的是所有线程打开表的缓存大小,这个缓存放在server层。

下面我们用testcase的方式来给出InnoDB表对象对置换出的场景:

可以看到自增值确实和重启场景一样,本应是100,却变成了 2(select max(id) + 1)了。

问题分析

原因就是缓存不够,导致表对象被换出,下次再用就要重新打开,这里给出调用栈,对代码感兴趣的同学可以看下。

将老的table置换出:

尝试从缓存加载表对象:

缓存加载不到表对象,用select maxt 逻辑初始化自增:

处理建议

对于这个问题,一种解决方法是从源码改进,将自增值持久化,可以参考上期的月报给出的思路;如果不想改代码的话,可以这样绕过:在设定auto_increment值后,主动插入一行记录,这样不论在重启还是缓存淘汰的情况下,重新打开表仍能得到预期的值。

MySQL内核月报 2015.02-MySQL · 答疑释惑· InnoDB丢失自增值相关推荐

  1. MySQL内核月报 2015.01-MySQL · 捉虫动态· InnoDB自增列重复值问题

    问题重现 先从问题入手,重现下这个bug 这里我们关闭mysql,再启动mysql,然后再插入一条数据 我们看到插入了(2,2),而如果我没有重启,插入同样数据我们得到的应该是(4,2). 上面的测试 ...

  2. mysql server id为0_MySQL内核月报 2014.12-MySQL· 答疑释惑·server_id为0的Rotate-阿里云开发者社区...

    背景 在MySQL的M-S结构里面,event是binlog日志的基本单位.每个event来源于主库,每个Event都包含了serverid,用于表示该event是哪个实例生成的. 在5.6里面,细心 ...

  3. MySQL内核月报 2015.01-MySQL · 捉虫动态· replicate filter 和 GTID 一起使用的问题

    问题描述 当单个 MySQL 实例的数据增长到很多的时候,就会考虑通过库或者表级别的拆分,把当前实例的数据分散到多个实例上去,假设原实例为A,想把其中的5个库(db1/db2/db3/db4/db5) ...

  4. mysql内核架构_热血江湖mysql内核技术之门派数据库表结构说明

    小编之前已经多次和大家说过了一个概念,不管你打算架设的是什么游戏什么版本都必须熟悉它的数据库整体结构.今天小编要说的是热血江湖私服游戏中最难的MYSQL内核技术,对于玩家来说MYSQL技术无疑是最难的 ...

  5. mysql auto position_MySQL内核月报 2015.01-MySQL · 捉虫动态· 设置 gtid_purged 破坏AUTO_POSITION复制协议-阿里云开发者社区...

    bug描述 Oracle 最新发布的版本 5.6.22 中有这样一个关于GTID的bugfix,在主备场景下,如果我们在主库上 SET GLOBAL GTID_PURGED = "some_ ...

  6. MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间

    背景 Innodb使用undo log来实现MVCC,这意味着如果一个很老的事务长时间不提交,那么新产生的undo log都无法被及时清理掉.在MySQL 5.5及之前版本中,undo log是存储在 ...

  7. MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment

    背景: Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引用). Innodb表定义中处理主键的逻辑是: 1.如果表定义了主键,就使用主键唯一定位一 ...

  8. MySQL内核月报 2014.10-MySQL· 捉虫动态·binlog重放失败

    背景 在 MySQL 日常维护中,要回滚或者恢复数据,我们经常会用 binlog 来在数据库上重放,执行类似下面的语句: mysqlbinlog mysql-bin.000001 | mysql -h ...

  9. MySQL内核月报 2014.08-TokuDB·社区八卦·TokuDB团队

    第一期先介绍下TokuDB团队吧. TokuDB自从开源后(更赞的是开源了所有的commits),逐渐被大家所熟悉,MariaDB 5.5系列和Percona Server 5.6的GA版本中,都以p ...

最新文章

  1. 运动目标检测__光流法
  2. Apache Hadoop 2.7如何支持读写OSS
  3. 从Config文件中读取节点的配置信息
  4. 如何让for循环中最后一次的输出和循环体的不一样
  5. Android Telephony分析(七) ---- 接口扩展(异步转同步)
  6. waf可以查看post请求吗_WAF是如何被绕过的?
  7. 【IT笔试面试题整理】链表
  8. 如何看屈曲因子_Abaqus 非线性屈曲分析方法
  9. sqlite3的sql语句用法总结与SQLite生成.db-journal文件问题【原创】
  10. H3C vrrp *** ipsec 基本配置
  11. 风吹来_“秃如其来”的年轻人,如何才能让头发“春风吹又生”?
  12. 老漏洞easy击:CVE-2012 0158占顶!
  13. 结对编程之求首尾相连数组中最大子数组的和
  14. 北斗导航 | RAIM:基于速率监测的GNSS/INS完好性监测
  15. StringUtil和StringUtils的区别
  16. 基于php的物流系统设计与实现
  17. 至强服务器性能视频,至强CPU性能表现测试
  18. 牧月科技完成近5000万元天使轮融资,为无人驾驶货运物流提供解决方案
  19. 【论文阅读】时间序列中的变量是一张知识图谱
  20. GUI编程--03--Swing

热门文章

  1. C++常见面试题-30道
  2. 互联网行业不需要中年人,那些35岁离开BAT的人都去哪了?
  3. 不懂性能测试,被面试官挂了...
  4. string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库
  5. oracle多少钱一套_消防水炮多少钱一套?您真的只需要一套吗
  6. Coregistration: Simultaneous Alignment and Modeling of Articulated 3D Shape
  7. TAUCS库的编译(vs2010)
  8. ros melodic控制真实机械臂之moveit_setup_assistant配置
  9. c语言程序报告的前言,C语言 程序代码编写规范前言
  10. 文本分类的14种算法