Я вношу вклад в Apache AGE, расширение PostgreSQL, и хотел бы поддерживать установленными PostgreSQL 11, 12 и 13, чтобы легко переключаться между ними для тестирования/отладки функциональности расширения.
У меня установлен PostgreSQL 12 из исходного кода, и, поскольку одновременная работа нескольких баз данных не в моих интересах, я выполнил следующие шаги, чтобы установить PostgreSQL 13:
origin/REL_12_STABLE
на ветку origin/REL_13_STABLE
. 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
Я пытался:
postgresql.conf
файле базы данных и /usr/local/pgsql-13/bin/data
директории.postgresql-server-dev-13
.FORCE_PGCONFIG
с помощью export FORCE_PGCONFIG=/usr/local/pgsql-13/bin/pg_config
.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. Есть ли способ сохранить все версии из установки исходного кода?
Просто вы можете создать каждую версию 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
если вы хотите изменить версию, просто проверьте ветку этой желаемой версии и повторно запустите все настройки.
Не собирайте из исходного кода, используйте репозиторий PGDG Ubuntu и прилагаемый postgresql-common для управления версиями.