Я искал переносимый скрипт или программу командной строки, которая может синхронизировать две схемы баз данных MySQL. Я не ищу решение на основе графического интерфейса, потому что его нельзя автоматизировать или запустить с помощью инструмента сборки / развертывания.
В основном он должен сканировать базы данных 1 и 2. Проверьте разницу в схемах (таблицы и индексы) и предложите кучу операторов SQL для запуска на одном, чтобы он получил аналогичную структуру другого, сводя к минимуму повреждение данных в максимально возможной степени.
Если кто-то может указать пакет PHP, Python или Ruby, в котором реализован этот тип решения, я могу попытаться скопировать код оттуда.
Многие инструменты с графическим пользовательским интерфейсом MySQL, вероятно, могут это сделать, но я ищу решение, основанное на сценариях.
Обновлено: извините за непонятность: я ищу синхронизацию в структуре таблицы, сохраняя при этом данные в неизменном виде, насколько это возможно. Не репликация данных.
Больше информации:
Почему не работает репликация.
Если это графический интерфейс: нет, его нельзя использовать. Мы не хотим связывать приложение размером 20 МБ с нашим установщиком только для различий в БД. Особенно когда размер оригинального установщика меньше 1 Мб.






Вы рассматривали возможность использования Репликация MySQL?
Я подозреваю, что OP ищет что-то максимально простое, чтобы просто воспроизвести схему. Я предполагаю, что репликация MySql могла бы это сделать, но ее не совсем просто настроить.
Репликацию намного проще настроить (если у вас есть права), чем написать то, что было бы инструментом сравнения SQL.
Похоже, что для этого также требуется дублирование данных, согласно ...because data is replicated to the slave.... Также предоставленный пример PHP требует функции DROP DATABASE, что выходит за рамки вопроса.
Для долгосрочного профессионального решения вам следует следить за 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, они предоставляют прокси PHP для таких случаев.
Я знаю, что это старый вопрос, но это был первый результат в 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
это очень хорошее решение. Пришлось немного подстроить под свой фреймворк, но хорошо.
Спасибо за вашу признательность.
+1 Отличный вопрос. Я собирался спросить об этом, потому что ищу такое же решение ... но нашел это.