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

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

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

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

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

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


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


person Vincent Ramdhanie    schedule 22.10.2008    source источник
comment
Я считаю, что инструменты RedGate предназначены только для SQL Server.   -  person Dave R.    schedule 23.12.2008
comment
Red Gate теперь также имеет версию MySQL, в настоящее время бесплатную, поскольку она находится в расширенном раннем доступе: red-gate.com/products/MySQL_Compare/index.htm   -  person David Atkinson    schedule 24.10.2010
comment
Это настоящая проблема. Я развертываю с разработчика на производственную машину, и это ВСЕГДА что-то ломает. Спасибо за информативный пост   -  person Herr    schedule 15.05.2011
comment
Стоимость инструмента MySQL от Redgate теперь составляет 70 долларов США за пользователя. Даже за эту цену я буду оценивать и оставлять комментарии здесь.   -  person Jeremy McGee    schedule 18.07.2011
comment
Тоже нужно было это только сейчас, пришлось увеличить размер поля. Не хотелось просто увеличивать и подозревать, что все в порядке. @ Джаред предложил именно то, что я использовал.   -  person Tass    schedule 21.01.2012
comment
Другой инструмент Windows: Database Workbench, работает в Linux через Wine и поддерживает другие системы баз данных. также. В этот инструмент включен инструмент сравнения схем, он платный, но и недорогой.   -  person Martijn Tonies    schedule 02.05.2014
comment
Мне нравится использовать SQL Architect. Есть хорошая функция сравнения. Здесь: sqlpower.ca/page/architect_download_os   -  person Nelson Teixeira    schedule 18.06.2014
comment
Отличной альтернативой для Windows, Linux или Mac является mysqldbcompare stackoverflow.com/a/26192873/1365289! Это заняло у меня ДОЛГОЕ время, и оно того стоило!   -  person Jasdeep Khalsa    schedule 04.10.2014
comment
Это не требует подключения к базе данных, предоставляет API и веб-интерфейс: blog.geneticcoder.com/2015/11/12/   -  person I wrestled a bear once.    schedule 12.11.2015


Ответы (21)


Если вы работаете с небольшими базами данных, я обнаружил, что 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
person Jared    schedule 03.01.2012
comment
Двойные плюсы за грамотность в командной строке !!! - person dogenpunk; 21.01.2012
comment
командная строка ftw! теперь я могу использовать это в любом скрипте :) - person hyprnick; 01.03.2012
comment
Вместо этого используйте для сравнения данных; по-прежнему будут некоторые комментарии MySQL4 + о наборах символов и т. д. mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql - person zanlok; 07.03.2012
comment
-d, --no-data могут быть интересны тем, кто нуждается в производственном использовании, но заботится только о схеме - person Louis; 10.05.2013
comment
Лучшим инструментом для использования является утилита mysqldbcompare. разработан самим MySQL, который вы можете использовать в Windows, Linux или Mac - он также может выводить операторы SQL как для данных, так и для изменений схемы и выполняет гораздо больше тестов, чем может определить простой diff командной строки. - person Jasdeep Khalsa; 04.10.2014
comment
@jasdeepkhalsa Ссылка не работает, не могли бы вы предоставить новую? - person PHPst; 17.02.2015
comment
--all-databases также полезен, если вы хотите сравнить всю схему сервера, а не конкретную базу данных. - person DOOManiac; 21.04.2015
comment
Для хорошего различия с цветами попробуйте vimdiff - person gitaarik; 20.05.2015
comment
@PHPst К сожалению, весь вопрос был удален для модерации, но я сейчас пишу свой собственный инструмент сравнения с открытым исходным кодом, поэтому опубликую подробности, как только они у меня появятся! - person Jasdeep Khalsa; 21.05.2015
comment
@PHPst Попробуйте github.com/DBDiff/DBDiff - person Jasdeep Khalsa; 19.06.2015
comment
@jasdeepkhalsa Спасибо, я попробую. - person PHPst; 19.06.2015
comment
Блестящий ответ! Но да, -d необходим для пропуска данных. - person Ashesh; 10.07.2015
comment
-iEwB может быть полезен, если вам не нужны пробелы, табуляции и регистр. - person Alex2php; 04.08.2015

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

person Anson Smith    schedule 22.10.2008
comment
Все упомянутые инструменты выглядят хорошо. Я выбираю Toad произвольно, пока не смогу провести дополнительное исследование. - person Vincent Ramdhanie; 22.10.2008
comment
MySQL Workbench просто предоставляет отчет об изменениях, не генерирует скрипт обновления (или я не нашел, как это сделать), если вы сравните два скрипта. Затем он попросит вас обновить базу данных. В моем случае меня интересует только скрипт обновления. - person javydreamercsw; 15.09.2010
comment
Жаба очень неудобная :( нельзя просто сравнивать два разных sql дампа - person pars; 06.01.2011
comment
Я был в восторге от этого инструмента, пока не понял, что он работает в Windows, а не в Linux. Вернуться к поиску ... - person jdias; 11.09.2011
comment
Для меня сработало фантастически. Сделал все, что мне нужно, и выделенные ячейки для измененных записей позволяют легко увидеть, что изменилось. - person thames; 02.01.2012
comment
@jdias et al - с момента появления ESXi ОС не является массовым препятствием (кто не может найти старую лицензию на 2000 или XP, которая поставлялась со старым ПК?) - person zanlok; 06.03.2012
comment
mysqldbcompare с параметрами --run-all-tests --difftype sql --disable-binary-logging может выполнять почти ту же работу (за исключением того, что вывод смешивается с комментарием, а специальные символы в строке не экранируются). - person schemacs; 27.10.2012
comment
Моя единственная жалоба на Toad заключается в том, что он не всегда разумно генерирует команды ALTER, вместо этого он переименовывает таблицу, создает новую таблицу (с новыми столбцами), а затем перемещает ваши данные из старой в новую. На это уходит гораздо больше времени, чем на простое изменение. - person clieu; 03.01.2013
comment
@Anson Smith Можете ли вы сказать мне альтернативу Linux? - person Visruth; 25.09.2013
comment
Этот инструмент предназначен только для Windows, что делает его бесполезным для меня. Я думаю, что ответ должен упомянуть об этом. - person hek2mgl; 17.02.2014
comment
Теперь это плагин eclipse, но он все же довольно глючный. еще лучше, чем окна. - person SkorpEN; 15.10.2014
comment
Сегодня Toad больше не является бесплатным ПО. Это бесплатный маршрут, и вы должны купить его, чтобы использовать все функции. - person vee; 06.11.2014
comment
@jdias, тогда получи ВМ, заселился. - person Pacerier; 24.02.2015

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

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

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

person seanyboy    schedule 22.10.2008
comment
Он работает в Linux. Сейчас он открыт на другом рабочем столе. Функция синхронизации структуры, которая позволяет вносить изменения в схему из ›тестирования› в реальном времени, стоит только лицензионных сборов. - person Colonel Sponsz; 22.10.2008
comment
Хорошая уловка, я даже не знал, что у него есть эти особенности. На данный момент это лучшее, что есть на Mac. - person O.O; 24.07.2011
comment
Кажется, сравнивает только базы данных, которые живут на серверах, а не собственные файлы sql - person AlxVallejo; 11.12.2014
comment
@seanyboy, почему тебе нравится дурацкий интерфейс? - person Pacerier; 24.02.2015

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

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

person Yury Litvinov    schedule 01.04.2011
comment
да, это лучшее решение для меня, предоставляет точные запросы синхронизации SQL, так что вы можете обновлять его в любое время и в любом месте .. - person Anupam; 11.02.2012
comment
дорогостоящий и тяжелый, не годится для внесения исправлений постфактум - person zanlok; 07.03.2012
comment
Очень медленно, и по какой-то причине он отбрасывает и воссоздает множество внешних ключей, даже если они не нужны. Нет возможности следить за прогрессом. - person Artem Goutsoul; 08.03.2012

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

person andyhky    schedule 22.10.2008
comment
Работает отлично! И это бесплатно, спасибо. Для тех, кто не смог его найти (например, я). Это здесь: База данных - ›Обратный инженер -› В модели MySQL или диаграмме EER - ›База данных -› Синхронизация с любым источником - person bentzy; 09.06.2014
comment
Это действительно хорошо работает. Однако вы можете сравнивать только одноименные базы данных. У меня есть несколько (мультитенантных клиентов) баз данных, которые я хочу синхронизировать с главной версией на том же хосте. Поэтому мне нужно переименовать мастер, чтобы он соответствовал каждой клиентской базе данных перед синхронизацией. В остальном приятно! - person scipilot; 24.04.2015
comment
Дополнительную информацию об этом можно найти по этой ссылке. - person Steven Ryssaert; 21.05.2015

Конечно, есть много способов, но в моем случае я предпочитаю команды 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

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

person develCuy    schedule 23.04.2012

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

Он работает с Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 и MySQL alt text

person jmpeace    schedule 04.10.2010
comment
это было ТОЧНО то, что я искал! Потрясающий! - person Josh Nankin; 12.10.2010

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

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

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

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

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

person Zac    schedule 22.10.2008
comment
Не забудьте указать и --hostN, и --userN, иначе произойдет сбой без уведомления. - person Znarkus; 03.05.2014
comment
У меня были проблемы с инструментами Oracle mysqldbcompare, генерирующими ошибки в индексах и изменяющими эквивалентные поля. Инструмент mysqldiff работал безупречно и сэкономил немало времени. - person Robert K; 18.02.2015

Взгляните на http://www.liquibase.org/

person anders.norgaard    schedule 22.10.2008
comment
+1 Именно то, что я искал. - person Juan Garcia; 06.09.2014

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

person likeuclinux    schedule 12.04.2011
comment
Если у вас возникли проблемы с установкой этого на Mac, я смог установить mysql и python с помощью homebrew, а macports безрезультатно. - person Bijou Trouvaille; 07.07.2012

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

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

person stepancheg    schedule 07.02.2009
comment
Этот проект больше не находится в разработке. - person ; 28.02.2015

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

person Jarod Elliott    schedule 22.10.2008
comment
Я не знал об этом проекте! Спасибо, похоже, у него довольно много инструментов, которые были бы чрезвычайно полезны. - person Vincent Ramdhanie; 22.10.2008
comment
Я не нашел инструментов сравнения схем в Maatkit. - person stepancheg; 24.09.2010
comment
Я тоже - где в инструментах мы можем это найти? - person Shabbyrobe; 03.02.2011
comment
Я не думаю, что там есть сравнение схем. Я имел в виду сравнение и синхронизацию данных с использованием контрольной суммы mk-table и mk-table-sync. - person Jarod Elliott; 18.02.2011
comment
это в процессе code.google.com/p/maatkit/wiki/mk_schema_sync - person Pedro; 15.07.2011

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

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

person George    schedule 22.10.2008
comment
Инструменты Red Gate, похоже, не поддерживают ничего, кроме SQL Server. - person Rytmis; 06.12.2009
comment
Red Gate также имеет версию MySQL, бесплатную в раннем доступе: red-gate .com / products / MySQL_Compare / index.htm - person David Atkinson; 24.10.2010
comment
Недоступно для OSX - person AlxVallejo; 11.12.2014

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

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

person Craig Trader    schedule 22.10.2008

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

dbForge Data Compare for MySQL

person Devart    schedule 24.09.2010

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

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

person Nikolay Ivanov    schedule 16.08.2011
comment
Разработка этого инструмента остановлена ​​и теперь включена в Percona: percona.com/software/percona-toolkit < / а> - person mrmuggles; 23.04.2014

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

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

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

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

person Naim Zard    schedule 24.11.2010

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

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

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

Недостатки:

  • не синхронизирует длину с крошечными целыми числами
  • не синхронизирует имена индексов должным образом
  • не синхронизирует комментарии
person Artem Goutsoul    schedule 08.03.2012
comment
Правда, сделали поверхностное обновление с небольшими изменениями за 5 лет. Но активно не развивается. - person Artem Goutsoul; 04.03.2013

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

person Community    schedule 25.01.2011

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

person Paul Tomblin    schedule 22.10.2008
comment
В MySQL есть аналогичная команда mysql_dump. Это могло бы быть решением, если бы я мог интегрировать его в процесс развертывания. Спасибо. - person Vincent Ramdhanie; 22.10.2008
comment
Кроме того, для более удобного использования вы можете получить то же самое с помощью phpMyAdmin - настоящего убийцы для пользователей MySQL! - person schonarth; 22.10.2008
comment
Идентичные схемы могут легко привести к разным дампам схем. Различные версии клиента mysql могут создавать несколько разные дампы (проблема, если вы сравниваете схемы с двух разных машин), а такие вещи, как внешние ключи и ограничения, могут сбрасываться в другом порядке. - person Mark E. Haase; 01.12.2011

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

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

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

person Community    schedule 22.01.2009
comment
это обещание? Я попробовал, и он упал с изрядным количеством ошибок, не в последнюю очередь из-за того, что при переносе функции он пытается использовать того же владельца, что и исходная база данных. - person Cruachan; 29.05.2009
comment
Да, это обещание. Для большинства людей инструмент работает нормально. Мы обещаем пожизненную лицензию на любую обнаруженную вами ошибку, и мы не сможем исправить ее в течение 5 рабочих дней. Обратитесь в нашу службу поддержки. - person ; 04.06.2009