Сравнить структуры двух баз данных? - PullRequest
21 голосов
/ 05 марта 2010

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

Ответы [ 17 ]

14 голосов
/ 15 октября 2014

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

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 голосов
/ 06 сентября 2015

Для базы данных 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

5 голосов
/ 05 марта 2010

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

5 голосов
/ 05 марта 2010

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

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

www-red-gate.com

4 голосов
/ 06 марта 2010

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

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

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

3 голосов
/ 03 марта 2018

Чтобы ответить на этот вопрос в настоящее время, я создал скрипт, который использует содержимое 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 голосов
/ 15 декабря 2016

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

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

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

1 голос
/ 03 августа 2014

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

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

1 голос
/ 15 марта 2011

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

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

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

1 голос
/ 05 марта 2010

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

...