Как обнаружить изменения таблиц и хранимых процедур между двумя базами данных?

У меня есть две базы данных, одна для моей системы разработки, а другая - для продуктивной системы.

Можно ли обнаружить структурные изменения между обеими системами? (нет данных, только структурные изменения должны быть обнаружены)

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

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

mysqldump --skip-comments --no-data --routines --host=sql.test.de --user=root --password=123 bim_stage > /home/deploybackups/stagestructure.sql 
mysqldump --skip-comments --no-data --routines --host=sql.test.de --user=root --password=123 bim_dev > /home/deploybackups/devstructure.sql

diff /home/deploybackups/stagestructure.sql /home/deploybackups/devstructure.sql > /home/deploybackups/diffstructure.sql

3 ответа

Решение

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

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

  • Visual Studio имеет одну точку зрения на это, создавая проект базы данных, который сохраняет все изменения в журнале версий. не совсем уверен в специфике. Проще говоря, вы нажимаете Sync и тада! Это работает, но очень полно и медленно, если вы спросите меня.

Самый простой метод обработки этого IMO - это внести все структурные изменения в журнал версий / таблицу; так сказать.

Допустим, вашей базовой базе данных нужна новая таблица. Вы бы зашли в ваш редактор и добавили его (используя графический интерфейс или код), нажмите "Сохранить", и все готово.

Вместо этого нажмите Извлечь SQL; не нажимайте сохранить.

Что я предлагаю сейчас, так это:

Вы создаете небольшой внутренний веб-интерфейс с большим полем ввода и кнопкой отправки. Нажатие на кнопку отправки выполнит любой SQL из поля ввода для вашей локальной базы данных разработки и вернет вам результат.

Если БД возвращает успех, строка SQL добавляется в ваш changeLogSQLVersionThingyTable как минимум с тремя столбцами:

1) автоинкрементная версия (целое число) 2) sql (текст) 3) метка времени (timedate) 4) идентификатор разработчика??

Если у вас есть изменения в вашей БД, такие как добавление таблицы ранее, используйте этот инструмент.

Теперь у вас есть все ваши изменения в вашей базе данных в хорошем списке версий. Чтобы обновить базу данных, все, что вам нужно сделать, это выполнить каждую строку в changeLogSQLVersionThingyTable, начиная с той версии, в которую эта конкретная база данных была обновлена ​​в последний раз.

С некоторыми усилиями вы также можете восстановить свою базу данных на более раннем этапе; просто создайте новую базу данных и запустите все строки до желаемой точки версии.

Вы можете использовать инструменты MySQL GUI, такие как SQLyog, чтобы сделать это легко. Мастер синхронизации схемы SQlyog способен делать то, что вам нужно, то есть проверять изменения в структуре и синхронизировать их. Смотрите скриншот прилагается.

Схема синхронизации SQLyog

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

Тем не менее, если у вас есть "нормальная" база данных, и эти изменения происходят "редко", я бы использовал метод diff, чтобы определить, что изменение было внесено. Создание сценария SQL для внесения изменений не составит труда. Хотя я все еще преследую человека, который внес изменения.

Обратите внимание, что у diff есть опции, позволяющие игнорировать изменения пробелов и пустых строк.

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

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