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

Mir*_*age 4 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
Run Code Online (Sandbox Code Playgroud)

然后我重新启动服务器......和....(鼓滚)

show create table tablex; // autoincrement 12 instead of 13
Run Code Online (Sandbox Code Playgroud)

我做错了什么?:(

// UPD

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

Qua*_*noi 10

在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)的表中,并在服务器重新启动时从表中重置它.