Недавно я получил эту ошибку от MySQL:
Failed to read auto-increment value from storage engine
Обращаясь к этим вопросам SO:
Я понял, что мне нужно увеличить размер поля auto_increment
, чтобы мы могли продолжать добавлять записи в нашу базу данных. Я увеличил размер поля с int
до bigint unsigned
, но размер auto_increment
для таблицы не увеличился, когда я изменил поле.
Другими словами, при использовании show table status
в моей таблице отображается AUTO_INCREMENT=2147483655
до и после обновления столбца (что явно противоречит цели обновления).
Могу ли я в любом случае исправить свою таблицу, чтобы она правильно отображала максимальный размер поля auto_increment
(AUTO_INCREMENT=18446744073709551615
) без необходимости воссоздавать таблицу?
Я пытался удалить auto_increment
из поля и снова добавить его, но это не сработало.
@Дай, это не так сложно. Нам пришлось изменить столбец ID с INT на BIGINT несколько лет назад, когда он переполнился. На самом деле у нас нет 2 миллиардов строк одновременно, потому что мы периодически удаляем старые строки, но эти идентификаторы не используются повторно.
@Dai Я видел, как это происходит в дикой природе. Например, при сбое многих вставок значения автоинкремента теряются. Или если кто-то непреднамеренно вставил строку, указывающую значение, например, 2 миллиарда минус два, перекрывая автоинкремент.
Это очень хороший вопрос, @Dai. Мы отслеживаем изменения цен на нашем рынке с течением времени, и есть много продуктов с большим количеством изменений цен :) Правда, автоинкремент рос так быстро из-за неудачных вставок (которые мы изучаем), но мы бы врезались в эту стену в конце концов
Нет, если вам нужно изменить тип данных первичного ключа, вы должны выполнить реструктуризацию таблицы. Это не может быть сделано как изменение на месте.
Вы можете использовать онлайн-инструмент DDL, такой как pt-online-schema-change или gh-ost, чтобы выполнить преобразование, продолжая запрашивать таблицу. Хотя вы, очевидно, не можете вставлять новые строки в таблицу, пока не обновите первичный ключ.
Не забудьте сначала преобразовать столбцы внешнего ключа в любых других таблицах, которые ссылаются на эту. Вы не хотите разрешать вставку новых строк в ссылочную таблицу до тех пор, пока внешние ключи также не смогут содержать значения.
Понятно. Спасибо, Билл, это был краткий и очень полезный ответ. Я оценил рекомендации по инструменту и особенно оценил ваш комментарий о внешних ключах (отличное напоминание). Отметить это как закрытое
... как вы превысили 2 миллиарда строк?