本节介绍如何InnoDB初始化 AUTO_INCREMENT计数器。
如果InnoDB为表指定AUTO_INCREMENT列,则内存中的表对象包含一个称为自动增量计数器的特殊计数器,用于为该列分配新值。
在 MySQL 5.7 及更早版本中,自动增量计数器存储在主内存中,而不是磁盘上。要在服务器重新启动后初始化自动增量计数器,InnoDB将在第一次插入包含 AUTO_INCREMENT列的表时执行与以下语句等效的语句。
SELECT MAX(ai_col) FROM table_name FOR UPDATE;在 MySQL 8.0 中,这种行为发生了变化。当前最大的自动增量计数器值在每次更改时写入重做日志并保存到每个检查点的数据字典中。这些更改使当前最大的自动增量计数器值在服务器重新启动时保持不变。
在服务器正常关闭后重新启动时, InnoDB使用存储在数据字典中的当前最大自动增量值初始化内存中的自动增量计数器。
在崩溃恢复期间重新启动服务器时, InnoDB使用存储在数据字典中的当前最大自动增量值初始化内存中的自动增量计数器,并扫描重做日志以查找自上一个检查点以来写入的自动增量计数器值。如果重做记录的值大于内存中的计数器值,则应用重做记录的值。但是,在服务器意外退出的情况下,无法保证重用先前分配的自动增量值。每次当前最大自动增量值由于一个 INSERT或 UPDATE操作时,新的值被写入重做日志,但如果在重做日志刷新到磁盘之前发生意外退出,则在服务器重新启动后初始化自增计数器时可以重用先前分配的值。
InnoDB使用等效SELECT MAX(ai_col) FROM table_name FOR UPDATE语句来初始化自动增量计数器的唯一情况是在导入没有元数据文件的表时。否则,从元数据文件中读取当前最大的自动增量计数器值(如果存在)。除了计数器值初始化之外, 可以使用ALTER TABLE ... AUTO_INCREMENT = N FOR UPDATE来修改计数器值设置。您可能会在删除一些记录后尝试将计数器值设置为较小的值。在这种情况下,必须查表以确保新的计数器值不小于或等于当前的实际最大计数器值。
在 MySQL 5.7 及更早版本中,服务器重启会取消AUTO_INCREMENT = N选项的效果。该选项可以在CREATE TABLE或 ALTER TABLE语句中分别用于设置初始计数器值或更改现有计数器值。在 MySQL 8.0 中,服务器重启不会取消 AUTO_INCREMENT = N选项的效果。如果将自动增量计数器初始化为特定值,或者将自动增量计数器值更改为更大的值,则新值会在服务器重新启动时保持不变。
在 MySQL 5.7 及更早版本中,在ROLLBACK 操作后立即重新启动服务器可能会导致重用先前分配给回滚事务的自动增量值,从而有效地回滚当前最大的自动增量值。在 MySQL 8.0 中,当前最大的自动增量值被持久化,防止重复使用以前分配的值。
如果SHOW TABLE STATUS语句在自动增量计数器初始化之前检查表,则InnoDB打开表并使用存储在数据字典中的当前最大自动增量值初始化计数器值。然后将该值存储在内存中以供以后的插入或更新使用。计数器值的初始化使用事务级的排他锁定读取。InnoDB在为用户指定的自增值大于 0 的新创建的表初始化自增计数器时遵循相同的过程。
自增计数器初始化后,如果在插入行时未显式指定自增值,则会 InnoDB隐式递增计数器并将新值分配给列。如果插入显式指定自增列值的行,并且该值大于当前最大计数器值,则将计数器设置为指定值。
只要服务器运行,InnoDB使用内存中的自动增量计数器。当服务器停止并重新启动时,InnoDB重新初始化自动增量计数器,如前所述。
auto_increment_offset变量确定列值的起点。AUTO_INCREMENT默认设置为1。
auto_increment_increment 变量控制连续列值之间的间隔。默认设置为1。
| 留言与评论(共有 0 条评论) “” |