Bug #77743 | Auto-increment sequence gets reset | ||
---|---|---|---|
Submitted: | 16 Jul 2015 3:38 | Modified: | 27 Jul 2015 20:05 |
Reporter: | Marcos Albe (OCA) | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
Version: | 5.6.25, 5.6.27 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | `, auto increment, table_open_cache |
[16 Jul 2015 3:38]
Marcos Albe
[16 Jul 2015 3:39]
Marcos Albe
Bash script to reproduce the issue
Attachment: reproduce.sh (application/x-shellscript, text), 1.76 KiB.
[16 Jul 2015 3:46]
Marcos Albe
Fixed typo in synopsis
[16 Jul 2015 4:44]
MySQL Verification Team
Hello Marcos, Thank you for the report and test case. Observed this with 5.6.27 build with innodb engine. Thanks, Umesh
[16 Jul 2015 4:48]
MySQL Verification Team
// 5.6.27 [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: ./reproduce.sh 100 2000 10 innodb; initial auto-inc value: 3... Sleeping 10 final auto-inc value: 1 FAILED!!, with 2000 innodb tables and table_open_cache=100; sleep set to 10. Above should be more than enough to confirm, but just tried to see again: [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: bin/mysql -uroot -S /tmp/mysql_ushastry.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4019 Server version: 5.6.27-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial) 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> use TESTAI Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> DROP TABLE IF EXISTS TESTAI.every5minutes; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE TESTAI.every5minutes ( -> Id int(11) NOT NULL AUTO_INCREMENT, -> ActionId int(11) NOT NULL DEFAULT '0', -> ItemId int(11) NOT NULL DEFAULT '0', -> PRIMARY KEY (Id), -> KEY ActionId (ActionId), -> KEY ItemId (ItemId) -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 CHECKSUM=1; Query OK, 0 rows affected (0.00 sec) mysql> show create table TESTAI.every5minutes\G *************************** 1. row *************************** Table: every5minutes Create Table: CREATE TABLE `every5minutes` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `ActionId` int(11) NOT NULL DEFAULT '0', `ItemId` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`), KEY `ActionId` (`ActionId`), KEY `ItemId` (`ItemId`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 CHECKSUM=1 1 row in set (0.00 sec) mysql> INSERT INTO TESTAI.every5minutes SET id=2; Query OK, 1 row affected (0.00 sec) mysql> show create table TESTAI.every5minutes\G *************************** 1. row *************************** Table: every5minutes Create Table: CREATE TABLE `every5minutes` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `ActionId` int(11) NOT NULL DEFAULT '0', `ItemId` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`), KEY `ActionId` (`ActionId`), KEY `ItemId` (`ItemId`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 CHECKSUM=1 1 row in set (0.00 sec) mysql> DELETE FROM TESTAI.every5minutes; Query OK, 1 row affected (0.00 sec) mysql> show create table TESTAI.every5minutes\G *************************** 1. row *************************** Table: every5minutes Create Table: CREATE TABLE `every5minutes` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `ActionId` int(11) NOT NULL DEFAULT '0', `ItemId` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`), KEY `ActionId` (`ActionId`), KEY `ItemId` (`ItemId`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 CHECKSUM=1 1 row in set (0.00 sec) mysql> source /export/umesh/server/binaries/mysql-advanced-5.6.27/5_6_27.explains.new; Database changed +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | SIMPLE | t | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ 2 rows in set (0.00 sec) +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | t2 | ALL | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | SIMPLE | t | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ 2 rows in set (0.00 sec) . . +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | t1999 | ALL | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | SIMPLE | t | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ 2 rows in set (0.00 sec) +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | t2000 | ALL | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | SIMPLE | t | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------------+ 2 rows in set (0.00 sec) mysql> show create table TESTAI.every5minutes\G *************************** 1. row *************************** Table: every5minutes Create Table: CREATE TABLE `every5minutes` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `ActionId` int(11) NOT NULL DEFAULT '0', `ItemId` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`), KEY `ActionId` (`ActionId`), KEY `ItemId` (`ItemId`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 CHECKSUM=1 1 row in set (0.00 sec) ## with myisam [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: ./reproduce.sh 100 2000 10 myisam; initial auto-inc value: 3... Sleeping 10 final auto-inc value: 3 Passed, with 2000 myisam tables and table_open_cache=100; sleep set to 10.
[16 Jul 2015 5:12]
MySQL Verification Team
// 5.7.9 build seems to be not affected [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.7.9: ./reproduce.sh 100 2000 10 innodb; initial auto-inc value: 3... Sleeping 10 final auto-inc value: 3 Passed, with 2000 innodb tables and table_open_cache=100; sleep set to 10.
[16 Jul 2015 5:16]
MySQL Verification Team
// 5.5.46 build not affected as well [umshastr@hod03]/export/umesh/server/binaries/mysql-5.5.46: ./reproduce.sh 100 2000 10 innodb; initial auto-inc value: 3... Sleeping 10 final auto-inc value: 3 Passed, with 2000 innodb tables and table_open_cache=100; sleep set to 10.
[23 Jul 2015 0:09]
Sveta Smirnova
Umesh, can you check if this is related to bug #76037?
[24 Jul 2015 12:14]
Shaohua Wang
Posted by developer: autoinc is reset to 0 when table is loaded after table is evicted without any rows. The solution is store autoinc value in a map when table is evicted, and restore autoinc when table is loaded. Pushed the fixed to 5.6 & 5.7. In trunk, WL#6204 - InnoDB persistent max value for autoinc columns will fix the bug(rb#9138).
[24 Jul 2015 12:46]
Sveta Smirnova
Thank you for the quick fix, Shaohua!
[27 Jul 2015 20:05]
Daniel Price
Fixed as of the upcoming 5.6.27, 5.7.9, 5.8.0 releases, and here's the changelog entry: Reloading a table that was evicted while empty caused an AUTO_INCREMENT value to be reset. Thank you for the bug report.
[28 Jul 2015 17:10]
Sveta Smirnova
Shaohua, did you test cases when table includes few rows (not 100% empty), but auto-increment field still reset? We saw such a case in the environment where bug occurred first time.
[29 Jul 2015 4:16]
Shaohua Wang
Sveta, if reset means auto_increment starts from 1, I don't see such case with a few rows. When a table is loaded, we usually search for max auto_increment value in the table, that's why auto_increment gets reset with empty table. after all, the patch pushed fixed all such reset issues.
[20 Aug 2015 19:46]
Sveta Smirnova
Tese case for situation when table is not empty
Attachment: reproduce_non_empty.sh (application/x-shellscript, text), 1.82 KiB.
[21 Sep 2015 10:27]
MySQL Verification Team
Bug #78491 marked as duplicate of this