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

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

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

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

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

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


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

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

Dave R. 23.12.2008 18:50

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

David Atkinson 24.10.2010 16:58

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

Herr 15.05.2011 13:37

Инструмент MySQL от Redgate теперь стоит 70 долларов за пользователя. Даже за эту цену я буду оценивать и оставлять комментарии здесь.

Jeremy McGee 18.07.2011 01:01

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

Tass 21.01.2012 01:52

Другой инструмент Windows: Инструментальные средства базы данных, работает в Linux через Wine и поддерживает другие системы баз данных. В этот инструмент входит функция «Сравнение схем», она платная, но и недорогая.

Martijn Tonies 02.05.2014 19:46

Мне нравится использовать SQL Architect. Есть хорошая функция сравнения. Здесь: sqlpower.ca/page/architect_download_os

Nelson Teixeira 18.06.2014 00:03

Отличной альтернативой для Windows, Linux или Mac является инструмент mysqldbcompare, разработанный самим MySQL. Дополнительную информацию см. В моем ответе: stackoverflow.com/a/26192873/1365289! Это заняло у меня ДОЛГОЕ время, и оно того стоило!

Jasdeep Khalsa 04.10.2014 18:17

Это не требует подключения к базе данных, предоставляет API и веб-интерфейс: blog.geneticcoder.com/2015/11/12/…

I wrestled a bear once. 12.11.2015 10:10
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
368
9
349 440
21
Перейти к ответу Данный вопрос помечен как решенный

Ответы 21

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

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

Vincent Ramdhanie 22.10.2008 17:47

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

schonarth 22.10.2008 17:51

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

Mark E. Haase 01.12.2011 23:32

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

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

Vincent Ramdhanie 22.10.2008 17:51

Я не нашел инструментов сравнения схем в Maatkit.

stepancheg 24.09.2010 08:25

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

Shabbyrobe 03.02.2011 14:10

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

Jarod Elliott 18.02.2011 13:32

это в процессе code.google.com/p/maatkit/wiki/mk_schema_sync

Pedro 15.07.2011 19:01

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

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

Juan Garcia 06.09.2014 00:59

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

Все упомянутые инструменты выглядят хорошо. Я выбираю Toad произвольно, пока не смогу провести дополнительное исследование.

Vincent Ramdhanie 22.10.2008 18:25

MySQL Workbench просто предоставляет отчет об изменениях, не генерирует скрипт обновления (или я не нашел, как это сделать), если вы сравните два скрипта. Затем он попросит вас обновить базу данных. В моем случае меня интересует только скрипт обновления.

javydreamercsw 15.09.2010 19:17

Жаба очень неудобная :( нельзя просто сравнивать два разных sql-дампа

pars 06.01.2011 17:28

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

jdias 11.09.2011 01:45

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

thames 02.01.2012 08:35

@jdias et al - с момента появления ESXi ОС не является массовым препятствием (кто не может найти старую лицензию на 2000 или XP, которая поставлялась со старым ПК?)

zanlok 06.03.2012 23:59

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

schemacs 27.10.2012 15:08

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

clieu 03.01.2013 23:22

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

Visruth 25.09.2013 09:11

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

hek2mgl 17.02.2014 15:24

Теперь это плагин eclipse, но он все еще содержит много ошибок. еще лучше, чем окна.

SkorpEN 15.10.2014 13:42

Сегодня Toad больше не является бесплатным ПО. Это бесплатный маршрут, и вы должны купить его, чтобы использовать все функции.

vee 06.11.2014 22:09

@jdias, тогда получи ВМ, поселился.

Pacerier 24.02.2015 10:07

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

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

bentzy 09.06.2014 18:29

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

scipilot 24.04.2015 02:43

Дополнительную информацию об этом можно найти на этом связь

Steven Ryssaert 21.05.2015 21:42

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

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

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

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

Colonel Sponsz 22.10.2008 18:10

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

O.O 24.07.2011 08:33

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

AlxVallejo 11.12.2014 17:42

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

Pacerier 24.02.2015 10:08

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

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

Инструменты Red Gate, похоже, не поддерживают ничего, кроме SQL Server.

Rytmis 06.12.2009 13:15

Red Gate также имеет версию MySQL, бесплатную в раннем доступе: red-gate.com/products/MySQL_Compare/index.htm

David Atkinson 24.10.2010 16:58

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

AlxVallejo 11.12.2014 17:35

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

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

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

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

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

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

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

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

Znarkus 03.05.2014 16:30

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

Robert K 18.02.2015 17:27

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

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

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

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

Cruachan 29.05.2009 15:52

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

Itamar 04.06.2009 09:22

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

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

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

user289086 28.02.2015 22:41

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

dbForge Data Compare for MySQL

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

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

это было ТОЧНО то, что я искал! Потрясающий!

Josh Nankin 12.10.2010 04:41

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

Anupam 11.02.2012 17:00

дорогостоящий и тяжелый, не годится для внесения исправлений постфактум

zanlok 07.03.2012 00:00

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

Artem Goutsoul 08.03.2012 16:54

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

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

Bijou Trouvaille 07.07.2012 03:00

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

mrmuggles 23.04.2014 19: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

Двойные плюсы за грамотность в командной строке !!!

dogenpunk 21.01.2012 01:56

командная строка ftw! теперь я могу использовать это в любом скрипте :)

hyprnick 01.03.2012 03:14

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

zanlok 07.03.2012 01:53
-d, --no-data могут быть интересны тем, кто нуждается в производственном использовании, но заботится только о схеме
Louis 10.05.2013 09:06

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

Jasdeep Khalsa 04.10.2014 18:22

@jasdeepkhalsa Ссылка не работает, не могли бы вы предоставить новую?

PHPst 17.02.2015 08:34
--all-databases также полезен, если вы хотите сравнить всю схему сервера, а не конкретную базу данных.
DOOManiac 21.04.2015 18:33

Для хорошей разницы в цветах попробуйте vimdiff.

gitaarik 20.05.2015 15:22

@PHPst К сожалению, весь вопрос был удален из-за "модерации", но я сейчас пишу свой собственный инструмент сравнения с открытым исходным кодом, поэтому опубликую подробности, как только они у меня появятся!

Jasdeep Khalsa 21.05.2015 18:30

@PHPst Попробовать github.com/DBDiff/DBDiff

Jasdeep Khalsa 19.06.2015 12:47

@jasdeepkhalsa Спасибо, я попробую.

PHPst 19.06.2015 15:26

Блестящий ответ! Но да, -d нужен для пропуска данных.

Ashesh 10.07.2015 11:59
-iEwB может быть полезен, если вам не нужны пробелы, табуляции и регистр.
Alex2php 04.08.2015 17:45

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

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

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

Недостатки:

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

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

Artem Goutsoul 04.03.2013 20:57

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

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

Другие вопросы по теме