Аналог diff для баз данных
Одна страница
Распечатать
. Редактировалось 1 раз, последний — #1
Вопрос: может ли кто посоветовать скрипт или программу, которая могла бы сравнить две похожих базы данных и сгенерировать SQL-файл для преобразования одной в другую? Думаю, мне такое потребуется, когда начнут появляться версии IntB 3.01 и старше, но писать такой скрипт самому — дело достаточно долгое и нудное.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
Нашел утилиту mysqldiff в составе mysqlutils, но выяснилось, что она не может сравнивать объекты рекурсивно. То есть если задать для сравнения две таблицы, она корректно напишет для них запрос ALTER для преобразования одной в другую, но если задать две базы, то вместо написания ALTER для всех таблиц она просто выдаст список всех таблиц, у которых есть различия. То есть потребуется писать дополнительный скрипт.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
Так и не нашел подходящих бесплатных утилит, поэтому написал сам скрипт, который сравнивает базы с помощью mysqldiff, причем позволяет делать это даже в том случае, если у таблиц разные префиксы. (Например, в одной все таблицы начинаются на ib_, а в другой — на intb_, в этом случае таблица database1.ib_topic будет сравниваться с database2.intb_topic и т.д.).
Использовать его так: сначала задать в переменных MYSQL_HOST, MYSQL_USER и т.п. параметры подключения, потом вызвать в таком формате:
где database1 и database2 — это имена баз данных, а prefix1 и prefix2 — префиксы таблиц в них.
Скрипт выдаст на stdout код SQL-запросов, которые нужно выполнить, чтобы привести структуру database1 в соответствие с database2, поэтому порядок баз важен. Для таблиц, которые есть в database2, но нет в database1, будут написаны необходимые операторы CREATE TABLE. Таблицы, которые есть в database1, но нет в database2, будут проигнорированы. Таблицы из database2, имена которых начинаются не на prefix2, тоже будут проигнорированы.
Также возможна работа в безпрефискном режиме. В этом случае все таблицы из database2 сравниваются с одноименными таблицами из database1. Запуск в безпрефиксном режиме:
(Т.е. вместо префиксов идет две пары кавычек подряд, что интерпретируется как пустая строка.)
Внимание! Как выяснилось, mysqldiff некорректно работает с многоколоночыми индексами! Так что используйте скрипт с осторожностью!
Использовать его так: сначала задать в переменных 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 некорректно работает с многоколоночыми индексами! Так что используйте скрипт с осторожностью!
Прикрепленные файлы:
- mysqlcompare.sh (1957 байтов)
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
Нашел решение на Perl: утилита sqlt-diff. Подробнее см. здесь: http://xpro.su/webmaster-tools/db-conversion
В ней вроде таких проблем нет.
В ней вроде таких проблем нет.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
Одна страница
Распечатать У вас нет прав для отправки сообщений в эту тему.