
Я установил два сервера PostgreSQL на своем компьютере. Один 9.1, а другой 9.3. Мне нужно установить оба сервера.
Однако при запуске pg_dump я получаю ошибку несоответствия версий:
server version: 9.3.6; pg_dump version: 9.1.15
pg_dump: aborting because of server version mismatch
Как мне решить эту проблему? (Невозможно удалить ни одну из версий — я сначала установил 9.1, а 9.3 много месяцев спустя — мне нужнообаустановлены серверы баз данных).
решение1
TL;DR: если оба экземпляра PostgreSQL управляются пакетами Ubuntu (как и должно быть), просто используйте опцию --cluster
выбора экземпляра PostgreSQL для резервного копирования, и он автоматически выберет соответствующую версию pg_dump:
pg_dump --cluster 9.1/main [other pg_dump options]
или
pg_dump --cluster 9.3/main [other pg_dump options]
.
main
это просто значение по умолчанию, запустите pg_lsclusters
, чтобы увидеть ваши настоящие имена в Cluster
столбце.
Как это работает: устанавливается пакетами Ubuntu и /usr/bin/pg_dump
фактически является мягкой ссылкой на /usr/share/postgresql-common/pg_wrapper
, цель которой — выбрать правильный экземпляр и запустить соответствующий двоичный файл. --cluster
не существует в стандартных командах PostgreSQL, это дополнение Debian/Ubuntu, которое призвано решить эту проблему с несколькими версиями/несколькими путями.
То же самое касается psql
, createdb
, createuser
, и т. д. Около 18 команд postgres /usr/bin
фактически управляются pg_wrapper
.
Видетьчеловек pg_wrapperдля большего.
решение2
Вы можете использовать:
sudo find / -name pg_dump
чтобы найти ваши версии pg_dump
в моем случае:/usr/pgsql-9.6/bin/pg_dump
Итак, следующее, что мы можем сделать:
sudo ln -sfn /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump
для того, чтобы обновиться до нужного нам
решение3
Если вы используете docker, вы можете запустить любую версию pg_dump без необходимости управлять несколькими установками. Это запишет файл в /path/to/dump/to/myfilename.dump
postgres 12.5:
docker run --rm --network=host -v "/path/to/dump/to:/tmp/dump" \
postgres:12.5 pg_dump -Fc -v --dbname="my_db_bame" -f "/tmp/dump/myfilename.dump"
--rm
удаляет контейнер после выполнения команды--network=host
подключает контейнер к локальной сети хоста-v ...
монтирует ваш каталог хоста (/path/to/dump/to
) во временный каталог внутри контейнера
Вам просто нужно убедиться, что каталог, в который вы монтируете ( /tmp/dump
), совпадает с каталогом, в который pg_dump записывает данные.
Затем вы можете изменить 12.5 на любую другую версию, которую захотите.