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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          0: Контрольная точка "Вспомогательные действия выполнены". Время выполнения: 0.022. Запросов: 21, время запроса: 0.017 (78.52)%. Памяти использовано: 691488 байтов

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