Подтвердить что ты не робот

Синхронизация двух баз данных в MySQL

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

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

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

Многие инструменты GUI MySQL, вероятно, могут это сделать, но я ищу решение для сценариев.

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

Дополнительная информация:

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

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

Если это GUI: Нет, он не может быть использован. Мы не хотим связывать приложение с 20 МБ с нашим установщиком только для DB diff. Специально, когда исходный установщик меньше 1 МБ.

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Е.

Ответ 5

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

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

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:[email protected]] [user2:[email protected]] [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