docker环境auto_increment自增设置无效问题排查

【声明】本文为AdamsLee原创,转载请注明出自围炉网并保留本文有效链接:docker环境auto_increment自增设置无效问题排查, 转载请保留本声明!

本周同事们花了几个小时排查了下auto_increment自增问题失败情况,现汇总如下。

问题描述:通过docker带起的mysql容器,auto_increment设置无法生效;

初步结论:不是docker的锅,是mysql的锅!!!

本周工作步骤如下(需要直接看结果的请下拉至.结论及后续改进步骤):

一.重新复现问题

  1. 很久没碰rancherdocker环境了,大家聚在一起先理理思路;

  2. 利用rancher进行restart container,问题复现,auto_increment=1

  3. 直接进入container运行sql脚本,AUTO_INCREMENT=10000000

  4. 看来不是人品问题,是需要排查的问题。。。

二.分析问题

  1. 剥离rancher

发现rancher会自动对container进行检测和重启,对复现及定位问题不太方便,因此重新打了个镜像,方便后续操作;

测试结果:fail

分析结论:与rancher无关;

  1. 研究docker mysql启动脚本entrypoint.sh

主要分为如下阶段:skip-networking方式后台启动mysqld -> 运行init_all_mysql.sh灌库脚本 -> 关闭mysqld -> 前台方式启动mysqld-> 脚本退出带起容器;(坑就在这里

测试结果:container内移动sql语句运行的位置,无问题;但通过restart container方式,一直不成功;

分析结论:sql语句应该无问题,很可能是docker问题;(最后发现跑偏了)

  1. 记录sql执行过程

为了定位docker问题,打开了sql语句的日志功能,记录每条sql语句的执行情况,观察执行时AUTO_INCREMENT的值有无变化;

测试结果:出乎意料,数据库的日志记录语句执行结果正常,是AUTO_INCREMENT=10000000

分析结论:docker restartsql日志记录显示AUTO_INCREMENT=10000000,说明docker start时无问题,接近万念俱灰。。。

cid:image001.png@01D294E9.BAE0C830

  1. 重新整理思路

1docker start container时,sql语句确实都跑了,而且AUTO_INCREMENT=10000000,为什么进去看就没了呢?

2Sql语句没问题,docker没问题,那会是啥问题?

3)改了AUTO_INCREMENT的语法,发现不行仍然不行;改了AUTO_INCREMENT的值,发现也不行;

4)只有fis的t_fis_current_prod_info表有问题吗?找了另一个表t_fis_white_list_group,AUTO_INCREMENT=2,也不行;

分析结论:那就是所有的auto_increment操作都不行,不是sql语句问题,也不是docker问题,那会是啥问题?mysql问题?其他环境为啥没有?

  1. 万能的google

  2. 还是先查docker问题,有人提了一个docker issue,无人响应,我附和了下,然并卵;

https://github.com/docker-library/mysql/issues/269

  1. mysqlauto_increment,终于有了突破;

http://serverfault.com/questions/228690/mysql-auto-increment-fields-resets-by-itself

cid:image002.png@01D294EB.B18C6800

  1. 原来是mysql的锅,简单来说是auto_increment存储在内存中,mysql重启后,如果table为空,innodb会自动把auto_increment重置为1

  2. 赶紧验证是否正确哈,改下sql语句,加一条insert,然后重启container,生效了,热泪盈眶

  PRIMARY KEY (`id`),

) ENGINE=InnoDB AUTO_INCREMENT=10000000 DEFAULT CHARSET=utf8;me)                                                 

INSERT INTO `eif_fis`.`t_fis_current_prod_info` (`balance_id`, `product_name`, `product_desc`, `product_code`, `value_date`, `normal_redeem_mode`, `clear_account_sign`) VALUES (100, 'test', 'test', 'test', 100, 1, 1); 

cid:image003.png@01D294EF.E4385F80

  • 结论及后续改进步骤

初步结论:

如果表为空,重启mysql后,auto_increment会自动重置为1

目前docker mysql启动脚本中存在两次启动mysql过程,会触发此问题;

影响范围是所有auto_increment不为1 的表都会有此问题(除非非空);

其他各环境中(比如生产,测试)表不会为空,也不会频繁重启mysql,所以没暴露出来;

后续改进步骤,大家讨论:

  1. 看看有无mysql bug可以修复?

  2. 插入一条数据,确保表非空?

  3. sql脚本放在容器启动后跑?

  4. 更改docker entroypoint脚本,使其兼容;

此条目发表在未分类分类目录,贴了, 标签。将固定链接加入收藏夹。