Сравнение схем двух баз данных

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

При разработке приложений иногда возникает потребность в сравнении двух баз данных (например prod и dev).

Существует ряд подходов для решения этого вопроса - от создания dump-файла со структурой db и последующим использованием diff, до использования специализированных платных решений типа dbForge или RedGate (большой список здесь).

Одним из таких решений, сочетающих бесплатность и удобство использования, является Compalex.

Compalex - это набор скриптов для быстрого сравнения двух схем баз даных. Для облегчения использования, все это упаковано в Docker-контейнер, который содержит как непосредственно скрипты, так и настроенное окружение для подключения к DB.

Для запуска контейнера необходимо указать:

docker run -it -e DATABASE_DRIVER='mysql' \
-e DATABASE_ENCODING='utf8' \
-e SAMPLE_DATA_LENGTH='100' \
-e DATABASE_HOST='host.docker.internal' \
-e DATABASE_PORT='3306' \
-e DATABASE_NAME='compalex_dev' \
-e DATABASE_USER='root' \
-e DATABASE_PASSWORD='password' \
-e DATABASE_DESCRIPTION='Developer database' \
-e DATABASE_HOST_SECONDARY='host.docker.internal' \
-e DATABASE_PORT_SECONDARY='3306' \
-e DATABASE_NAME_SECONDARY='compalex_prod' \
-e DATABASE_USER_SECONDARY='root' \
-e DATABASE_PASSWORD_SECONDARY='password' \
-e DATABASE_DESCRIPTION_SECONDARY='Production database' \
-p 8000:8000 dlevsha/compalex

Где:

DATABASE_DRIVER - используемый драйвер для подключения

  • mysql - для MySQL

  • pgsql - для PostgreSQL

  • dblib - для Microsoft SQL Server

  • oci - для Oracle

DATABASE_HOST and DATABASE_HOST_SECONDARY - имя хоста или IP для подключения к первому и второму серверу.

Если базы развернуты локально на localhost:

Для пользователей MacOS и Windows: используйте host.docker.internal вместо localhost , поскольку скрипт, запущенный внутри контейнера должен подключиться на хостовую машину.

Для пользователей Linux: используйте опцию --network host (в этом случае контейнер "делит" сеть с хостовой машиной) и в качестве имя хоста для подключения к DB используйте localhost, либо с помощью команды ip a в секции docker0 посмотрите ip адрес хостовой машины.

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500
    link/ether 02:42:e8:a9:95:58 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
Вариант с пробросом коннектов к DB через SSH

Если вы имеете только SSH доступ на машины DB и вам не хочется открывать порты наружу - вы можете воспользоваться пробросом портов через SSH на localhost на разные порты, чтобы потом использовать эти подключения локально.

Пример:

ssh -L 1522:localhost:1521 [user name]@[remote host 1]
ssh -L 1523:localhost:1521 [user name]@[remote host 2]

Пробросит 1521 порт с удаленных хостов remote host 1 и remote host 2 на localhost порты 1522 и 1523 соответственно.

Если у вас есть удаленный коннект не непосредственно на машину с DB, а на некоторый application сервер, который уже имеет подключение к DB, то подключения будут выглядеть так:

ssh -L 1522:[remote database server 1]:1521 [user name]@[remote application host 1]
ssh -L 1523:[remote database server 2]:1521 [user name]@[remote application host 2]

Во всех описанных выше случаях соединение будет проброшено на локальную машину и в переменных DATABASE_HOST and DATABASE_HOST_SECONDARY нужно будет использовать ip, по схеме, описанной выше.

Если базы развернуты удаленно - для подключения просто используйте IP адрес машины с DB (убедитесь что на удаленной машине открыт порт и он доступен с машины, где запущен контейнер).

DATABASE_PORT and DATABASE_PORT_SECONDARY - порт для подключения к хосту баз данных.

Порты по умолчанию:

  • 3306 - Mysql

  • 5432 - PostgreSQL

  • 1433 - MSSQL

  • 1521 - Oracle

DATABASE_NAME and DATABASE_NAME_SECONDARY - название сравниваемых баз данных

DATABASE_USER / DATABASE_PASSWORD and DATABASE_USER_SECONDARY / DATABASE_PASSWORD_SECONDARY - логин и пароль для доступа к базам данных

DATABASE_DESCRIPTION and DATABASE_DESCRIPTION_SECONDARY - описание баз данных (опционально, в справочных целях).

После того как вы запустите контейнер, откройте браузер и перейдите http://localhost:8000. Должна отобразиться схема-сравнение, состоящая из двух колонок, в соответствии с указанными параметрами баз данных.

Иногда нет возможности организовать прямое локальное подключение к базам данных и изменения необходимо посмотреть прямо на сервере из консоли.

Для этих целей я рекомендую использовать консольный браузер eLinks, который поддерживает HTML-форматирование и цвета в разметке.

Необходимо установить скрипт на сервере, запустить контейнер (как это описано выше) и выполнить:

$ elinks http://localhost:8000

В своем терминале вы увидите примерно следующее:

Более подробная информация на сайте (на английском) http://compalex.net/.

Здесь можно попробовать как все это работает http://demo.compalex.net/.

Проект на GitHub https://github.com/dlevsha/compalex

Посмотреть на DockerHub https://hub.docker.com/r/dlevsha/compalex

Источник: https://habr.com/ru/post/518840/


Интересные статьи

Интересные статьи

Технологии беспроводной передачи данных, которую мы знаем как WiFi, уже более 30 лет. В этой статье вспомним, почему WiFi называется именно так, как появился, какие были основные эта...
Как я и обещал, сразу несколько предновогодних постов будут посвящены выбору портативной аудиотехники (так вышло, что вся она стоит катастрофически много). На этот раз сравнительный обзор наушник...
Мой хобби проект — это GPS логгер. В комментариях даже предложили называть его “Путевой компьютер”, т.к. логгирование это только небольшая часть всех возможностей устройства. Многое уже реализова...
На Федеральном портале проектов нормативных правовых актов опубликован проект постановления об установлении запрета на допуск программно-аппаратных комплексов систем хранения данных (СХД) иностр...
Нашумевшие атаки на норвежского производителя алюминиевых изделий Norsk Hydro и энергосистему Венесуэлы лишний раз показали, что промышленные предприятия по-прежнему уязвимы для хакеров. Мы р...