Сравните две базы данных MySQL
В настоящее время я занимаюсь разработкой приложения с использованием базы данных MySQL.
Структура базы данных постоянно меняется и меняется в процессе разработки (я меняю свою локальную копию, оставляя ее только на тестовом сервере).
Есть ли способ сравнить два экземпляра базы данных, чтобы увидеть, были ли какие-либо изменения?
Хотя в настоящее время достаточно просто отбросить предыдущую базу данных тестового сервера, поскольку тестирование начинает вводить тестовые данные, это может быть немного сложнее.
То же самое будет происходить позже в производстве...
Существует ли простой способ поэтапного внесения изменений в производственную базу данных, предпочтительно путем автоматического создания сценария для его изменения?
Инструменты, упомянутые в ответах:
- MySQL схема и сравнение данных Red-Gate (коммерческая)
- Мааткит (ныне Перкона)
- LiquiBase
- Жаба
- Сравнение базы данных Nob Hill (Коммерческая)
- MySQL Diff
- SQL EDT (Коммерческий)
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
У Toad for MySQL есть функции сравнения данных и схем, и я верю, что он даже создаст скрипт синхронизации. Лучше всего, это бесплатное программное обеспечение.
Я использую часть программного обеспечения под названием Navicat, чтобы:
- Синхронизируйте базы данных Live с моими тестовыми базами данных.
- Показать различия между двумя базами данных.
Это стоит денег, это только Windows и Mac, и у него есть дурацкий интерфейс, но мне это нравится.
В SQLyog (коммерческий) есть инструмент синхронизации схем, который генерирует SQL для синхронизации двух баз данных.
Конечно, есть много способов, но в моем случае я предпочитаю команды 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
Обратная связь приветствуется:)
Из списка сравнения функций... MySQL Workbench предлагает Schema Diff и Schema Synchronization в своей версии для сообщества.
dbSolo, он платный, но эта функция может быть той, которую вы ищете http://www.dbsolo.com/help/compare.html
Работает с Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 и MySQL.
Если вам нужно только сравнить схемы (не данные) и иметь доступ к Perl, mysqldiff может работать. Я использовал его, потому что он позволяет сравнивать локальные базы данных с удаленными базами данных (через SSH), поэтому вам не нужно беспокоиться о сбросе каких-либо данных.
http://adamspiers.org/computing/mysqldiff/
Он попытается сгенерировать SQL-запросы для синхронизации двух баз данных, но я не доверяю ему (или любому инструменту, на самом деле). Насколько я знаю, нет 100% надежного способа обратного инжиниринга изменений, необходимых для преобразования одной схемы базы данных в другую, особенно когда было сделано несколько изменений.
Например, если вы изменяете только тип столбца, автоматизированный инструмент может легко угадать, как его воссоздать. Но если вы также переместите столбец, переименуете его, добавите или удалите другие столбцы, лучшее, что может сделать любой программный пакет, - это угадать, что, вероятно, произошло. И вы можете потерять данные.
Я бы посоветовал отслеживать любые изменения схемы, которые вы вносите в сервер разработки, а затем запускать эти операторы вручную на работающем сервере (или переводить их в сценарий обновления или миграции). Это более утомительно, но сохранит ваши данные в безопасности. И к тому времени, когда вы начнете предоставлять конечным пользователям доступ к вашему сайту, вы действительно будете постоянно вносить изменения в базу данных?
Проверьте: http://schemasync.org/ инструмент schemasync работает для меня, это инструмент командной строки, легко работает в командной строке Linux
Есть еще один инструмент командной строки mysql-diff с открытым исходным кодом:
Взгляните на dbForge Data Compare для MySQL. Это условно бесплатная программа с 30-дневным пробным периодом. Это быстрый инструмент MySQL GUI для сравнения и синхронизации данных, управления различиями данных и настраиваемой синхронизации.
Существует полезный инструмент, написанный на Perl, который называется Maatkit. Среди прочего есть несколько инструментов сравнения и синхронизации баз данных.
Сравнение SQL от RedGate http://www.red-gate.com/products/SQL_Compare/index.htm
DBDeploy, чтобы помочь с автоматизированным управлением изменениями базы данных http://dbdeploy.com/
После нескольких часов поиска в Интернете простого инструмента я понял, что не смотрю в Ubuntu Software Center. Вот бесплатное решение, которое я нашел: http://torasql.com/ Они утверждают, что у них также есть версия для Windows, но я использую ее только под Ubuntu.
Изменить: 2015-Feb-05 Если вам нужен инструмент Windows, TOAD идеален и бесплатен: http://software.dell.com/products/toad-for-mysql/
Для себя я бы начал с дампирования обеих баз данных и определения дампов, но если вы хотите автоматически сгенерированные сценарии слияния, вам понадобится настоящий инструмент.
Простой поиск Google обнаружил следующие инструменты:
- MySQL Workbench, доступный в Сообществе (OSS) и Коммерческом вариантах.
- Сравнение базы данных Nob Hill, доступно бесплатно для MySQL.
- Список других инструментов сравнения SQL.
Очень простой в использовании инструмент сравнения и синхронизации:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp
Преимущества:
- быстро
- легко использовать
- легко выбрать изменения для применения
Недостатки:
- не синхронизирует длину крошечным целым
- неправильно синхронизирует имена индексов
- не синхронизирует комментарии
Библиотека ApacheZeta Components представляет собой универсальную библиотеку слабосвязанных компонентов для разработки приложений на основе PHP 5.
Компоненты eZ - DatabaseSchema позволяет:
.Создать / сохранить определение схемы базы данных; .Сравнить схемы базы данных; . Генерировать запросы синхронизации;
Вы можете посмотреть учебное пособие здесь: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html
Я думаю, что Navicat для MySQL будет полезен для этого случая. Он поддерживает синхронизацию данных и структуры для MySQL.
Я работаю в отделе маркетинга Nob Hill, я хочу сказать вам, что буду рад услышать ваши вопросы, предложения или что-то еще, пожалуйста, не стесняйтесь обращаться ко мне.
Изначально мы решили создать наш инструмент с нуля, потому что, хотя на рынке есть и другие подобные продукты, ни один из них не делает свою работу правильно. Это довольно легко показать вам различия между базами данных. Совсем другое - сделать одну базу данных похожей на другую. Плавная миграция, как схемы, так и данных, всегда была проблемой. Ну, мы добились этого здесь.
Мы настолько уверены, что он мог бы обеспечить вам плавную миграцию, чем если бы это не произошло - если генерируемые сценарии миграции не достаточно читабельны или не будут работать для вас, и мы не сможем исправить это в течение пяти рабочих дней - Вы получите свою бесплатную копию!
Для первой части вопроса я просто делаю дамп обоих и разрабатываю их. Не уверен насчет mysql, но в postgres pg_dump есть команда, которая просто выдает схему без содержимого таблицы, чтобы вы могли увидеть, изменили ли вы какую-либо схему.