Синхронизировать две схемы баз данных в MySQL - PullRequest
13 голосов
/ 19 января 2009

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

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

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

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

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

Подробнее:

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

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

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

Ответы [ 6 ]

5 голосов
/ 19 января 2009

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

4 голосов
/ 09 апреля 2010

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

1 голос
/ 16 января 2013

Я знаю, что это старый вопрос, но это был первый результат в 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
1 голос
/ 04 февраля 2009

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

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

Е.

1 голос
/ 04 февраля 2009

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

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

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

0 голосов
/ 20 ноября 2016

проверьте, что это генератор кода базы данных diffigniter enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...