Как добавить поле в высоконагруженную базу в таблицу на продакшене где 100 миллионов записей?

Как можно добавить поле в высоконагруженную базу в таблицу на продакшене где 100 миллионов записей в разные базы данных без ее отказа?
  • Вопрос задан
  • 1415 просмотров
Решения вопроса 3
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
Могу ответить про mysql.

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

в принципе, процессы автоматизированы. например, плагин pt-online-schema-change.

но правильный ответ - регламент. тех работы не в прайм-тайм.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Могу ответить про postgresql.

без ее блокировки

Именно в такой постановке вопроса - никак.

С короткой блокировкой (доли секунд) - другое дело. Принципиально зависит от конкретного alter table и версии базы
Простой alter table foo add column col; - ставите statement_timeout to '100ms' и вносите как есть.
alter table foo add column col default const - после pg11 см. выше, до - интересное приключение
Если default не константа - сначала внесите как default null, затем обновляете частями. как в процессе до pg11.
Ответ написан
2ord
@2ord
продвинутый чайник
В MySQL 8+ добавили ALGORITHM=INSTANT к синтаксису:
ALTER TABLE table_name [alter_specification], ALGORITHM=INSTANT;

The benefit of the INSTANT algorithm is that only metadata changes are made in the data dictionary. There is no need to acquire metadata lock during SE changes and we don’t touch the data of the table.

https://mysqlserverteam.com/mysql-8-0-innodb-now-s...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vitalaw
@vitalaw
PHP-разработчик
Как вариант для MySQL можно заюзать утилиту от гитхаб https://github.com/github/gh-ost
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы