При разработке приложений иногда возникает потребность в сравнении двух баз данных (например 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
- для MySQLpgsql
- для PostgreSQLdblib
- для Microsoft SQL Serveroci
- для 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
- Mysql5432
- PostgreSQL1433
- MSSQL1521
- 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
В своем терминале вы увидите примерно следующее:
Более подробная информация на сайте (на английском).
mihmig
Скажите, а можно такую страшную конструкцию запуска контейнера:
Заменить на более короткую (например указать конфигурационный файл)?
DVLev Автор
Да, можно хранить переменные в .env файле и передавать путь к файлу при старте контейнера (https://stackoverflow.com/questions/30494050/how-do-i-pass-environment-variables-to-docker-containers), либо использовать docker-compose.yml (пример есть здесь https://github.com/dlevsha/compalex)