Intellect Board Pro
Расширяемый движок форума с разделами разных типов
Объявление
Вышла версия 3.05 с фотогалереей и поддержкой PostgreSQL и SQLite.
Перейти к скачиванию
Привет, гость!

Аналог diff для баз данных

Настройки отображения темы Показывать по сообщений с сортировкой .
Выводить , отправленные .
Одна страница
Распечатать
4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
. Редактировалось 1 раз, последний — #1
Вопрос: может ли кто посоветовать скрипт или программу, которая могла бы сравнить две похожих базы данных и сгенерировать SQL-файл для преобразования одной в другую? Думаю, мне такое потребуется, когда начнут появляться версии IntB 3.01 и старше, но писать такой скрипт самому — дело достаточно долгое и нудное.

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
#2
Нашел утилиту mysqldiff в составе mysqlutils, но выяснилось, что она не может сравнивать объекты рекурсивно. То есть если задать для сравнения две таблицы, она корректно напишет для них запрос ALTER для преобразования одной в другую, но если задать две базы, то вместо написания ALTER для всех таблиц она просто выдаст список всех таблиц, у которых есть различия. То есть потребуется писать дополнительный скрипт.

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
#3
Так и не нашел подходящих бесплатных утилит, поэтому написал сам скрипт, который сравнивает базы с помощью mysqldiff, причем позволяет делать это даже в том случае, если у таблиц разные префиксы. (Например, в одной все таблицы начинаются на ib_, а в другой — на intb_, в этом случае таблица database1.ib_topic будет сравниваться с database2.intb_topic и т.д.).
Использовать его так: сначала задать в переменных MYSQL_HOST, MYSQL_USER и т.п. параметры подключения, потом вызвать в таком формате:
./mysqlcompare.sh database1 prefix1 database2 prefix2
где database1 и database2 — это имена баз данных, а prefix1 и prefix2 — префиксы таблиц в них.
Скрипт выдаст на stdout код SQL-запросов, которые нужно выполнить, чтобы привести структуру database1 в соответствие с database2, поэтому порядок баз важен. Для таблиц, которые есть в database2, но нет в database1, будут написаны необходимые операторы CREATE TABLE. Таблицы, которые есть в database1, но нет в database2, будут проигнорированы. Таблицы из database2, имена которых начинаются не на prefix2, тоже будут проигнорированы.
Также возможна работа в безпрефискном режиме. В этом случае все таблицы из database2 сравниваются с одноименными таблицами из database1. Запуск в безпрефиксном режиме:
./mysqlcompare.sh database1 "" database2 ""
(Т.е. вместо префиксов идет две пары кавычек подряд, что интерпретируется как пустая строка.)
Внимание! Как выяснилось, mysqldiff некорректно работает с многоколоночыми индексами! Так что используйте скрипт с осторожностью!
Прикрепленные файлы:

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
#4
Нашел решение на Perl: утилита sqlt-diff. Подробнее см. здесь: http://xpro.su/webmaster-tools/db-conversion
В ней вроде таких проблем нет.

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

Одна страница
Распечатать

У вас нет прав для отправки сообщений в эту тему.