Сброс AUTO_INCREMENT на myISAM, не восстанавливая таблицу

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

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
1
задан bobince 21 April 2010 в 20:17
поделиться

2 ответа

После нескольких часов борьбы с этим я, наконец, смог решить эту проблему. Информация об 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 для гораздо меньших таблиц и посмотрел на эффекты с помощью различий. Неинтересно, но в конце концов это сработало. В формате вроде бы есть контрольная сумма, но вроде игнорируется.

2
ответ дан 3 September 2019 в 01:07
поделиться

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

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

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

0
ответ дан 3 September 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: