@adiletmurzaliev

Как обновляют структуру БД и данные на продакшене?

Объясните, пожалуйста как обычно обновляют данные на продакшене, где подразумевается еще и изменение самой структуры БД.
Пример: скажем есть таблица с пользователями, где всего 2 поля id и fio. Соответственно в поле ФИО вбивают данные в типе "Имя Фамилия Отчество". И тут возникла необходимость изменить структуру этой таблицы, разбив поле fio на 3 поля surname, firstname, middlename. Но на продакшене уже есть 1000+ записей в этой таблице.
Если сделать изменения на локалке, и запустить миграцию на продакшене, данные удалятся. Как я понимаю перед этим как-то данные с пользователями куда-то сохраняют и потом заливают. Как это осуществляется? И где нужно производить такие изменения с данными, на локалке или на продакшене?
  • Вопрос задан
  • 1627 просмотров
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Поскольку вопрос о трансформации имеющихся данных - то индивидуально для каждой задачи.

Начать необходимо вот отсюда: https://habrahabr.ru/post/146901/
И, собственно, придти к выводу, что лучше оставить как есть в одном поле. Если в каких-то местах нужны другие формы обращений - прописать их явно, а не конструируя по имеющимся заблуждениям о фио.

А так:
0) делается дополнительный бекап
1) выкатывается alter table добавляющий новый поля
2) выкатывается приложение, умеющее писать синхронно старую и новую структуру, но читающее только старую
3) отдельным процессом в цикле небольшими частями преобразуются данные - это если подлежит автоматической обработке
4) выкатывается приложение использующее только новую структуру
5) архивируется и удаляется исходная структура

Для всего-то тысячи записей может проще будет залочить табличку на несколько секунд.

Если тривиальной автоматике обработка не подлежит, то часто вместо 3 пункта делают выгрузку primary key, source_data, как-нибудь изменяют и готовят csv primary key, source_data, new_data, копируют в temporary table, затем делают слияние мультитабличным update этих двух таблиц с recheck'ом по source_data. Затем выгружают данные для которых не было обновления, разбираются, ещё раз обновляют и т.д. до заполнения всего.
Ответ написан
и запустить миграцию на продакшене, данные удалятся.

Это какая-то плохая миграция, если данные удалятся. Ну точнее это не миграция а непонятно что.
https://book.cakephp.org/3.0/en/phinx/migrations.h...
Случай который у вас реализуется так (это если можно остановить работу приложения на время миграции, если нельзя то будет сложнее конечно):
1) создали новые колонки;
2) залили insert-ом с select-ом с разбиением на ходу;
3) удалили исходную колонку.
Пример как раз такого разбиения которое вам нужно https://github.com/LandRushGIS/Cadastre.Russia/blo...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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