Здесь я покажу как собрать PostgreSQL 16 версии из исходников, инициализировать кластер и запустить его на сервере Debian 12.
Причины установки PostgreSQL из исходников
Причины по которым вам может понадобится собирать PostgreSQL из исходников:
- для дистрибутива нет готового пакета;
- можно собрать PostgreSQL с нестандартными параметрами.
Особенности установки по этой статье
Будем производить сборку PostgreSQL версии 16.2 на дистрибутиве Debian 12 (bookworm).
Для выполнения команд, которым нужен административный доступ будем использовать утилиту sudo. В Debian эту утилиту можно поставить по этой инструкции, а в Ubuntu эта утилита пред-установлена.
PostgreSQL будем устанавливать в каталог — /usr/local/lib/postgresql/16/. Здесь будут лежать исполняемые файлы и библиотеки. Владельцем этого каталога и файлов в нём будет пользователь root.
Кластер баз данных расположим в каталоге — /var/local/lib/postgresql/16/main/. Здесь будут хранится базы данных и конфигурационные файлы кластера. Владельцем этого каталога будет пользователь postgres.
Домашним каталогом пользователя postgres будет — /var/local/lib/postgresql/.
Кластер будет содержать роль postgres, которая будет считаться администратором кластера.
Сборка и установка
Перед сборкой установим необходимые пакеты:
$ sudo apt install -y gcc make pkg-config libreadline-dev zlib1g-dev icu-devtools libicu-dev
Комментарии по устанавливаемым пакетам:
- gcc — набор компиляторов для различных языков программирования;
- make — утилита для компиляции исходного кода;
- pkg-config — инструмент, который предоставляет правильные параметры компилятора при включении библиотек;
- libreadline-dev — позволяет собрать PostgreSQL с поддержкой Readline, это дает возможность редактировать командную строку, пользоваться историей команд и их авто-дополнением;
- zlib1g-dev — позволяет собрать PostgreSQL с поддержкой Zlib, для сжатия архивов pg_dump;
- icu-devtools и libicu-dev — позволяет собрать PostgreSQL с поддержкой ICU, позволяет осуществлять широкий контроль над поведением параметров сортировки.
Можно было бы выполнить сборку и без поддержки Readline, Zlib, ICU. Тогда нам бы не пришлось устанавливать дополнительные пакеты. Для отключения функциональности при создании конфигурации (команда configure
) нужно было бы использовать опции (--without-icu
, --without-readline
, --without-zlib
).
Но перед сборкой нужно получить исходники, скачаем их. Затем распакуем и перейдем в каталог:
$ wget https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.bz2 $ tar xf postgresql-16.2.tar.bz2 && cd postgresql-16.2/
Затем произведём конфигурирование (configure
) перед сборкой.
- Используем опции
--prefix
и--libdir
, чтобы указать каталог установки и каталог с библиотеками. Запомните, если вы используете параметр--prefix
, чтобы указать альтернативный путь для установки, то должны указать где будут находится библиотеки, с помощью параметра--libdir
. - А также используем опцию
--with-blocksize
, чтобы указать размер блока в килобайтах. По умолчанию размер блока равен 8КБ, здесь я его меняю просто чтобы показать что это возможно. - Другие параметры конфигурирования можете посмотреть здесь.
$ ./configure --prefix=/usr/local/lib/postgresql/16/ --libdir=/usr/local/lib/postgresql/16/lib/ --with-blocksize=32
Сборку PostgreSQL из исходников (make
) можем выполнить под обычным пользователем. При этом можем указать количество задействованных в сборке ядер, у меня 6 ядер, поэтому я задействую 5 из них. А установку (make install
) выполняем под пользователем root.
$ make -j 5 $ sudo make install
Проверим установку:
$ ls -l /usr/local/lib/postgresql/16/ итого 16 drwxr-xr-x 2 root root 4096 апр 1 14:48 bin drwxr-xr-x 6 root root 4096 апр 1 14:48 include drwxr-xr-x 4 root root 4096 апр 1 14:48 lib drwxr-xr-x 6 root root 4096 апр 1 14:48 share
Создание кластера
Кластером баз данных в PostgreSQL считается совокупность баз данных, которые физически расположены в каком-нибудь каталоге. Сервер PostgreSQL может обслуживать несколько кластеров, но для этого они должны работать на разных портах. Каталог основного кластера принято называть PGDATA.
Некоторые утилиты PostgreSQL, например initdb, могут использовать переменную окружения PGDATA, чтобы узнать расположение основного кластера баз данных.
Для начала создадим пользователя операционной системы postgres. Все работы с базами данных будут вестись под этим пользователем. Оставим ему пустой пароль, тогда под ним другие пользователи не смогут зайти. Зато под ним сможет зайти root или sudo пользователь.
$ sudo useradd postgres -d /var/local/lib/postgresql/ -s /bin/bash
Затем создадим каталог основного кластера баз данных. И сделаем пользователя postgres владельцем этого каталога.
$ sudo mkdir -p /var/local/lib/postgresql/16/main/ $ sudo chown -R postgres:postgres /var/local/lib/postgresql/
Подключимся к пользователю postgres:
$ sudo su - postgres
Добавим для этого пользователя переменные окружения, применим их и проверим:
$ echo "export PGDATA=/var/local/lib/postgresql/16/main/" >> .bash_profile $ echo "PATH=/usr/local/lib/postgresql/16/bin/:$PATH" >> .bash_profile $ . .bash_profile $ ls -ld $PGDATA drwxr-sr-x 2 postgres postgres 4096 апр 1 15:04 /var/local/lib/postgresql/16/main/ $ whereis psql psql: /usr/local/lib/postgresql/16/bin/psql
Пришло время инициализировать первый кластер. Делаем это:
$ initdb The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "ru_RU.UTF-8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "russian". Data page checksums are disabled. fixing permissions on existing directory /var/local/lib/postgresql/16/main ... ok creating subdirectories ... ok selecting dynamic shared memory implementation ... posix selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default time zone ... Europe/Moscow creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok initdb: warning: enabling "trust" authentication for local connections initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: pg_ctl -D /var/local/lib/postgresql/16/main/ -l logfile start
Здесь мы бы могли использовать следующие опции:
-k
— включить подсчет контрольной суммы страниц, что позволяет своевременно обнаружить повреждение данных;-D <directory>
— указать каталог кластера, по умолчанию используется переменная PGDATA;-U <username>
— указать роль которая будет администратором кластера, по умолчанию — пользователь ОС под которым мы выполняем команду.
Остальные опции можете посмотреть здесь.
Посмотрим на файлы кластера:
$ ls -l $PGDATA итого 120 drwx------ 5 postgres postgres 4096 апр 1 15:26 base drwx------ 2 postgres postgres 4096 апр 1 15:26 global drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_commit_ts drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_dynshmem -rw------- 1 postgres postgres 5711 апр 1 15:26 pg_hba.conf -rw------- 1 postgres postgres 2640 апр 1 15:26 pg_ident.conf drwx------ 4 postgres postgres 4096 апр 1 15:26 pg_logical drwx------ 4 postgres postgres 4096 апр 1 15:26 pg_multixact drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_notify drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_replslot drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_serial drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_snapshots drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_stat drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_stat_tmp drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_subtrans drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_tblspc drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_twophase -rw------- 1 postgres postgres 3 апр 1 15:26 PG_VERSION drwx------ 3 postgres postgres 4096 апр 1 15:26 pg_wal drwx------ 2 postgres postgres 4096 апр 1 15:26 pg_xact -rw------- 1 postgres postgres 88 апр 1 15:26 postgresql.auto.conf -rw------- 1 postgres postgres 29708 апр 1 15:26 postgresql.conf
Каталог base хранит базы данных кластера, а файл postgresql.conf является основным конфигом этого кластера.
Запуск и остановка кластера
Для управления кластером существует команда pg_ctl. С её помощью мы можем запускать и останавливать кластер баз данных, а также смотреть в каком он находится состоянии. Эта утилита тоже использует переменную PGDATA для понимания, где находится каталог кластера. А с помощью опции -l <файл>
мы можем указать файл журнала.
$ pg_ctl -l postgres.log start waiting for server to start.... done server started
Кстати, запускать и отключать процесс кластера смогут только пользователи postgres или root.
Проверим статус сервера:
$ pg_ctl status pg_ctl: server is running (PID: 10982) /usr/local/lib/postgresql/16/bin/postgres
Сделаем тестовый запрос к базе данных:
$ psql -c 'SELECT now()' now ------------------------------- 2024-04-01 15:58:09.539221+03 (1 row)
Выключим сервер:
$ pg_ctl stop
Подробнее о работе pg_ctl можете почитать здесь.
Мы работали под пользователем postgres. Для дальнейшей работы вернёмся под своего sudo пользователя.
$ exit
Установка расширений PostgreSQL
Расширение — это специальная программа, расширяющая функциональность сервера баз данных. Например, модуль pgcrypto добавляет криптографические функции. Но этому расширению нужен пакет libssl-dev. Если его не установить, то в процессе компиляции мы получим ошибку. Поэтому вначале установим его:
$ sudo apt install -y libssl-dev
Расширения находятся в каталоге с исходниками, в подкаталоге contrib и в подкаталоге с названием расширения. Перейдем в этот каталог:
$ cd ~/postgresql-16.2/contrib/pgcrypto/
Затем просто соберём и установим данное расширение:
$ make -j 5 $ sudo make install
Проверим что расширение установилось.
Для начала зайдем под пользователем postgres и запустим кластер:
$ sudo su - postgres $ pg_ctl -l postgres.log start
Все установленные расширения можем посмотреть в представлении «pg_available_extensions». Чтобы посмотреть на это представление выполним запрос:
$ psql -d postgres -c "SELECT name, comment FROM pg_available_extensions;" name | comment ----------+------------------------------ pgcrypto | cryptographic functions plpgsql | PL/pgSQL procedural language (2 rows)
Как видим pgcrypto успешно установилось.
Создание и запуск второго кластера
Продолжаем работать под пользователем postgres.
На одном сервере могут работать несколько кластеров и я продемонстрирую это. Для начала создадим каталог для второго кластера и инициализируем его.
$ mkdir /var/local/lib/postgresql/16/two/ $ initdb -D /var/local/lib/postgresql/16/two/
Поменяем порт работы сервера:
$ echo "port = 5555" >> ~/16/two/postgresql.conf
И запустим второй кластер:
$ pg_ctl -D /var/local/lib/postgresql/16/two/ -l postgres2.log start waiting for server to start.... done server started
Проверим статус сервера и остановим его:
$ pg_ctl -D /var/local/lib/postgresql/16/two/ status pg_ctl: server is running (PID: 11278) /usr/local/lib/postgresql/16/bin/postgres "-D" "/var/local/lib/postgresql/16/two"
Чтобы выполнить запрос к этому кластеру, нужно утилите psql передать нужный порт:
$ psql -p 5555 -c "SELECT now()" now ------------------------------- 2024-04-01 16:51:02.308106+03 (1 row)
Для выключения этого кластера выполним:
$ pg_ctl -D /var/local/lib/postgresql/16/two/ stop waiting for server to shut down.... done server stopped
А также выключим первый кластер:
$ pg_ctl stop waiting for server to shut down.... done server stopped
Создание службы SystemD для кластеров
Создание службы для первого кластера
Сейчас нам понадобится sudo пользователь, поэтому отключаемся от пользователя postgres:
$ exit
Создадим службу postgresql для первого (основного) кластера:
$ sudo nano /etc/systemd/system/postgresql.service [Unit] Description=PostgreSQL database server Documentation=man:postgres(1) After=network-online.target Wants=network-online.target [Service] Type=forking User=postgres ExecStart=/usr/local/lib/postgresql/16/bin/pg_ctl -D /var/local/lib/postgresql/16/main/ -l /var/local/lib/postgresql/16/main/postgres-main.log start ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT [Install] WantedBy=multi-user.target
Про создание служб на SystemD я писал здесь.
Применим настройки и запустим службу:
$ sudo systemctl daemon-reload $ sudo systemctl start postgresql.service
Если служба не запускается, проверьте, возможно у вас запущен процесс postgres вручную и его нужно завершить. Это делается при помощью утилиты pg_ctl от имени пользователя postgres.
Проверим статус службы:
$ systemctl status postgresql.service ● postgresql.service - PostgreSQL database server Loaded: loaded (/etc/systemd/system/postgresql.service; disabled; preset: enabled) Active: active (running) since Thu 2024-04-04 14:51:08 MSK; 1min 27s ago Docs: man:postgres(1) Process: 18222 ExecStart=/usr/local/lib/postgresql/16/bin/pg_ctl -D /var/local/lib/postgresql/16/main/ -l /var/local/lib/postgresql/16/main/postgres.log start (code=exited, status=> Main PID: 18225 (postgres) Tasks: 6 (limit: 2306) Memory: 16.7M CPU: 34ms CGroup: /system.slice/postgresql.service ├─18225 /usr/local/lib/postgresql/16/bin/postgres -D /var/local/lib/postgresql/16/main ├─18226 "postgres: checkpointer " ├─18227 "postgres: background writer " ├─18229 "postgres: walwriter " ├─18230 "postgres: autovacuum launcher " └─18231 "postgres: logical replication launcher "
Создание службы для второго кластера
Здесь всё проделывается аналогично. Создаём службу:
$ sudo nano /etc/systemd/system/postgresql-2.service [Unit] Description=PostgreSQL database server Documentation=man:postgres(1) After=network-online.target Wants=network-online.target [Service] Type=forking User=postgres ExecStart=/usr/local/lib/postgresql/16/bin/pg_ctl -D /var/local/lib/postgresql/16/two/ -l /var/local/lib/postgresql/16/two/postgres.log start ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT [Install] WantedBy=multi-user.target
Применяем настройки и запускаем службу:
$ sudo systemctl daemon-reload $ sudo systemctl start postgresql-2.service
Проверяем статус службы:
$ systemctl status postgresql-2.service ● postgresql-2.service - PostgreSQL database server Loaded: loaded (/etc/systemd/system/postgresql-2.service; disabled; preset: enabled) Active: active (running) since Thu 2024-04-04 14:57:01 MSK; 34s ago Docs: man:postgres(1) Process: 18329 ExecStart=/usr/local/lib/postgresql/16/bin/pg_ctl -D /var/local/lib/postgresql/16/two/ -l /var/local/lib/postgresql/16/two/postgres.log start (code=exited, status=0/SUCCE> Main PID: 18332 (postgres) Tasks: 6 (limit: 2306) Memory: 17.0M CPU: 43ms CGroup: /system.slice/postgresql-2.service ├─18332 /usr/local/lib/postgresql/16/bin/postgres -D /var/local/lib/postgresql/16/two ├─18333 "postgres: checkpointer " ├─18334 "postgres: background writer " ├─18336 "postgres: walwriter " ├─18337 "postgres: autovacuum launcher " └─18338 "postgres: logical replication launcher "
Добавление служб в автозагрузку
Для добавления служб в автозагрузку выполним команды:
$ sudo systemctl enable postgresql.service $ sudo systemctl enable postgresql-2.service
Теперь после перезапуска сервера обе службы будут работать. А если хотите отменить автозагрузку, то выполните:
$ sudo systemctl disable postgresql.service $ sudo systemctl disable postgresql-2.service
Если понравилась статья, подпишитесь на мой канал в VK.