Установка PostgreSQL из исходников

Здесь я покажу как собрать 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, позволяет осуществлять широкий контроль над поведением параметров сортировки.

Можно было бы выполнить сборку и без поддержки ReadlineZlibICU. Тогда нам бы не пришлось устанавливать дополнительные пакеты. Для отключения функциональности при создании конфигурации (команда 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.

Сводка
Установка PostgreSQL из исходников
Имя статьи
Установка PostgreSQL из исходников
Описание
Здесь я покажу как собрать PostgreSQL 16 версии из исходников, инициализировать кластер и запустить его на сервере Debian 12

Оставьте комментарий