Сброс AUTO_INCREMENT на myISAM без перестройки таблицы - PullRequest
1 голос
/ 21 апреля 2010

Пожалуйста, помогите У меня большие проблемы с нашей производственной базой данных.Я случайно вставил ключ с очень большим значением в столбец автоинкремента, и теперь я не могу изменить это значение без значительного времени перестроения.

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 ]

2 голосов
/ 22 апреля 2010

Поработав с этим в течение нескольких часов, я наконец смог решить его. Информация auto_increment для myISAM хранится в TableName.MYI, см. State-> auto_increment в http://forge.mysql.com/wiki/MySQL_Internals_MyISAM. Так что исправление этого файла было правильным решением.

Однако 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 в шестнадцатеричный файл, редактирования около 60 байта и замены значения auto_increment вручную в шестнадцатеричном файле. Затем «xxd -r» восстанавливает двоичный файл из шестнадцатеричного файла. Чтобы узнать, что именно нужно редактировать, я просто использовал ALTER TABLE для таблиц меньшего размера и посмотрел на эффекты с помощью diff. Не весело, но в итоге это сработало. Кажется, в этом формате есть контрольная сумма, но она игнорируется.

0 голосов
/ 21 апреля 2010

Вы сбросили запись с очень большим ключом?Я не думаю, что вы можете изменить auto_increment на меньшее значение, если эта запись все еще существует.

Из документов на myisamchk :

Принудительная нумерация AUTO_INCREMENTчтобы новые записи начинались с заданного значения (или выше, если существуют существующие записи с такими большими значениями AUTO_INCREMENT)

...