Подтвердить что ты не робот

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

www-red-gate.com

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

https://dbmatcher.com