1

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

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
4

2 回答 2

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”然后从十六进制文件恢复二进制文件。为了准确发现要编辑的内容,我只是在更小的表上使用了 ALTER TABLE 并使用差异查看了效果。不好玩,但它最终奏效了。格式中似乎有校验和,但似乎被忽略了。

于 2010-04-21T22:17:06.680 回答
0

你有没有用非常大的键丢弃记录?如果该记录仍然存在,我认为您不能将 auto_increment 更改为较低的值。

myisamchk 上的文档

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

于 2010-04-21T19:41:57.453 回答