2010-04-21 2 views
1

Пожалуйста, помогите мне в серьезных проблемах с нашей производственной базой данных. Я случайно вставил ключ с очень большим значением в столбец автоинкремента, и теперь я не могу изменить это значение без огромного времени перестройки.Сброс 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 
+0

Где mySQL хранит это значение? Возможно, я мог бы взломать это место – Artem

ответ

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

0

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

От docs on myisamchk:

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

+0

Да, я действительно его потерял :(Не помогает по какой-то причине. Спасибо. Любые другие идеи? – Artem

+0

Вы успешно использовали эту программу раньше? – Artem

+0

@Artem слишком плохо, странно. никогда не использовали его для изменения значения 'auto_increment', насколько я помню. Только дополнительная идея, которая приходит на ум, пытается« -set-auto-increment »без указания значения. –

Смежные вопросы