SCROLL
Среднее время на прочтение: 4 мин.

Установка PostgreSQL на Debian 12

PostgreSQL — это мощная объектно-реляционная система управления базами данных с открытым исходным кодом. Она использует и расширяет язык SQL, а также имеет множество функций для безопасного хранения и масштабирования самых сложных нагрузок данных.

В этом руководстве я покажу, как установить СУБД PоstgreSQL на операционной системе Debian 12. Установку будем выполнять из исходников и в качестве примера, рассмотрим установку 16 версии PоstgreSQL.

Официальная ветка Postgres в Github — https://github.com/postgres/postgres
Официальный FTP — https://ftp.postgresql.org/pub/source

Установка зависимостей

Устанавливаем необходимые пакеты зависимостей:

apt-get install gcc make libreadline-dev zlib1g-dev libicu-dev libbison-dev flex git -y

Загрузка исходного кода

Клонируем репозиторий PostgreSQL с GitHub:

cd /opt
git clone https://github.com/postgres/postgres.git postgres

Переходим в клонированный репозиторий.

cd postgres

Выбор версии

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

Посмотреть все ветки в репозитории можно командой:

git branch -a | grep -E '^[* ]*(remotes/origin/)?REL' | awk -F/ '{print $NF}'

В случае если необходимо выполнить сборку какой то определенной версии, то сперва можно вывести список доступных релизов:

git tag | grep -E '^REL'

Переключаемся на нужную ветку или конкретный релиз (в моем случае я буду устанавливать 16-тый стабильный релиз):

git checkout REL_16_STABLE

Переменные окружения

Добавим переменную окружения, с указанием устанавливаемой версии PostgreSQL, для того чтобы было удобнее выполнять настройку после установки (в моем случае я указываю 16):

export PSQL_VERSION=16

Сборка

Выполняем настройку, которая проверит вашу систему на наличие зависимостей и соответствующим образом настроит сборку

./configure \
    --prefix=/usr \
    --datadir=/var/lib/postgresql/$PSQL_VERSION/data \
    --bindir=/usr/lib/postgresql/$PSQL_VERSION/bin \
    --libdir=/usr/lib/postgresql/$PSQL_VERSION/lib

Пояснения:

  • --datadir=/var/lib/postgresql/../data → файлы базы будут храниться здесь
  • --bindir=/usr/lib/postgresql/../bin → бинарники (postgres, pg_ctl …) здесь
  • --libdir=/usr/lib/postgresql/../lib → библиотеки здесь

Компиляция и установка

Собираем с использованием всех ядер и после устанавливаем:

make -j$(nproc)
make install

Создание пользователя postgres

Добавляем системного пользователя postgres — все операции с СУБД будут выполняться под этой учетной записью. Устанавливаем для этой учетной записи пустой пароль, чтобы заблокировать вход для обычных пользователей, но с возможностью входа через root или аккаунты с sudo правами.

useradd postgres -d /var/lib/postgresql -s /bin/bash -c "PostgreSQL administrator"

Назначаем соответствующие права доступа на домашний каталог пользователя postgres, где так же будет располагаться каталог основного кластера баз данных:

chown -R postgres:postgres /var/lib/postgresql/
chmod 700 /var/lib/postgresql/$PSQL_VERSION/data

Настраиваем переменные окружения для PostgreSQL:

sudo sh -c "echo 'export PGDATA=/var/lib/postgresql/$PSQL_VERSION/main/' > /etc/profile.d/postgres.sh"
sudo sh -c "echo 'PATH=/usr/lib/postgresql/$PSQL_VERSION/bin/:$PATH' >> /etc/profile.d/postgres.sh"
source /etc/profile.d/postgres.sh
Файл /etc/profile.d/postgres.sh автоматически загружается при входе пользователей, обеспечивая глобальную доступность настроек.

Создание кластера

Кластером баз данных в PostgreSQL считается совокупность баз данных, которые физически расположены в каком-нибудь каталоге.

Кодировка

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

Так же хочу заметить что если вам нужно создать базу данных с кодировкой отличной от той что задана для кластера, то это возможно сделать при создании базы данных с указанием нужной кодировки (LC_COLLATE, LC_CTYPE).

Посмотреть текущую локаль в системе можно командой:

locale | grep -E 'LC_CTYPE|LC_COLLATE'

LC_CTYPE="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"

К примеру если у вас локаль по умолчанию en_US.UTF-8, а вам нужно инициализировать кластер с локалью ru_RU.UTF-8, то сперва ее нужно добавить в систему командой — dpkg-reconfigure locales и затем уже можно ее использовать при инициализации кластера.

Инициализация кластера

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

su - postgres -c "initdb"

Для инициализации кластера с указанной локалью, используем команду:

su - postgres -c "initdb --locale=ru_RU.UTF-8 -E UTF8"
Можно так же использовать ключи -U и -W чтобы задать суперпользователя и пароль сразу при инициализации базы данных. По умолчанию используется имя пользователя ОС, под которым выполняется команда.

Успешный вывод:

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.

creating directory /var/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/lib/postgresql/16/main/ -l logfile start

Дополнительный кластер

Сервер PostgreSQL может обслуживать несколько кластеров, для инициализации дополнительного кластера, инициализация выполняется с ключом -D и указанием каталога данных:

su - postgres -c "initdb -D /var/lib/postgresql/$PSQL_VERSION/another_cluster"

Где:

  • /var/lib/postgresql/../another_cluster — каталог данных (может быть любым).

Так же в файле конфигурации дополнительного кластера /var/lib/postgresql/../another_cluster/postgresql.conf необходимо указать номер порта отличный от уже используемого кластера.

Создание службы

Создаем файл службы systemd для PostgreSQL:

cat << EOF > /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/lib/postgresql/$PSQL_VERSION/bin/pg_ctl -D /var/lib/postgresql/$PSQL_VERSION/main/ -l /var/lib/postgresql/$PSQL_VERSION/main/postgres-main.log start
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target
EOF

Перезагружаем конфигурацию systemd, включаем автозапуск и запускаем службу:

systemctl daemon-reload

systemctl enable postgresql
systemctl start postgresql

Установка расширений

Расширения в PostgreSQL — это модули, добавляющие новую функциональность к серверу баз данных, такие как дополнительные типы данных, функции и операторы. Некоторые расширения входят в стандартную поставку PostgreSQL и могут быть установлены из каталога contrib находящийся в каталоге с исходниками.

Например, установим расширение tablefunc, которое добавляет функции для работы с табличными данными.

cd contrib/tablefunc/

Выполним сборку и установку:

make
make install

Активируем расширение в базе данных:

su - postgres -c "psql -d postgres -c \"CREATE EXTENSION tablefunc;\""

Проверим, что расширение установилось:

su - postgres -c "psql -d postgres -c \"SELECT name, comment FROM pg_available_extensions;\""

Вывод должен содержать строку:

   name    |                          comment
-----------+------------------------------------------------------------
 tablefunc | functions that manipulate whole tables, including crosstab
 plpgsql   | PL/pgSQL procedural language
(2 rows)
 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение

0 комментариев

Нет комментариев.