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