如何使 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 数据字典中的句柄包含一个特殊的计数器,称为 用于分配新值的自动增量计数器 列。此计数器仅存储在主内存中,而不存储在磁盘上。
您设置的变量定义了不同会话同时访问此结构的方式,而不是其生命周期。
如果您想在服务器重新启动之间保留一个自动增量值,您应该在每次写入时将其保存在不受事务控制的表中(如 MyISAM
或 Archive
),并在服务器重启。
【讨论】:
那么,您对如何保存自动补偿有任何想法吗?我需要旧的 MySQL 行为。 谢谢,但我已阅读文档并没有找到解决方案。 @Miraage:“老”是什么意思?MyISAM
?
即使在 5.1 版本上的 innodb 也没有这样的行为。
@Miraage:是的。 MyISAM
表确实会在表元数据中存储自动增量值,但 InnoDB
不会,也从未这样做过。以上是关于如何使 InnoDB 表在服务器重启时不重置自动增量?的主要内容,如果未能解决你的问题,请参考以下文章