Сравните две базы данных MySQL [закрыто]


368

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

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

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

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

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


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


4
Я считаю, что инструменты RedGate предназначены только для SQL Server.
Дейв Р.

4
Red Gate теперь также имеет версию MySQL, в настоящее время бесплатную, так как она имеет расширенный ранний доступ: red-gate.com/products/MySQL_Compare/index.htm
Дэвид Аткинсон,

2
Это настоящая проблема. Я развернул от dev до рабочей машины, и она ВСЕГДА что-то ломает. Спасибо за этот информативный пост
герр

1
Инструмент MySQL от Redgate теперь стоит $ 70 / пользователь. Даже по такой цене я буду оценивать и оставлять комментарии здесь.
Джереми МакГи

Также нужно было это только сейчас, пришлось увеличивать размер поля. Не хотел просто увеличивать его и подозревать, что все в порядке. @Jared предложил именно то, что я использовал.
ТАСС

Ответы:


210

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

Пропуская комментарии, вы избегаете бессмысленных различий, таких как время выполнения команды mysqldump. Используя --skip-extended-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
Двойной плюс голосов за грамотность командной строки !!!
dogenpunk

5
Чтобы сравнить данные , используйте это вместо этого; еще будут некоторые комментарии MySQL4 + о наборах символов и т. д.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok

41
-d, --no-dataможет представлять интерес для тех, кто нуждается в производственном использовании, но заботится только о схеме
Луи

7
Лучшим инструментом для использования была бы утилита mysqldbcompare, разработанная самими MySQL, которую вы можете использовать в Windows, Linux или Mac - она ​​также может выводить операторы SQL как для изменений данных, так и для схемы, и выполняет гораздо больше тестов, чем простая команда diff, из-за которой diff определить.
Джасдип Халса

4
Для vimdiff
отличного

99

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


2
Все упомянутые инструменты выглядят хорошо. Пока я выбираю Жабу произвольно, пока не смогу провести еще какое-то исследование.
Винсент Рамдани

64
Я был в восторге от этого инструмента, пока не понял, что он работает в Windows, а не в Linux. Вернуться к поиску ...
jdias

2
Работал фантастически для меня. Сделал все, что мне было нужно, и выделенные ячейки для измененных записей позволили легко увидеть, что изменилось.
Темза

4
mysqldbcompare с --run-all-tests --difftype sql --disable-binary-loggingопциями может выполнять практически ту же работу (за исключением того, что вывод смешивается с комментарием, а специальные символы в строке не экранируются).
schemacs

4
@Anson Smith Можете ли вы сказать мне альтернативу для Linux?
Висрут

20

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

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

Это стоит денег, это только Windows и Mac, и у него есть дурацкий интерфейс, но мне это нравится.


Это работает на Linux. У меня он открыт на другом рабочем столе в данный момент. Функция синхронизации структуры для передачи изменений схемы из dev-> test-> live стоит только платы за лицензию.
полковник Спонс

2
Хороший улов, я даже не знал, что у этого были те особенности. На данный момент это лучшая вещь на Mac.
Хендра Узия

Кажется, что сравниваются только базы данных, которые живут на серверах, а не нативные файлы sql
AlxVallejo

@seanyboy, почему тебе нравится дурацкий интерфейс?
Pacerier

17

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

введите описание изображения здесь


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

чрезмерно дорогой и тяжелый, не
годный для

1
Очень медленный, и по какой-то причине он сбрасывает и воссоздает много внешних ключей, даже когда он не нужен. Нет способа следить за прогрессом.
Артем Гуцул

13

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


7
Работает отлично! И это бесплатно, спасибо. Для тех, кто не смог его найти (как я). Это здесь: База данных -> Обратный инженер -> В модели MySQL или EER Diagram -> База данных -> Синхронизация с любым источником
bentzy

Это работает хорошо. Однако вы можете сравнивать только базы данных с одинаковыми именами. У меня есть несколько (многопользовательских клиентов) баз данных, которые я хочу синхронизировать с «главной» версией на одном хосте. Поэтому я должен переименовать мастер, чтобы соответствовать каждому клиенту БД перед синхронизацией. В противном случае приятно!
scipilot

Дополнительную информацию об этом можно найти по этой ссылке
Steven Ryssaert

13

Конечно, есть много способов, но в моем случае я предпочитаю команды dump и diff. Итак, вот сценарий, основанный на комментарии Джареда:

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

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



11

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

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

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

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

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


Не забудьте предоставить и то --hostNи другое, --userNиначе оно молча провалится.
Знаркус

У меня были проблемы с инструментами Oracle mysqldbcompare, которые генерировали ошибки в индексах и изменяли поля, которые были эквивалентны. Инструмент mysqldiff работал безупречно и сэкономил немало времени.
Роберт К,


6

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


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


3

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


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

2
Я не нашел инструментов сравнения схем в Maatkit.
Степанчег

Я тоже - где в инструментах мы можем найти это?
Шаббироб

Я не думаю, что там есть сравнение схем. Я имел в виду сравнение и синхронизацию данных с использованием mk-table-checkum и mk-table-sync
Джарод Эллиотт

он находится в процессе code.google.com/p/maatkit/wiki/mk_schema_sync
droope

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
Дэвид Аткинсон

Недоступно для OSX
AlxVallejo

3

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

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


3

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

Сравнение данных dbForge для MySQL


3

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

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


2
Разработка этого инструмента остановлена ​​и теперь включена в Percona
mrmuggles

2

Библиотека компонентов Apache Zeta - это универсальная библиотека слабосвязанных компонентов для разработки приложений на основе PHP 5.

Компоненты eZ - DatabaseSchema позволяет:

   .Создать / сохранить определение схемы базы данных;
   .Сравнить схемы базы данных;
   . Генерация запросов синхронизации;

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


2

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

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

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

Недостатки:

  • не синхронизирует длину крошечным целым
  • неправильно синхронизирует имена индексов
  • не синхронизирует комментарии

Правда, они сделали поверхностное обновление с несколькими небольшими изменениями за 5 лет. Но он активно не развивается.
Артем Гуцул

1

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


0

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


MySQL имеет аналогичную команду mysql_dump. Это могло бы быть решением, если бы я мог интегрировать его в процесс развертывания. Спасибо.
Винсент Рамдани

Кроме того, для более удобного использования вы можете получить то же самое, используя phpMyAdmin - настоящий убийца для пользователей MySQL!
schonarth

Идентичные схемы могут легко привести к различным дампам схем. Различные версии клиента mysql могут создавать несколько разные дампы (проблема, если вы сравниваете схемы с двух разных машин), а такие вещи, как внешние ключи и ограничения, могут быть выгружены в другом порядке.
Марк Э. Хаазе

0

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

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

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


это обещание? Я попробовал это, и он упал с довольно несколькими ошибками, не в последнюю очередь, что при переносе функции он пытается использовать того же владельца, что и исходная база данных
Cruachan

Да, это обещание. Для большинства людей инструмент работает просто отлично. Мы обещаем пожизненную лицензию на любую найденную ошибку и не можем ее исправить в течение 5 рабочих дней. Пожалуйста, свяжитесь с нашей службой поддержки.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.