it-roy-ru.com

Сравнить структуры двух баз данных?

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

19
streetparade

Как насчет http://www.mysqldiff.org/ который является бесплатным?

4
Anders Abel

Вы можете использовать командную строку:

mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql
diff file1.sql file2.sql
12
Gere

Для базы данных MySQL вы можете сравнить представление и таблицы (имя столбца и тип столбца), используя этот запрос:

SET @firstDatabaseName = '[first database name]';
SET @secondDatabaseName = '[second database name]';

SELECT * FROM  
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @firstDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t1
LEFT JOIN                     
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @secondDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE 
  t2.tableRowType IS NULL        
UNION 
SELECT * FROM  
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @firstDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t1
RIGHT JOIN                     
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @secondDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE 
  t1.tableRowType IS NULL;

Если вы предпочитаете использовать инструмент с пользовательским интерфейсом, вы также можете использовать этот скрипт https://github.com/dlevsha/compalex , который может сравнивать таблицы, представления, ключи и т.д.

Compalex - это легкий скрипт для сравнения двух схем баз данных. Он поддерживает MySQL, MS SQL Server и PostgreSQL.

Снимок экрана (сравните таблицы) Compare tables

11
Dmitry

Red-Gate SQL Compare - отличный инструмент, который сделает это за вас. Я использовал это в течение многих лет с большим успехом. Это сэкономило мне тысячи часов работы.

У них также есть инструмент, который будет сравнивать данные. Продукт, который я упомянул выше, сравнивает схему.

www-red-gate.com

5
Randy Minder

Вы можете просто сбросить их с помощью --no-data и сравнить файлы.

Не забудьте использовать опцию --lock-tables = 0 в вашей производственной базе данных, чтобы избежать большой неприятной глобальной блокировки.

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

4
MarkR

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

SET @database_current = '<production>';
SET @database_dev = '<development>';
-- column and datatype comparison
SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH,
    b.COLUMN_NAME, b.DATA_TYPE, b.CHARACTER_MAXIMUM_LENGTH
FROM information_schema.COLUMNS a
    LEFT JOIN information_schema.COLUMNS b ON b.COLUMN_NAME = a.COLUMN_NAME
        AND b.TABLE_NAME = a.TABLE_NAME
        AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
    AND (
        b.COLUMN_NAME IS NULL
        OR b.COLUMN_NAME != a.COLUMN_NAME
        OR b.DATA_TYPE != a.DATA_TYPE
        OR b.CHARACTER_MAXIMUM_LENGTH != a.CHARACTER_MAXIMUM_LENGTH
    );
-- table comparison    
SELECT a.TABLE_SCHEMA, a.TABLE_NAME, b.TABLE_NAME
FROM information_schema.TABLES a
    LEFT JOIN information_schema.TABLES b ON b.TABLE_NAME = a.TABLE_NAME
        AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
    AND (
        b.TABLE_NAME IS NULL
        OR b.TABLE_NAME != a.TABLE_NAME
    );

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

2
Avidos

Для mysql в Linux возможно через phpmyadmin экспортировать базы данных без 'data' и только структуры.

Прокручивая параметры экспорта для всей базы данных, просто отмените выбор "data" и установите вывод в текст. Экспортируйте обе базы данных, которые вы хотите сравнить.

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

1
user945389

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

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

1
Sualeh Fatehi

Я попробовал mysqldiff безуспешно, поэтому я хотел бы обогатить будущих читателей, обратив внимание на функцию сравнения mysqlworkbench. http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c130

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

1
JoSSte

Вам понадобится инструмент, вероятно, такой как Сравнение баз данных .

1
davek

Проверьте Близнецы Дельта - диспетчер различий SQL для .NET. Бесплатная бета-версия доступна для скачивания, но полная версия доступна только через несколько дней.

Он не сравнивает различия данных на уровне строк, но сравнивает таблицы, функции, sprocs и т.д. И работает молниеносно. (Новая версия 1.4 загружает и сравнивает 1k Sprocs менее чем за 4 секунды, по сравнению с другими инструментами, которые я тестировал, что заняло более 10 секунд.)

Все правы, RedGate делает отличные инструменты.

1
Shaun

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

Я использую ER/Studio Embarcadero для этого. Он имеет функцию сравнения и слияния.

Есть много других, таких как Toad для MySQL, которые также имеют сравнение. Также согласитесь с предложением Red-Gate, но никогда не использовали его для MySQL.

1
codenheim

Наконец-то я воспользовался простым инструментом под названием "сравнение структур mysql", чтобы решить эту проблему. Это только для Windows, но это бесплатно, и это работает ..

0
Walty Yeung

Если вы используете MySQL, есть бесплатный инструмент DB Matcher , куда вы загружаете 2 файла .SQL, и он дает вам отличия

https://dbmatcher.com

0
Moishey Schwartz

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

0
aslisabanci

SQL Examiner Suite 201 сравнивает базы данных MySQL (и схему, и данные)

0
SQLDev

Попробуйте сравнение схемы dbForge для сервера SQL . Он может сравнивать и синхронизировать любую схему базы данных. Быстро, легко, всегда дает правильный результат. Посмотрите, как он летит в вашей базе данных!

0
Devart