mysql - 在不重建表的情况下重置 myISAM 上的 AUTO_INCREMENT

标签 mysql auto-increment myisam alter-table

请帮助我的生产数据库遇到大麻烦。我不小心将一个具有非常大值的键插入到自动增量列中,现在我似乎无法在没有大量重建时间的情况下更改此值。

ALTER TABLE tracks_copy AUTO_INCREMENT = 661482981

super 慢。

如何在生产环境中解决这个问题?我也无法让它工作(没有效果):

myisamchk tracks.MYI --set-auto-increment=661482982

有什么想法吗?

基本上,无论我做什么我都会溢出:

SHOW CREATE TABLE tracks
CREATE TABLE tracks (
...
) ENGINE=MYISAM AUTO_INCREMENT=2147483648 DEFAULT CHARSET=latin1

最佳答案

经过几个小时的努力,我终于能够解决它。 myISAM 的 auto_increment 信息存储在 TableName.MYI 中,参见 http://forge.mysql.com/wiki/MySQL_Internals_MyISAM 中的 state->auto_increment .所以修复那个文件是正确的方法。

然而,myisamchk 在 update_auto_increment 函数或它调用的函数中肯定有一个溢出错误,所以它不适用于大值——或者更确切地说,如果当前值已经 > 2^31,它不会更新它 (源文件在这里 -- http://www.google.com/codesearch/p?hl=en#kYwBl4fvuWY/pub/FreeBSD/distfiles/mysql-3.23.58.tar.gz%7C7yotzCtP7Ko/mysql-3.23.58/myisam/mi_check.c&q=mySQL%20%22AUTO_INCREMENT=%22%20lang:c )

发现这一点后,我最终只是使用“xxd”将 MYI 文件转储到 hex 文件中,编辑大约 60 个字节,并手动替换 hex 文件中的 auto_increment 值。 “xxd -r”然后从十六进制文件恢复二进制文件。为了准确地发现要编辑的内容,我只是在小得多的表上使用了 ALTER TABLE,并使用差异查看了效果。没有乐趣,但它最终奏效了。格式里好像有校验和,但是好像被忽略了。

关于mysql - 在不重建表的情况下重置 myISAM 上的 AUTO_INCREMENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2686032/

相关文章:

mysql - 从表中删除重复行

php - CodeIgniter:如何在验证后返回表格行中的所有数据?

sql - TSQL 更新时自动增量

mysql - 了解MySql Auto_Increment

mysql - 更改mysql系统表的存储引擎?

mysql - 一段时间内的不同计数

mysql - 使用触发器将已删除的记录归档到多个表中

sql - 将带有 id 的行插入到具有自动增量的表中

mysql - 大型 MyISAM 表的稳定性有多可靠?

mysql - 如果唯一键很长,将 MYISAM 表转换为 INNODB