如何让InnoDB表在服务器重启时不重置自动增量?

时间:2014-06-24 11:52:49

标签: mysql innodb auto-increment

我在我的开发机器上运行MySQL 5.5.37。 我用innodb表。面临下一个问题 - 服务器重启后自动增量重置。

找到autoinc_lock_mode,设置为0,但没有帮助。

SHOW VARIABLES命令显示autoinc_lock_mode的值为0。

我的所作所为:

select max(id) from tablex; // 11, autoincrement is 12
insert into tablex values ('foo');
select max(id) from tablex; // 12, autoincrement is 13
delete from tablex where id > 11; // autoincrement is 13

然后我重启服务器......和....(鼓声

show create table tablex; // autoincrement 12 instead of 13

我做错了什么? :(

// UPD

我必须使用MyISAM表。谢谢大家的回复/评论。

1 个答案:

答案 0 :(得分:9)

在InnoDB中,自动增量值不是表格元数据的一部分,并在每次重启服务器时重置。

  

InnoDB使用以下算法初始化自动增量   包含名为AUTO_INCREMENT列的表t的计数器   ai_col:服务器启动后,第一次插入表t,   InnoDB执行此语句的等价物:

     

SELECT MAX(ai_col) FROM t FOR UPDATE

     

InnoDB递增值   由语句检索并将其分配给列和   表的自动递增计数器。默认情况下,该值为   增加1。此默认值可以被覆盖   auto_increment_increment配置设置。

     

如果表为空,InnoDB使用值1.默认值为   被auto_increment_offset配置设置覆盖。

在服务器可执行生命周期中,它存储在一个特殊的结构中,但不会在服务器重新启动之间保留:

  

如果为InnoDB表指定AUTO_INCREMENT列,则为表   InnoDB数据字典中的句柄包含一个名为的特殊计数器   用于为其分配新值的自动递增计数器   专栏。此计数器仅存储在主存储器中,而不存储在磁盘上。

您设置的变量定义了不同会话同时访问此结构的方式,而不是其生命周期。

如果要在服务器重新启动之间保持自动增量值,则应在每次写入时将其保存在不受事务控制(如MyISAMArchive)的表中并重置它从服务器重启表中。