Я хотел спросить, можно ли сравнить полную структуру базы данных из двух огромных баз данных. У нас есть две базы данных, одна из которых - база данных разработки, другая - производственная база данных. Я иногда забыл внести изменения в производственную базу данных, прежде чем мы выпустили некоторые части нашего кода, что приводит к тому, что производственная база данных не имеет такой же структуры, поэтому, если мы выпустим что-то, мы получили некоторые ошибки. Есть ли способ сравнить эти два или синхронизировать?
Сравнить структуры двух баз данных?
Ответ 1
А как насчет http://www.mysqldiff.org/, которая является бесплатной?
Ответ 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 экспортировать базы данных без "данных" и только структуру.
Прокрутка параметров экспорта для всей базы данных, просто снимите "данные" и установите вывод в текст. Экспортируйте обе базы данных, которые вы хотите сравнить.
Затем в сравнении файлов в вашей предпочтительной программе/сайте сравните два выхода текстовых файлов из баз данных. Синхронизация по-прежнему является ручным в этом решении, но это эффективно для сравнения и поиска структурных различий.
Ответ 8
Вам понадобится инструмент, возможно, как Сравнитель баз данных.
Ответ 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
и она дает вам отличия