Сравните две базы данных MySQL

368

В настоящее время я разрабатываю приложение с использованием базы данных MySQL.

Структура базы данных все еще находится в движении и изменяется во время развития (я меняю локальную копию, оставляя ее на тестовом сервере).

Есть ли способ сравнить два экземпляра базы данных, чтобы увидеть, были ли какие-либо изменения?

В то время как в настоящее время просто отбрасывается предыдущая база данных тестового сервера, это нормально, так как тестирование начинает вводить тестовые данные, это может немного запутаться. То же самое, тем более, что это произойдет снова позже в производстве...

Есть ли простой способ постепенного внесения изменений в производственную базу данных, желательно путем автоматического создания script для его изменения?


Инструменты, упомянутые в ответах:

  • 4
    Я считаю, что инструменты RedGate предназначены только для SQL Server.
  • 4
    Red Gate теперь также имеет версию MySQL, в настоящее время бесплатную, так как она имеет расширенный ранний доступ: red-gate.com/products/MySQL_Compare/index.htm
Показать ещё 7 комментариев
Теги:
database
diff

21 ответ

220
Лучший ответ

Если вы работаете с небольшими базами данных, я обнаружил, что запустил mysqldump в обеих базах данных с параметрами --skip-comments и --skip-extended-insert для генерации SQL-скриптов, а работа с diff на скриптах SQL работает очень хорошо.

Пропуская комментарии, вы избегаете бессмысленных различий, таких как время запуска команды mysqldump. С помощью команды --skip-extended-insert вы гарантируете, что каждая строка будет вставлена ​​с помощью собственного оператора insert. Это устраняет ситуацию, когда одна новая или модифицированная запись может вызвать цепную реакцию во всех будущих вставках. Запуск с этими параметрами дает большие дампы без комментариев, поэтому это, вероятно, не то, что вы хотите делать в производстве, но для разработки это должно быть хорошо. Я привел примеры команд, которые я использую ниже:

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
  • 12
    Двойной плюс голосов за грамотность командной строки !!!
  • 1
    командная строка Теперь я могу использовать это в любом сценарии :)
Показать ещё 11 комментариев
99

Жаба для MySQL имеет функции сравнения данных и схемы, и я считаю, что даже создаст синхронизацию script. Лучше всего, это бесплатная программа.

  • 2
    Все упомянутые инструменты выглядят хорошо. Пока что я выбираю Жабу произвольно, пока не смогу провести еще какое-то исследование.
  • 0
    MySQL Workbench просто предоставляет отчет об изменениях, не генерирует скрипт обновления (или я не нашел, как это сделать), если вы сравниваете два скрипта. Затем он попросит вас обновить базу данных. В моем случае меня интересует только скрипт обновления.
Показать ещё 12 комментариев
19

Я использую часть программного обеспечения под названием Navicat для:

  • Синхронизировать базы данных Live с моими тестовыми базами данных.
  • Показать различия между двумя базами данных.

Это стоит денег, это только окна и макинтош, и у него получился странный интерфейс, но мне он нравится.

  • 0
    Это работает на Linux. У меня он открыт на другом рабочем столе в данный момент. Функция синхронизации структуры, позволяющая выдвигать изменения схемы из dev-> test-> live, стоит только платы за лицензию.
  • 2
    Хороший улов, я даже не знал, что у него были эти особенности. Это лучшая вещь на Mac до сих пор.
Показать ещё 3 комментария
17

Существует инструмент синхронизации схемы в SQLyog (коммерческий), который генерирует SQL для синхронизации двух баз данных.

Изображение 836

  • 1
    да, это лучшее решение для меня на данный момент, обеспечивает прекрасные запросы синхронизации SQL, так что вы можете обновить его в любое время и в любом месте ..
  • 0
    чрезмерно дорогой и тяжелый, не подходит для исправлений
Показать ещё 1 комментарий
13

Существует много способов, но в моем случае я предпочитаю команду дампа и diff. Итак, вот script на основе комментария Jared:

#!/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

Обратная связь приветствуется:)

13

Из списка сравнения функций... MySQL Workbench предлагает Schema Diff и Schema Synchronization в своей версии сообщества.

  • 7
    Работает отлично! И это бесплатно, спасибо. Для тех, кто не смог его найти (как я). Это здесь: База данных -> Обратный инженер -> В модели MySQL или EER Diagram -> База данных -> Синхронизация с любым источником
  • 0
    Это работает хорошо. Однако вы можете сравнивать только базы данных с одинаковыми именами. У меня есть несколько (многопользовательских клиентов) баз данных, которые я хочу синхронизировать с «главной» версией на одном хосте. Поэтому я должен переименовать мастер, чтобы соответствовать каждому клиенту БД перед синхронизацией. В противном случае приятно!
Показать ещё 1 комментарий
12

dbSolo, он оплачивается, но эта функция может быть той, которую вы ищете http://www.dbsolo.com/help/compare.html

Он работает с Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 и MySQL Изображение 837

  • 0
    это было именно то, что я искал! Потрясающие!
11

Если вам нужно сравнить схемы (а не данные) и иметь доступ к Perl, mysqldiff может работать. Я использовал его, потому что он позволяет сравнивать локальные базы данных с удаленными базами данных (через SSH), поэтому вам не нужно беспокоиться о сбросе данных.

http://adamspiers.org/computing/mysqldiff/

Он попытается сгенерировать SQL-запросы для синхронизации двух баз данных, но я не доверяю им (или любому инструменту, фактически). Насколько мне известно, нет 100% надежного способа обратной инженерии изменений, необходимых для преобразования одной схемы базы данных в другую, особенно когда было сделано несколько изменений.

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

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

  • 0
    Не забудьте --hostN оба параметра --hostN и --userN иначе это произойдет автоматически.
  • 0
    У меня были проблемы с инструментами Oracle mysqldbcompare, которые генерировали ошибки в индексах и изменяли поля, которые были эквивалентны. Инструмент mysqldiff работал безупречно и сэкономил немало времени.
7

Посмотрите http://www.liquibase.org/

  • 0
    +1 Именно то, что я искал.
6

check: http://schemasync.org/ инструмент schemasync работает для меня, это инструмент командной строки легко работает в командной строке linux

  • 1
    Если у вас возникли проблемы с установкой этого на Mac, я смог это сделать, только установив mysql и python с помощью homebrew, но без macports.
4

Существует еще один инструмент командной строки mysql-diff с открытым исходным кодом:

http://bitbucket.org/stepancheg/mysql-diff/

  • 0
    Этот проект больше не находится в разработке.
3

После нескольких часов поиска в Интернете для простого инструмента я понял, что не смотрел в Ubuntu Software Center. Вот бесплатное решение, которое я нашел: http://torasql.com/ Они утверждают, что имеют версию для Windows, но я использую ее только под Ubuntu.

Изменить: 2015-фев-05 Если вам нужен инструмент Windows, TOAD идеально и бесплатно: http://software.dell.com/products/toad-for-mysql/

3

Взгляните на dbForge Data Compare for MySQL. Это условно-бесплатное ПО с 30-дневным периодом бесплатной пробной версии. Это быстрый инструмент для графического интерфейса MySQL для сравнения и синхронизации данных, управления различиями в данных и настраиваемой синхронизации.

Изображение 838

3

Сравнение SQL по RedGate http://www.red-gate.com/products/SQL_Compare/index.htm

DBDeploy для автоматического управления изменениями базы данных http://dbdeploy.com/

  • 1
    Инструменты Red Gate, похоже, не поддерживают ничего, кроме SQL Server.
  • 2
    Red Gate также имеет версию MySQL, бесплатную при раннем доступе: red-gate.com/products/MySQL_Compare/index.htm
Показать ещё 1 комментарий
3

Существует полезный инструмент, написанный с использованием perl, называемый Maatkit. Помимо всего прочего, у него есть несколько инструментов сравнения баз данных и синхронизации.

  • 0
    Я не знал об этом проекте! Спасибо, похоже, у него довольно много инструментов, которые были бы чрезвычайно полезны.
  • 2
    Я не нашел инструментов сравнения схем в Maatkit.
Показать ещё 3 комментария
3

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

Простой поиск Google включил следующие инструменты:

2

Очень простой в использовании инструмент сравнения и синхронизации:
 Сравнение баз данных  http://www.clevercomponents.com/products/dbcomparer/index.asp

Преимущества:

  • быстро
  • простой в использовании
  • легко выбрать изменения для применения

Недостатки:

  • не синхронизирует длину с крошечными ints
  • неправильно синхронизирует имена индексов
  • не синхронизирует комментарии
  • 0
    Правда, они сделали поверхностное обновление с несколькими небольшими изменениями за 5 лет. Но он активно не развивается.
2

Библиотека компонентов apache zeta - это библиотека общего назначения слабо связанных компонентов для разработки приложений на основе PHP 5.

eZ Components - DatabaseSchema позволяет:

   .Create/Save a database schema definition;
   .Compare database schemas;
   .Generate synchronization queries;

Вы можете проверить учебник здесь: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

1

Я думаю, что Navicat for MySQL будет полезен для этого случая. Он поддерживает синхронизацию данных и структуры для MySQL. Изображение 839

0

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

Мы изначально решили создать наш инструмент с нуля, потому что, хотя на рынке есть и другие подобные продукты, ни один из них не делает работу правильно. Его довольно просто показать вам различия между базами данных. Совсем другое, чтобы создать одну базу данных, как и другую. Плавная миграция, как схемы, так и данных, всегда была проблемой. Ну, мы это достигли здесь.  Мы уверены в том, что он может обеспечить вам плавную миграцию, чем если бы это не произошло - если сценарии миграции, которые он создает, недостаточно читабельны или не будут работать для вас, и мы не можем исправить это за пять рабочих дней - вы получите свой собственный бесплатный копия!

http://www.nobhillsoft.com/NHDBCompare.aspx

  • 0
    это обещание? Я попробовал это, и он упал с довольно несколькими ошибками, не в последнюю очередь, что при переносе функции он пытается использовать того же владельца, что и исходная база данных
  • 0
    Да, это обещание. Для большинства людей инструмент работает просто отлично. Мы обещаем пожизненную лицензию на любую найденную ошибку и не можем ее исправить в течение 5 рабочих дней. Пожалуйста, свяжитесь с нашей службой поддержки.
0

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

  • 0
    MySQL имеет аналогичную команду mysql_dump. Это могло бы быть решением, если бы я мог интегрировать его в процесс развертывания. Благодарю.
  • 0
    Кроме того, для более удобного пользования вы можете получить то же самое, используя phpMyAdmin - настоящий убийца для пользователей MySQL!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню