Синхронизировать две схемы баз данных в MySQL

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

В основном он должен сканировать базы данных 1 и 2. Проверьте разницу в схемах (таблицы и индексы) и предложите кучу операторов SQL для запуска на одном, чтобы он получил аналогичную структуру другого, сводя к минимуму повреждение данных в максимально возможной степени.

Если кто-то может указать пакет PHP, Python или Ruby, в котором реализован этот тип решения, я могу попытаться скопировать код оттуда.

Многие инструменты с графическим пользовательским интерфейсом MySQL, вероятно, могут это сделать, но я ищу решение, основанное на сценариях.

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

Больше информации:

Почему не работает репликация.

  1. Установочные базы разбросаны по всему штату.
  2. Мы хотим, чтобы установщик выполнял динамические исправления в БД на основе изменений, внесенных в последнюю версию, независимо от того, какую старую версию может использовать конечный пользователь.
  3. Изменения в основном похожи на добавление нового столбца в таблицы, создание новых индексов или удаление индексов, добавление таблиц или удаление таблиц, используемых системой внутри (мы не удаляем таблицы пользовательских данных).

Если это графический интерфейс: нет, его нельзя использовать. Мы не хотим связывать приложение размером 20 МБ с нашим установщиком только для различий в БД. Особенно когда размер оригинального установщика меньше 1 Мб.

+1 Отличный вопрос. Я собирался спросить об этом, потому что ищу такое же решение ... но нашел это.

Talvi Watia 17.09.2010 08:31
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
15
1
8 388
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Вы рассматривали возможность использования Репликация MySQL?

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

Nathan 04.02.2009 03:04

Репликацию намного проще настроить (если у вас есть права), чем написать то, что было бы инструментом сравнения SQL.

Willem 04.02.2009 03:20

Похоже, что для этого также требуется дублирование данных, согласно ...because data is replicated to the slave.... Также предоставленный пример PHP требует функции DROP DATABASE, что выходит за рамки вопроса.

Talvi Watia 17.09.2010 08:30

Для долгосрочного профессионального решения вам следует следить за Schemamatic (http://versabanq.com/products/schemamatic.php). Эта ссылка показывает приложение с графическим интерфейсом пользователя, но все, что оно делает, - это управление программным обеспечением командной строки. На этой странице есть ссылка на его сайт кода Google, где можно найти C# .Net версию Schemamatic. Идеальным решением было бы добавить поддержку MySQL в Schemamatic. Для SQL Server он идеален и делает именно то, что вы упомянули.

Теперь, в качестве краткосрочного решения, я бы предложил выгрузить нужные данные с помощью инструментов командной строки MySQL, таких как: mysqldump -A -c -uroot -ppassword> bkpmysql.sql

И поиграйте с этим, хотя для достижения того, чего вы хотите, потребуется некоторое время. Schemamatic действительно кажется мне вашим лучшим выбором. Дайте мне знать, если вам понадобятся какие-либо разъяснения, когда / если вы пробуете Schemamatic.

Возможно, вы захотите взглянуть на некоторые инструменты, такие как dbdeploy (это версия java или .net) и жидкая база и другие.

Хотя я думаю, что большинство из них будет применять наборы изменений к БД контролируемым образом. Не знаю, могут ли они реконструировать существующие схемы и сравнить.

Э.

SQLyog делает это, и это здорово. Мы часто используем его в производстве.

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

Talvi Watia 17.09.2010 08:32

@Talvi Watia, они предоставляют прокси PHP для таких случаев.

Egor Pavlikhin 20.09.2010 03:36

Я знаю, что это старый вопрос, но это был первый результат в Google того, что я искал (то же самое, что и исходный вопрос)

Я все еще нашел ответ здесь, но не помню URL это сценарий, который начался с:

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql

и закончилось так

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

проверьте, что это генератор сценария сравнения базы данных codeigniter

https://github.com/vaimeo/ci-database-diff-generator

это очень хорошее решение. Пришлось немного подстроить под свой фреймворк, но хорошо.

Jerfeson Guerreiro 16.11.2020 06:08

Спасибо за вашу признательность.

Vaimeo 25.02.2021 11:37

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