Порівняйте дві бази даних MySQL [закрито]


368

Зараз я розробляю додаток, використовуючи базу даних MySQL.

Структура бази даних все ще знаходиться в потоці і змінюється в процесі прогресування (я змінюю свою локальну копію, залишаючи одну на тестовому сервері).

Чи є спосіб порівняти два екземпляри бази даних, щоб побачити, чи були якісь зміни?

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

Чи є простий спосіб поступово вносити зміни у виробничу базу даних, бажано шляхом автоматичного створення сценарію для його зміни?


Інструменти, згадані у відповідях:


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

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

2
Це справжня проблема. Я розгортаюсь від розробника до виробничої машини, і це ЗАВЖДИ щось ламає. Дякую за цей інформативний пост
Гер

1
Інструмент MySQL від Redgate зараз складає $ 70 за користувача. Навіть за цією ціною я буду тут оцінювати та розміщувати коментарі.
Джеремі Макгі

Також це потрібно було зараз, довелося збільшити розмір поля. Не хотілося просто збільшувати його і підозрювати, що все гаразд. @Jared запропонував саме те, що я використав.
Тасс

Відповіді:


210

Якщо ви працюєте з невеликими базами даних, я виявив запущений mysqldump на обох базах даних з --skip-commentsі--skip-extended-insert параметри для генерування сценаріїв SQL, то запуск розрізнення на сценаріях 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 для змін даних І схеми та робить набагато більше тестів, ніж простий командний рядок визначити.
Джасдіп Халса

4
Для приємного розходження з кольорами спробуйтеvimdiff
gitaarik

99

Toad для MySQL має функції порівняння даних і схем, і я вважаю, що це навіть створить сценарій синхронізації. Найкраще - це безкоштовно.


2
Всі згадані інструменти добре виглядають. Я зараз вибираю Жабу довільно, поки не зможу провести ще одне дослідження.
Вінсент Рамдані

64
Я дуже схвильований цим інструментом, поки не зрозумів, що він працює у Windows, а не в Linux. Повернутися до пошуку ...
jdias

2
Працювало для мене фантастично. Зробив усе, що мені потрібно для цього, і виділені клітинки для змінених записів дозволили легко побачити, що змінилося.
Темза

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

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

20

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

  • Синхронізувати живі бази даних з моїми тестовими базами даних.
  • Показати відмінності між двома базами даних.

Це коштує грошей, це лише windows та mac, і він має химерний інтерфейс, але мені це подобається.


Він працює на Linux. Наразі він відкритий на іншому робочому столі. Функція синхронізації структури для витіснення змін схеми з програми dev-> test-> live коштує лише плату за ліцензію.
Полковник Спонш

2
Хороший улов, я навіть не знав, що він має ці риси. Це найкраща річ на mac поки що.
Хендра Узія

Здається, лише порівнюйте бази даних, які живуть на серверах, а не на рідних файлах sql
AlxVallejo

@seanyboy, Чому тобі сподобався хитрий інтерфейс користувача?
Пейсьєр

17

У SQLyog (комерційний) існує інструмент синхронізації схем ( SQLyog ), який генерує SQL для синхронізації двох баз даних.

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


1
так, це найкраще рішення на даний момент для мене, забезпечує чіткі запити синхронізації SQL, щоб ви могли оновити його в будь-який час і в будь-якому місці ..
Анупам

надмірно дорогі та важкі, не добре для
післяфактурних

1
Дуже повільно, і чомусь воно скидає і відтворює безліч сторонніх ключів, навіть коли це не потрібно. Ніякого способу слідкувати за прогресом.
Артем Гутсул

13

Із списку порівняння функцій ... MySQL Workbench пропонує розрізняти схеми та синхронізацію схем у своєму виданні спільноти.


7
Чудово працює! І це безкоштовно, дякую. Для тих, хто не зміг її знайти (як я). Тут: База даних -> Інженер зворотного зв'язку -> У моделі MySQL або діаграма EER -> База даних -> Синхронізувати з будь-яким джерелом
bentzy

Це добре працює. Однак ви можете порівнювати лише однойменні бази даних. У мене є кілька баз даних (клієнт з кількома орендарями), які я хочу синхронізувати з "основною" версією на одному хості. Тому я повинен перейменовувати головний майстер, щоб він відповідав кожному клієнту db перед синхронізацією. Інакше приємно!
науковець

Додаткову інформацію про це можна знайти за цим посиланням
Стівен Ріссаерт

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те, інакше це вийде з ладу.
Знаркус

У мене виникли проблеми з інструментами mysqldbcompare Oracle, що генерують помилки на індексах, та змінюючи поля, які були еквівалентними. Інструмент mysqldiff працював бездоганно і заощадив гарний час.
Роберт К


6

перевірка: http://schemasync.org/ інструмент schemasync працює для мене, це інструмент командного рядка легко працює в командному рядку Linux


1
Якщо у вас виникають проблеми з встановленням цього на mac, мені вдалося лише встановити mysql та python за допомогою домашнього перекладу, з макпортами безрезультатно.
Біжу Трувей


3

Є корисний інструмент, написаний за допомогою perl під назвою Maatkit . Він має кілька інструментів порівняння та синхронізації баз даних серед іншого.


Я не знав про цей проект! Дякую, схоже, у ньому є досить багато інструментів, які були б надзвичайно корисні.
Вінсент Рамдхані

2
Я не знайшов інструментів порівняння схем у Maatkit.
stepancheg

Я ні - де в інструментах ми можемо це знайти?
Шабіроб

Я не думаю, що там є порівняння схем. Я мав на увазі порівняння даних та синхронізацію за допомогою mk-table-checkum та mk-table-sync
Jarod Elliott,


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 для MySQL . Це безкоштовна програма із 30-денним безкоштовним пробним періодом. Це швидкий інструмент для графічного інтерфейсу MySQL для порівняння та синхронізації даних, управління різницею даних та настроюваної синхронізації.

Порівняйте дані dbForge для MySQL


3

Після годин пошуку в Інтернеті за простим інструментом я зрозумів, що не шукав програмного центру Ubuntu. Ось безкоштовне рішення, яке я знайшов: http://torasql.com/ Вони стверджують, що також існує версія для Windows, але я використовую її лише під Ubuntu.

Редагувати: 2015-лют-05 Якщо вам потрібен інструмент Windows, TOAD ідеальний і безкоштовний: http://software.dell.com/products/toad-for-mysql/


2
Розробка цього інструмента припинилася і тепер включена в Percona: percona.com/software/percona-toolkit
mrmuggles

2

Бібліотека компонентів apache zeta - це бібліотека загального призначення з нещільно зв'язаними компонентами для розробки програм на основі PHP 5.

Компоненти eZ - DatabaseSchema дозволяє:

   .Створення / збереження визначення схеми бази даних;
   .Порівняти схеми баз даних;
   .Загальні запити синхронізації;

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


2

Дуже простий у використанні інструмент порівняння та синхронізації: Порівняльник
баз даних http://www.clevercomponents.com/products/dbcomparer/index.asp

Переваги:

  • швидко
  • простий у використанні
  • легко вибрати зміни, які слід застосувати

Недоліки:

  • не синхронізує довжину з крихітними вставками
  • не синхронізує імена індексу належним чином
  • не синхронізує коментарі

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

1

Я думаю, що Navicat для MySQL буде корисним у цьому випадку. Він підтримує синхронізацію даних і структур для MySQL. введіть тут опис зображення


0

У першій частині запитання я просто роблю скидання обох і відрізняю їх. Не впевнений у mysql, але postgres pg_dump має команду просто скинути схему без вмісту таблиці, тож ви зможете побачити, чи змінили ви схему.


У MySQL є аналогічна команда mysql_dump. Це може бути рішенням, якби я міг інтегрувати його в процес розгортання. Дякую.
Вінсент Рамдані

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

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

0

Я працюю з маркетинговою командою Ноба Хіла, я хотів сказати вам, що буду радий почути ваші запитання, пропозиції чи що-небудь інше. Будь ласка, не соромтесь зв’язатися зі мною.

Ми спочатку вирішили створити наш інструмент з нуля, оскільки, хоча є інші подібні товари на ринку, жодна з них не робить цю роботу правильно. Показати відмінності між базами даних досить просто. Зовсім інше - фактично зробити одну базу даних, як іншу. Плавна міграція, як схеми, так і даних, завжди була проблемою. Ну, ми цього і досягли.
Ми настільки впевнені, що він може забезпечити вам плавну міграцію, ніж якщо це не так - якщо створені ним сценарії міграції недостатньо читабельні або не працюватимуть для вас, і ми не можемо виправити це протягом п'яти робочих днів - ви отримаєте власну безкоштовну копію!

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


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

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