MySQL. Можно ли увеличить максимальный размер столбца auto_increment без повторного создания таблицы?

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

... как вы превысили 2 миллиарда строк?

Dai 24.11.2022 06:39

@Дай, это не так сложно. Нам пришлось изменить столбец ID с INT на BIGINT несколько лет назад, когда он переполнился. На самом деле у нас нет 2 миллиардов строк одновременно, потому что мы периодически удаляем старые строки, но эти идентификаторы не используются повторно.

Barmar 24.11.2022 07:21

@Dai Я видел, как это происходит в дикой природе. Например, при сбое многих вставок значения автоинкремента теряются. Или если кто-то непреднамеренно вставил строку, указывающую значение, например, 2 миллиарда минус два, перекрывая автоинкремент.

Bill Karwin 24.11.2022 08:37

Это очень хороший вопрос, @Dai. Мы отслеживаем изменения цен на нашем рынке с течением времени, и есть много продуктов с большим количеством изменений цен :) Правда, автоинкремент рос так быстро из-за неудачных вставок (которые мы изучаем), но мы бы врезались в эту стену в конце концов

Kyle 24.11.2022 10:59
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, если вам нужно изменить тип данных первичного ключа, вы должны выполнить реструктуризацию таблицы. Это не может быть сделано как изменение на месте.

Вы можете использовать онлайн-инструмент DDL, такой как pt-online-schema-change или gh-ost, чтобы выполнить преобразование, продолжая запрашивать таблицу. Хотя вы, очевидно, не можете вставлять новые строки в таблицу, пока не обновите первичный ключ.

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

Понятно. Спасибо, Билл, это был краткий и очень полезный ответ. Я оценил рекомендации по инструменту и особенно оценил ваш комментарий о внешних ключах (отличное напоминание). Отметить это как закрытое

Kyle 24.11.2022 11:01

Другие вопросы по теме