MySql:表中缺少自动增量

MySql:表中缺少自动增量,mysql,auto-increment,Mysql,Auto Increment,MySql:AUTO_INCREMENT在运行大约一个月后,在某些表中丢失 最初:(显示创建表Foo) 一个月后: CREATE TABLE `Foo` ( `id` bigint(20) NOT NULL, `name` varchar(10) NOT NULL, `type` tinyint(2) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET

MySql:AUTO_INCREMENT在运行大约一个月后,在某些表中丢失

最初:(显示创建表Foo)

一个月后:

CREATE TABLE `Foo` (
  `id` bigint(20) NOT NULL,
  `name` varchar(10) NOT NULL,
  `type` tinyint(2) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
缺少自动增量。原因是什么


Mysql服务器版本:5.6.25,Linux

一定有人更改了它。这种变化不是自发发生的

我可以自己复制这种变化:

CREATE TABLE Foo ( id BIGINT AUTO_INCREMENT, ...

ALTER TABLE Foo MODIFY COLUMN id BIGINT;

SHOW CREATE TABLE Foo\G

*************************** 1. row ***************************
       Table: foo
Create Table: CREATE TABLE `foo` (
  `id` bigint(20) NOT NULL,
  `name` varchar(10) NOT NULL,
  `type` tinyint(2) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
现在该列显示它是BIGINT,但不是AUTO_INCREMENT

每次修改列或更改列时,必须重复所有列选项,如NOT NULL、AUTO_INCREMENT和DEFAULT,否则将恢复为默认值(即NOT AUTO INCREMENT)

因此,我认为这表明有人做了一个ALTER表,但不记得包含AUTO_INCREMENT列选项。

只是一个想法

如果您有二进制日志,您可能会看到日志上的alter查询以及它的运行时间。:) 检查二进制日志是否由启用

show variable like 'log_bin';
如果启用了二进制日志,请查找可能执行查询的时间段,然后使用以帮助您找到它


如果未启用二进制日志,则会带来厄运——正如Bill Karwin在上一篇文章中指出的那样,mysql不会自行更改它——一定是有人更改了它。

dba或程序删除了自动增量/或者表恢复到了一个版本,该版本没有在该字段中添加自动增量。如果你有日志,那么你也许能找到答案。如果你不知道,你可能永远也不知道。然而,有一点是肯定的,那就是我们不能告诉你那里发生了什么。更大的问题是:您计划如何防止或至少跟踪对您的模式的此类更改。我是唯一可以访问数据库的人。我100%确定没有人更改表。看,mysql不会从字段中随机删除自动递增属性。如果您是唯一可以访问数据库的用户,那么您一定做了导致此属性丢失的操作。下面比尔·卡温提供了一个可能的解释。但是,除非您有日志,否则您将无法确定。查看应用服务器日志(不是db日志),在今天上午11点,用户可以成功地将行插入表中,这意味着在该时间戳处存在自动增量。许多表。有没有办法找到所有缺少AUTO_INCREMENT的表,以便逐个修复它们?不幸的是,它已关闭。我不准备接受这个答案,因为我100%确定我们在过去几个月没有在生产机器上更改任何表。我会看看它是否会再次发生。如果出现这种情况,mysql将变得不可用。@Sunnyday我建议您现在启用二进制日志或查询日志,以便在语句再次出现时捕获该语句。
show variable like 'log_bin';