В настоящее время я разрабатываю приложение с использованием базы данных MySQL.
Структура базы данных все еще находится в движении и изменяется по мере развития (я меняю свою локальную копию, оставляя копию на тестовом сервере).
Есть ли способ сравнить два экземпляра базы данных, чтобы увидеть, были ли какие-либо изменения?
Хотя в настоящее время можно просто отказаться от предыдущей базы данных тестового сервера, когда тестирование начинает вводить тестовые данные, это может стать немного сложным. То же самое, но в большей степени произойдет позже в производстве ...
Есть ли простой способ постепенно вносить изменения в производственную базу данных, предпочтительно автоматически создавая сценарий для ее изменения?
Инструменты, упомянутые в ответах:
Red Gate теперь также имеет версию MySQL, в настоящее время бесплатную, поскольку она находится в расширенном раннем доступе: red-gate.com/products/MySQL_Compare/index.htm
Это настоящая проблема. Я развертываю с разработчика на производственную машину, и это ВСЕГДА что-то ломает. Спасибо за информативный пост
Инструмент MySQL от Redgate теперь стоит 70 долларов за пользователя. Даже за эту цену я буду оценивать и оставлять комментарии здесь.
Тоже нужно было это только сейчас, пришлось увеличить размер поля. Не хотелось просто увеличивать и подозревать, что все в порядке. @ Джаред предложил именно то, что я использовал.
Другой инструмент Windows: Инструментальные средства базы данных, работает в Linux через Wine и поддерживает другие системы баз данных. В этот инструмент входит функция «Сравнение схем», она платная, но и недорогая.
Мне нравится использовать SQL Architect. Есть хорошая функция сравнения. Здесь: sqlpower.ca/page/architect_download_os
Отличной альтернативой для Windows, Linux или Mac является инструмент mysqldbcompare, разработанный самим MySQL. Дополнительную информацию см. В моем ответе: stackoverflow.com/a/26192873/1365289! Это заняло у меня ДОЛГОЕ время, и оно того стоило!
Это не требует подключения к базе данных, предоставляет API и веб-интерфейс: blog.geneticcoder.com/2015/11/12/…






Что касается первой части вопроса, я просто делаю дамп обоих и сравниваю их. Не уверен в mysql, но в postgres pg_dump есть команда, позволяющая просто выгрузить схему без содержимого таблицы, чтобы вы могли видеть, изменили ли вы схему.
В MySQL есть аналогичная команда mysql_dump. Это могло бы быть решением, если бы я мог интегрировать его в процесс развертывания. Спасибо.
Кроме того, для более удобного использования вы можете получить то же самое с помощью phpMyAdmin - настоящего убийцы для пользователей MySQL!
Идентичные схемы могут легко привести к разным дампам схем. Различные версии клиента mysql могут создавать несколько разные дампы (проблема, если вы сравниваете схемы с двух разных машин), а такие вещи, как внешние ключи и ограничения, могут сбрасываться в другом порядке.
Есть полезный инструмент, написанный на Perl, под названием Мааткит. Помимо прочего, в нем есть несколько инструментов для сравнения и синхронизации баз данных.
Я не знал об этом проекте! Спасибо, похоже, у него довольно много инструментов, которые были бы чрезвычайно полезны.
Я не нашел инструментов сравнения схем в Maatkit.
Я тоже - где в инструментах мы можем это найти?
Я не думаю, что там есть сравнение схем. Я имел в виду сравнение и синхронизацию данных с использованием контрольной суммы mk-table и mk-table-sync.
это в процессе code.google.com/p/maatkit/wiki/mk_schema_sync
Взгляните на http://www.liquibase.org/
+1 Именно то, что я искал.
Жаба для MySQL имеет функции сравнения данных и схемы, и я считаю, что он даже создаст сценарий синхронизации. Лучше всего то, что это бесплатное программное обеспечение.
Все упомянутые инструменты выглядят хорошо. Я выбираю Toad произвольно, пока не смогу провести дополнительное исследование.
MySQL Workbench просто предоставляет отчет об изменениях, не генерирует скрипт обновления (или я не нашел, как это сделать), если вы сравните два скрипта. Затем он попросит вас обновить базу данных. В моем случае меня интересует только скрипт обновления.
Жаба очень неудобная :( нельзя просто сравнивать два разных sql-дампа
Я был в восторге от этого инструмента, пока не понял, что он работает в Windows, а не в Linux. Вернуться к поиску ...
Для меня сработало фантастически. Сделал все, что мне нужно, и выделенные ячейки для измененных записей позволяют легко увидеть, что изменилось.
@jdias et al - с момента появления ESXi ОС не является массовым препятствием (кто не может найти старую лицензию на 2000 или XP, которая поставлялась со старым ПК?)
mysqldbcompare с опциями --run-all-tests --difftype sql --disable-binary-logging может выполнять почти ту же работу (за исключением того, что вывод смешивается с комментариями, а специальные символы в строке не экранируются).
Моя единственная жалоба на Toad заключается в том, что он не всегда разумно генерирует команды ALTER, вместо этого он переименовывает таблицу, создает новую таблицу (с новыми столбцами), а затем перемещает ваши данные из старой в новую. На это уходит гораздо больше времени, чем на простое изменение.
@Anson Smith Можете ли вы сказать мне альтернативу Linux?
Этот инструмент предназначен только для Windows, что делает его бесполезным для меня. Я думаю, что ответ должен упомянуть об этом.
Теперь это плагин eclipse, но он все еще содержит много ошибок. еще лучше, чем окна.
Сегодня Toad больше не является бесплатным ПО. Это бесплатный маршрут, и вы должны купить его, чтобы использовать все функции.
@jdias, тогда получи ВМ, поселился.
Из списка сравнения функций ... MySQL Workbench предлагает Schema Diff и Schema Synchronization в своей версии сообщества.
Прекрасно работает! И это бесплатно, спасибо. Для тех, кто не смог его найти (например, я). Это здесь: База данных -> Обратный инженер -> В модели MySQL или диаграмме EER -> База данных -> Синхронизировать с любым источником.
Это действительно хорошо работает. Однако вы можете сравнивать только одноименные базы данных. У меня есть несколько (мультитенантных клиентов) баз данных, которые я хочу синхронизировать с «главной» версией на том же хосте. Поэтому мне нужно переименовать мастер, чтобы он соответствовал каждой клиентской базе данных перед синхронизацией. В остальном приятно!
Дополнительную информацию об этом можно найти на этом связь
Я использую программу под названием Navicat, чтобы:
Это стоит денег, это только Windows и Mac, и у него дурацкий интерфейс, но мне он нравится.
Он работает в Linux. Сейчас он открыт на другом рабочем столе. Функция синхронизации структуры для внесения изменений схемы из dev-> test-> live стоит только лицензионных сборов.
Хорошая уловка, я даже не знал, что у него есть эти особенности. На данный момент это лучшее, что есть на Mac.
Кажется, сравнивает только базы данных, которые живут на серверах, а не собственные файлы sql
@seanyboy, почему тебе нравится дурацкий интерфейс?
Сравнение SQL от RedGate http://www.red-gate.com/products/SQL_Compare/index.htm
DBDeploy для автоматизированного управления изменениями базы данных http://dbdeploy.com/
Инструменты Red Gate, похоже, не поддерживают ничего, кроме SQL Server.
Red Gate также имеет версию MySQL, бесплатную в раннем доступе: red-gate.com/products/MySQL_Compare/index.htm
Недоступно для OSX
Что касается себя, я бы начал с создания дампов обеих баз данных и сравнения дампов, но если вам нужны автоматически сгенерированные скрипты слияния, вам понадобится реальный инструмент.
Простой поиск Гугл включил следующие инструменты:
Если вам нужно только сравнить схемы (не данные) и у вас есть доступ к Perl, mysqldiff может сработать. Я использовал его, потому что он позволяет сравнивать локальные базы данных с удаленными (через SSH), поэтому вам не нужно беспокоиться о сбросе каких-либо данных.
http://adamspiers.org/computing/mysqldiff/
Он попытается сгенерировать SQL-запросы для синхронизации двух баз данных, но я не доверяю ему (или любому другому инструменту). Насколько мне известно, не существует 100% надежного способа обратного проектирования изменений, необходимых для преобразования одной схемы базы данных в другую, особенно когда было внесено несколько изменений.
Например, если вы измените только тип столбца, автоматизированный инструмент может легко угадать, как его воссоздать. Но если вы также переместите столбец, переименуете его и добавите или удалите другие столбцы, лучшее, что может сделать любой программный пакет, - это угадать, что, вероятно, произошло. И вы можете в конечном итоге потерять данные.
Я бы посоветовал отслеживать любые изменения схемы, которые вы вносите на сервер разработки, а затем запускать эти операторы вручную на реальном сервере (или включать их в сценарий обновления или миграцию). Это более утомительно, но при этом ваши данные будут в безопасности. И к тому времени, когда вы начнете разрешать конечным пользователям доступ к вашему сайту, действительно ли вы собираетесь постоянно вносить серьезные изменения в базу данных?
Не забудьте предоставить как --hostN, так и --userN, иначе он выйдет из строя.
У меня были проблемы с инструментами Oracle mysqldbcompare, генерирующими ошибки в индексах и изменяющими эквивалентные поля. Инструмент mysqldiff работал безупречно и сэкономил немало времени.
Я работаю с командой по маркетингу Nob Hill, я хотел сказать вам, что буду рад услышать ваши вопросы, предложения или что-либо еще, пожалуйста, свяжитесь со мной.
Изначально мы решили создать наш инструмент с нуля, потому что, хотя на рынке есть другие подобные продукты, ни один из них не выполняет свою работу должным образом. Очень легко показать вам различия между базами данных. Совсем другое дело - сделать одну базу данных похожей на другую. Плавная миграция как схемы, так и данных всегда была проблемой. Что ж, здесь мы добились этого. Мы настолько уверены, что он может обеспечить вам плавную миграцию, чем если бы он этого не сделал - если сценарии миграции, которые он генерирует, недостаточно читабельны или не будут работать для вас, и мы не сможем исправить это за пять рабочих дней - вы получите свою бесплатную копию!
http://www.nobhillsoft.com/NHDBCompare.aspx
это обещание? Я попробовал, и он упал с изрядным количеством ошибок, не в последнюю очередь из-за того, что при переносе функции он пытается использовать того же владельца, что и исходная база данных.
Да, это обещание. Для большинства людей инструмент работает нормально. Мы обещаем пожизненную лицензию на любую обнаруженную вами ошибку, и мы не сможем исправить ее в течение 5 рабочих дней. Обратитесь в нашу службу поддержки.
Существует еще один инструмент командной строки с открытым исходным кодом mysql-diff:
http://bitbucket.org/stepancheg/mysql-diff/
Этот проект больше не находится в разработке.
Взгляните на dbForge Data Compare для MySQL. Это условно-бесплатная программа с 30-дневным бесплатным пробным периодом. Это быстрый инструмент с графическим интерфейсом MySQL для сравнения и синхронизации данных, управления различиями в данных и настраиваемой синхронизации.

dbSolo, это платно, но эта функция может быть той, которую вы ищете http://www.dbsolo.com/help/compare.html
Работает с Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 и MySQL.

это было ТОЧНО то, что я искал! Потрясающий!
Библиотека компонентов 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
Думаю, в этом случае поможет Navicat для MySQL. Он поддерживает синхронизацию данных и структуры для MySQL. 
В SQLyog (коммерческий) есть инструмент синхронизации схемы, который генерирует SQL для синхронизации двух баз данных.

да, это лучшее решение для меня, предоставляет точные запросы синхронизации SQL, так что вы можете обновлять его в любое время и в любом месте ..
дорогостоящий и тяжелый, не годится для внесения исправлений постфактум
Очень медленно, и по какой-то причине он отбрасывает и воссоздает множество внешних ключей, даже если они не нужны. Нет возможности следить за прогрессом.
чек: http://schemasync.org/ у меня работает инструмент schemasync, это инструмент командной строки, который легко работает в командной строке Linux
Если у вас возникли проблемы с установкой этого на Mac, я смог установить mysql и python с помощью homebrew, а macports безрезультатно.
После нескольких часов поиска в Интернете простого инструмента я понял, что не смотрю в Ubuntu Software Center. Вот бесплатное решение, которое я нашел: http://torasql.com/ Они утверждают, что у них есть версия для Windows, но я использую ее только под Ubuntu.
Обновлено: 5 февраля 2015 г. Если вам нужен инструмент для Windows, TOAD идеален и бесплатен: http://software.dell.com/products/toad-for-mysql/
Разработка этого инструмента остановлена и теперь включена в Percona: percona.com/software/percona-toolkit
Если вы работаете с небольшими базами данных, я обнаружил, что 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
Двойные плюсы за грамотность в командной строке !!!
командная строка ftw! теперь я могу использовать это в любом скрипте :)
Чтобы сравнить данные, используйте это вместо этого; все еще будут некоторые комментарии MySQL4 + о наборах символов и т. д. mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
-d, --no-data могут быть интересны тем, кто нуждается в производственном использовании, но заботится только о схеме
Лучшим инструментом для использования была бы утилита mysqldbcompare, разработанная самим MySQL, которую вы можете использовать в Windows, Linux или Mac - она также может выводить операторы SQL как для данных, так и для изменений схемы и выполняет гораздо больше тестов, чем могла бы простая команда diff. определять.
@jasdeepkhalsa Ссылка не работает, не могли бы вы предоставить новую?
--all-databases также полезен, если вы хотите сравнить всю схему сервера, а не конкретную базу данных.
Для хорошей разницы в цветах попробуйте vimdiff.
@PHPst К сожалению, весь вопрос был удален из-за "модерации", но я сейчас пишу свой собственный инструмент сравнения с открытым исходным кодом, поэтому опубликую подробности, как только они у меня появятся!
@PHPst Попробовать github.com/DBDiff/DBDiff
@jasdeepkhalsa Спасибо, я попробую.
Блестящий ответ! Но да, -d нужен для пропуска данных.
-iEwB может быть полезен, если вам не нужны пробелы, табуляции и регистр.
Очень простой в использовании инструмент сравнения и синхронизации:
Средство сравнения баз данных
http://www.clevercomponents.com/products/dbcomparer/index.asp
Преимущества:
Недостатки:
Правда, сделали поверхностное обновление с небольшими изменениями за 5 лет. Но активно не развивается.
Конечно, есть много способов, но в моем случае я предпочитаю команды 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
Обратная связь приветствуется :)
Я считаю, что инструменты RedGate предназначены только для SQL Server.