Как правильно установить и переключаться между несколькими версиями PostgreSQL из исходного кода?

Я вношу вклад в Apache AGE, расширение PostgreSQL, и хотел бы поддерживать установленными PostgreSQL 11, 12 и 13, чтобы легко переключаться между ними для тестирования/отладки функциональности расширения.

У меня установлен PostgreSQL 12 из исходного кода, и, поскольку одновременная работа нескольких баз данных не в моих интересах, я выполнил следующие шаги, чтобы установить PostgreSQL 13:

  1. Доступ к каталогу исходного кода PostgreSQL 12.
  2. Я перешел с ветки origin/REL_12_STABLE на ветку origin/REL_13_STABLE.
  3. Затем я выполнил следующие команды:
   make distclean
   ./configure --prefix=/usr/local/pgsql-13
   make -j4

Однако я не могу изменить версию. Это вывод команды pg_config. Только версия все еще 12.14, хотя я указываю на правильный каталог:

    BINDIR = /usr/local/pgsql-13/bin
    DOCDIR = /usr/local/pgsql-13/share/doc
    HTMLDIR = /usr/local/pgsql-13/share/doc
    INCLUDEDIR = /usr/local/pgsql-13/include
    PKGINCLUDEDIR = /usr/local/pgsql-13/include
    INCLUDEDIR-SERVER = /usr/local/pgsql-13/include/server
    LIBDIR = /usr/local/pgsql-13/lib
    PKGLIBDIR = /usr/local/pgsql-13/lib
    LOCALEDIR = /usr/local/pgsql-13/share/locale
    MANDIR = /usr/local/pgsql-13/share/man
    SHAREDIR = /usr/local/pgsql-13/share
    SYSCONFDIR = /usr/local/pgsql-13/etc
    PGXS = /usr/local/pgsql-13/lib/pgxs/src/makefiles/pgxs.mk
    CONFIGURE = '--prefix=/usr/local/pgsql-13'
    CC = gcc
    CPPFLAGS = -D_GNU_SOURCE
    CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -O2
    CFLAGS_SL = -fPIC
    LDFLAGS = -Wl,--as-needed -Wl,-rpath,'/usr/local/pgsql-13/lib',--enable-new-dtags
    LDFLAGS_EX = 
    LDFLAGS_SL = 
    LIBS = -lpgcommon -lpgport -lz -lreadline -lcrypt -lm 
    VERSION = PostgreSQL 12.14

Я пытался:

  1. Ручное изменение версии в postgresql.conf файле базы данных и /usr/local/pgsql-13/bin/data директории.
  2. Установка postgresql-server-dev-13.
  3. Обновление переменной FORCE_PGCONFIG с помощью export FORCE_PGCONFIG=/usr/local/pgsql-13/bin/pg_config.
  4. Обновление переменной FORCE_PGCONFIG файлом из установки менеджера пакетов: export FORCE_PGCONFIG=/usr/local/pgsql-13/bin/pg_config.

Но ни один из этих вариантов не сработал. Вариант 4 вызывает ошибки при инициализации базы данных с помощью pg_ctl, даже если другая база данных не запущена. Это также не подходит для отладки кода:

2023-04-09 13:16:54.163 -03 [7819] LOG:  could not bind IPv4 address "127.0.0.1": Address already in use
2023-04-09 13:16:54.163 -03 [7819] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2023-04-09 13:16:54.163 -03 [7819] WARNING:  could not create listen socket for "localhost"
2023-04-09 13:16:54.163 -03 [7819] FATAL:  could not create any TCP/IP sockets
2023-04-09 13:16:54.164 -03 [7819] LOG:  database system is shut down

Также я увидел, что можно изменить номер порта и использовать два сервера одновременно, но так как я буду использовать только одну версию за раз, то не вижу в этом смысла.

Я использую Ubuntu 22.04 LTS. Есть ли способ сохранить все версии из установки исходного кода?

Не собирайте из исходного кода, используйте репозиторий PGDG Ubuntu и прилагаемый postgresql-common для управления версиями.

Adrian Klaver 09.04.2023 22:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
137
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Просто вы можете создать каждую версию postgresql по локальному/относительному пути, т.е. в одном и том же каталоге исходного кода и использовать разные порты для каждой версии. и то же самое для возраста, вам нужно будет указать путь PG_CONFIG и LD_LIBRARY_PATH перед его установкой.

Это пример установки PG 13 после установки возраста.

# make directory for holding the data
mkdir pg13data
# go to pg13 (postgres 13 source code directory)
cd pg13
# configure the source code build
./configure --prefix=/home/rrr/bitnine/pg13 --enable-debug --with-pgport=5431
make
sudo make install
# ensure installation
cd ..
cd pg13
# expected dirs should have: bin  include  lib  share
ls
# add new user or just skip it and use your preferred 
adduser postgres
# change ownership to the user
chown postgres pg13data
# switch to the user
su - postgres
# Update LD_LIBRARY_PATH (very important step)
LD_LIBRARY_PATH=/home/rrr/bitnine/pg13/lib
export LD_LIBRARY_PATH
# init db cluster
./pg13/bin/initdb -D ./pg13data
# start the server
./pg13/bin/postgres -D ./pg13data/ -p 5431 >logfile 2>&1 &
# create database 'test' 
./pg13/bin/createdb test -p 5431
# start postgresql session
# output psql (13.0)
./pg13/bin/psql test
# NOTE : rrr is my username

Установка ВОЗРАСТА

cd apache-age-1.3.0
LD_LIBRARY_PATH=/home/rrr/bitnine/pg13/lib
export LD_LIBRARY_PATH
# install
sudo make PG_CONFIG=/home/rrr/bitnine/pg13/bin/pg_config install
# installcheck
sudo make clean
make PG_CONFIG=/home/rrr/bitnine/pg13/bin/pg_config installcheck
./pg13/bin/psql test
CREATE EXTENSION age;
LOAD 'age';
SELECT * FROM ag_catalog.create_graph('test_graph');

Проделайте ту же операцию с другими версиями и оставьте порт по умолчанию, так как мы изменили эту версию или используйте то, что вам нравится.

Использованная литература:

Я написал запись в блоге о том, что вы можете проверить это

make distclean не обязательно достаточно. Он оставляет после себя кусочки старого материала, который затем может загрязнить новую сборку. Вы должны сделать make maintainer-clean при переключении версий или просто полностью удалить старый исходный каталог, а затем git checkout -f с нуля.

Ответ принят как подходящий

Вы должны хранить каждую версию postgresql по отдельным относительным путям. Поэтому, когда вы устанавливаете каждую версию в отдельный каталог, они не будут перекрываться или смешиваться с другими версиями.

Наконец, вы можете установить age во все эти каталоги и запустить его из каталога определенной версии. Это устранит эту проблему, и будет работать только тот экземпляр сервера и возраста, который принадлежит родительскому каталогу postgres.

Кроме того, убедитесь, что пути в ./configure указаны правильно, убедитесь, что версии postgres находятся в отдельных каталогах. Вы можете использовать функцию pwd для того, что использует абсолютный путь к каталогам.

Вам также может потребоваться завершить процесс, работающий на порту 5432, а затем повторно инициализировать базу данных на основе конкретной версии postgres, которую вы хотите использовать.

Чтобы получить PID процесса, запущенного в данный момент на порту 5432 (порт по умолчанию для postgres), просто запустите

sudo fuser -k 5432/tcp

или запустить:

sudo lsof -i :5432

Убить процесс с помощью команды kill. Сбросьте переменную среды PGDATA в каталог bin/data версии postgres, которую вы планируете использовать, а затем повторно запустите команду initdb.

Убедитесь, что используемые вами команды bin относятся к версии postgres.

установить исходный код pg из git

https://github.com/postgres/postgres.git

вы можете выбрать версию, изменив ветку git

 git branch -a
git checkout (branch name)

теперь установите пг

    ./configure
make -j12
make install -j12

установить путь

export PATH=/usr/local/pgsql/bin/:$PATH
export PGDATA=/usr/local/pgsql/bin/data
sudo chown (username) /usr/local/psql/ -R 
Initdb

если вы хотите изменить версию, просто проверьте ветку этой желаемой версии и повторно запустите все настройки.

Другие вопросы по теме