Intellect Board Pro
Система управления форумами
Объявление

30 ноября 2015 года выпущена окончательная версия Intellect Board 3.00! Перейти к скачиванию
Также доступен конвертор данных для IntB 2.22

Для получения новостей о новых версиях подписывайтесь на наши страницы ВКонтакте и в Twitter.

Привет, гость!

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

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

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

Критикуя — предлагай, предлагая — обосновывай!
Для тех, кто живет в Интернете — мой блог о Web-разработке.

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

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

Критикуя — предлагай, предлагая — обосновывай!
Для тех, кто живет в Интернете — мой блог о Web-разработке.

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

0 +
19 марта 2017, 17:51#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 некорректно работает с многоколоночыми индексами! Так что используйте скрипт с осторожностью!
Прикрепленные файлы:

Критикуя — предлагай, предлагая — обосновывай!
Для тех, кто живет в Интернете — мой блог о Web-разработке.

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

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

Критикуя — предлагай, предлагая — обосновывай!
Для тех, кто живет в Интернете — мой блог о Web-разработке.

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

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

0: Контрольная точка "Конец инициализации". Время выполнения: 0.002. Запросов: 8, время запроса: 0.002 (67.47)%. Памяти использовано: 515240 байтов

0: Контрольная точка "Фиксация действия пользователя выполнена". Время выполнения: 0.003. Запросов: 10, время запроса: 0.002 (68.43)%. Памяти использовано: 515568 байтов

0: Контрольная точка "Основное действие выполнено". Время выполнения: 0.008. Запросов: 17, время запроса: 0.006 (70.46)%. Памяти использовано: 667696 байтов

0: Контрольная точка "Вспомогательные действия выполнены". Время выполнения: 0.009. Запросов: 19, время запроса: 0.006 (70.09)%. Памяти использовано: 675392 байтов

0: Контрольная точка "После срабатывания шаблонизатора.". Время выполнения: 0.011. Памяти использовано: 951872 байтов