nnnLik
@nnnLik
Capybara god

Как провести миграцию для PK с int на BigInt в MySql 5.7?

У меня есть таблица, в которой PK уже достиг 75% максимального значения типа int. Какие есть способы миграции на BigInt без блокировки таблицы и какие из них на ваш взгляд эффективнее?

Вот, что я нашел на данный момент:

* MySQL поддерживает онлайн миграции для первичных ключей (https://dev.mysql.com/doc/refman/5.7/en/innodb-onl...) но с какими-то ограничениями
* Утилиты для онлайн миграций: gh-ost и pt-online-schema-change
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Можно попробовать почистить таблицу от исторических записей PK и появится свободное место снизу.
Допустим от ID=0 до 1 млрд. И потом потихоньку начать переиспользовать ключи снизу.
Но я не уверен что это работает для авто-инкрементных ключей особенно если уже много логики было
создано. В оракле проще. Есть отдельный объект SEQUENCE и его можно очень быстро пересоздать
или сделать циклическим. Тоесть от 4 млрд он пойдет снова с нуля.

Второй вариант - я-бы сделал копию ID INT с типом ID_BIG BIGINT. Это очень короткая блокировка. Надеюсь быстро.
Потом в фоновом режиме (транзакционном) пообновлял бы все до полного синхронизма. И потом
нужен регламент чтобы дропнуть ID и переделать все констрейнты быстро на ID_BIG.
Тут надо подготовить заране скрипты.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вариант 1:
1. Сделать полный бэкап базы.
2. Удалить все внешние ключи, ссылающиеся на изменяемое поле.
3. Изменить тип поля.
4. Изменить тип полей всех внешних ключей, ссылающихся на изменяемое поле.
5. Пересоздать все внешние ключи, ссылающиеся на изменяемое поле.

Вариант 2:
1. Сделать полный дамп базы.
2. Отредактировать дамп, изменив тип поля и всех внешних ключей, ссылающихся на него.
3. Восстановить базу из дампа.

В обоих вариантах надо останавливать работу с базой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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