Обновление баз данных в mysql, как правильно?

Есть база данных с 50-ю таблицами и данными. Есть ее новая версия, без данных… В новой версии базы добавлены автоинкременты, индексы и т.д. Как правильно сделать так, что бы на выходе получить базу данных с данными и новой структурой?
  • Вопрос задан
  • 9643 просмотра
Пригласить эксперта
Ответы на вопрос 7
vsespb
@vsespb
Нужно иметь «новую версию базы данных» ввиде последовательности SQL команд которые из старой версии делают новую (миграции): добавляют, удаляют поля, индексы, меняют типы полей, конвертируют данные итд.

В некоторых фреймвоках есть поддержка таких миграций из коробки, например guides.rubyonrails.org/migrations.html
Ответ написан
@Vampiro
Выгружаете из старой версии данные, выгружаете из новой структуру. Переименовываете старую для бекапа. Из структуры создаете бд, накатываете в нее данные. Малой кровью у вас вылетит часть данных, структура которых не совпала по каким-то причинам. Эти таблицы (а вы увидите их список по нулевому количеству строк) заполните ручками как «инсерт селект из бекапа» с перечислением конкретных полей.

Это лобовое разовое решение, если вы не заготовили миграционных данных. =/ Еще можно по каждой таблице искать различия и альтеры строчить =)
Ответ написан
@AlexeyVD
Возможность получить миграцию есть, напирмер, в dbForge.
Разворачиваете у себя новую структуру базы, затем через меню «Сравнение -> Новое сравнение схем...» сравниваете ее со старой и получаете все имеющиеся различия в структурах. Выделяете элементы, которые нужно обновить, кликаете правой кнопкой по ним и выбираете «Показать скрипт обновления схемы». В итоге получите все необходимые ALTER'ы и CREATE'ы. Но всё равно будьте аккуратнее, возможно что-то и придется обновлять в ручную.
Ответ написан
@max_rip
Если поля не переименовывались, то просто выгрузите данные с расширенной вставкой, там где перед ставкой перечисляются поля. И после накатите на БД с новой структурой. Должно в принципе прокатить +). Разве что потом, проверить значение следующего инкремента в таблице.
Ответ написан
Комментировать
Wott
@Wott
вообще-то есть два способа
1. сделать DDL sql, который из схему первоначальной базы сделает нужную. Обычно это делается сразу и все модификации атомарны в виде скриптов DDL. Автоматом можно поискать тулзы которые делают миграцию структуры или сравнивают базы. Самый тупой способ — сделать экспорт структуры со старой базы ( без данных ) и тупо по тексту diff из которого сделать уже нужный скрипт для изменения DDL

2. Взять даные из старой и перенести в новую. То есть экспортируем данные из старой и заливаем в новую.

В обоих случая структуру можно поменять так что будут проблемы, обычно уникальные или внешние индексы не встают ( данные не заливаются ). Тут есть два пути — отключить все проверки и триггеры и сделать insert ignore, а потом сравнивать и искать что не залилось и почему, потом включать и проверять консистентность. Либо заливать как есть и смотреть почему вылетело. Со скриптами DDL вариант только второй.

Я в такой же ситуации обычно делают экспорт/импорт данных, потому что перестраиваются индексы, дополнительная проверка и вообще старую базу в качестве бекапа использую, хотя скрипты DDL есть всегда ( они синхронизируют базы на локальном и внешнем дев-серверах ).
Если есть проблемы, то приходиться писать редактирование данных в слитом дампе или отключать фичи в новом, менять данные и включать их обратно.
Ответ написан
Комментировать
ajaxtelamonid
@ajaxtelamonid
Laravel
Попробуйте скрипт на www.mysqldiff.org
Но скорее всего придется поработать руками.
Ответ написан
Комментировать
Воспользуйтесь этим
https://github.com/IvanShabanov/MySQL-structure-updater
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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