重置myISAM上的AUTO_INCREMENT而不重建表

时间:2010-04-21 19:38:45

标签: mysql auto-increment myisam alter-table

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

ALTER TABLE tracks_copy AUTO_INCREMENT = 661482981

超级慢。

如何在生产中修复此问题?我也无法让它工作(没有效果):

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

有什么想法吗?

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

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

2 个答案:

答案 0 :(得分:2)

经过几个小时的挣扎,我终于能够解决它了。 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文件转储到hexfile中,在字节60周围编辑,并在hexfile中手动替换auto_increment值。然后“xxd -r”从hex文件恢复二进制文件。为了准确地发现要编辑的内容,我只是在更小的表上使用ALTER TABLE并使用diffs查看效果。没有乐趣,但它最终有效。格式中似乎存在校验和,但似乎被忽略了。

答案 1 :(得分:0)

你是否用非常大的钥匙丢掉了记录?如果该记录仍然存在,我认为你不能将auto_increment更改为较低的值。

来自docs on myisamchk

  

强制新记录的AUTO_INCREMENT编号以给定值开始(或者更高,如果现有记录的AUTO_INCREMENT值很大)