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

Posted

技术标签:

【中文标题】如何使 InnoDB 表在服务器重启时不重置自动增量?【英文标题】:How to make InnoDB table not reset autoincrement on server restart? 【发布时间】:2014-08-14 16:12:28 【问题描述】:

我的开发机器上运行着 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 表。谢谢大家的回复/cmets。

【问题讨论】:

【参考方案1】:

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

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

SELECT MAX(ai_col) FROM t FOR UPDATE

; InnoDB 增加值 由语句检索并将其分配给列和 表的自动增量计数器。默认情况下,该值为 加一。这个默认值可以被 auto_increment_increment配置设置。

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

在服务器可执行文件的生命周期内,它存储在一个特殊的结构中,但在服务器重启之间不会持久化:

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

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

如果您想在服务器重新启动之间保留一个自动增量值,您应该在每次写入时将其保存在不受事务控制的表中(如 MyISAMArchive),并在服务器重启。

【讨论】:

那么,您对如何保存自动补偿有任何想法吗?我需要旧的 MySQL 行为。 谢谢,但我已阅读文档并没有找到解决方案。 @Miraage:“老”是什么意思? MyISAM? 即使在 5.1 版本上的 innodb 也没有这样的行为。 @Miraage:是的。 MyISAM 表确实会在表元数据中存储自动增量值,但 InnoDB 不会,也从未这样做过。

以上是关于如何使 InnoDB 表在服务器重启时不重置自动增量?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL8.0新特性—InnoDB增强

server 2012 cleartype设置自动启动

mysql 重置当前的自动增量值

自动递增 - 每年自动重置

phpstudy每次重启电脑后MYSQL和PAPCHE就无法启动

CakePHP:删除行后如何使自动增量值再次连续