PostgreSQL: различия между версиями

Материал из sysadm
Перейти к навигации Перейти к поиску
Строка 183: Строка 183:
 
# перезапуск кластера баз данных
 
# перезапуск кластера баз данных
 
</pre>
 
</pre>
 +
 +
min_wal_size и max_wal_size - определяют суммарный объем, который могут занимать WAL файлы
 +
 +
После успешной архивации, файл WAL может быть переименован и перезаписан.
 +
 +
Файлы WAL перезаписываются циклически. После включения автоматической архивации файлы
 +
 +
При включенном режиме архивации WAL, файлы не могут быть перезаписаны пока не будут успешно арх
 +
Успешно архивированные файлы WAL
  
 
== Резервирование ==
 
== Резервирование ==

Версия 03:40, 8 декабря 2025

Ссылки

Сторонние сборки

Обзор

PostgreSQL Community

Последний стабильный релиз PostgreSQL 18.1

Компоненты PostgreSQL

  • Основной процесс сервера (Postmaster) - Главный управляющий процесс, который запускает и координирует все остальные процессы PostgreSQL. Он отвечает за управление соединениями, восстановление после сбоев и поддержание общей работоспособности системы.
  • Фоновые процессы (Background Processes) - Различные процессы, работающие в фоновом режиме для выполнения основных задач, таких как:
    • Запись WAL (Write-Ahead Log) Writer - отвечает за запись из буферов памяти WAL (WAL Buffers) в файлы транзакционных логов (сегменты WAL) для обеспечения целостности данных.
    • Очистка Autovacuum Launcher/Worker - Автоматически запускает процессы VACUUM для очистки "мертвых" строк (удаленных или обновленных записей) и сбора статистики для оптимизатора запросов.
    • Контрольные точки (Checkpointer) - Периодически сбрасывает все измененные страницы данных из общей памяти на диск для обеспечения согласованности и минимизации времени восстановления.
    • Фоновые рабочие процессы (Background Workers) - Введены в более поздних версиях, используются для выполнения параллельных операций, например, при параллельном сканировании, параллельных индексах GIN и асинхронном I/O.
  • Бэкенд-процессы Backend Processes - Отдельный процесс, который создается postmaster'ом для обработки каждого клиентского соединения и выполнения запросов. Каждый процесс управляет синтаксическим анализом, планированием и выполнением SQL-запросов.
  • Разделяемая память (Shared Memory) - Область памяти, доступная для всех процессов PostgreSQL. Ключевые ее части:
    • Разделяемые буферы (Shared Buffers) - Основной кэш, где хранятся блоки данных, считанные с диска, для ускорения повторного доступа.
    • Буферы WAL (WAL Buffers) - Временное хранилище для записей WAL перед их записью на диск.
    • Кэш системных каталогов - Кэширование информации о структуре базы данных.
  • Физическое хранилище данных (Data Directory/Storage) - Каталог на диске, где хранятся все физические файлы базы данных, включая файлы данных (heap files), файлы индексов, файлы WAL и системные каталоги (системную метаинформацию).

Эти компоненты совместно обеспечивают надежное хранение, извлечение и обработку данных в PostgreSQL

Табличные пространства

Физическая структура табличного пространства

физически табличное пространство это каталог, содержащий подкаталоги баз, в которых содержатся файлы сегментов

/path/to/my_space/ 
    ├── 6354/  <-- OID конкретной базы данных (например, mydb)
    │      ├── 12345   <-- файл форка main, сегмент 1 (1 ГБ)
    │      ├── 12345.1 <-- файл форка main, сегмент 2 (1 ГБ)
    │      ├── 12345_vm <-- файл форка vm, сегмент 1 (1 ГБ)
    │      ├── 12345_fsm <-- файл форка fsm, сегмент 1 (1 ГБ)
    │      └── 12326 <-- файл форка main, сегмент 1 (1 ГБ)
    │      └── 12326_init <-- файл форка init, сегмент 1 (1 ГБ)
    └── 6355/  <-- OID другой базы данных
        └── ... 

Важные особенности

  • в одном табличном пространстве может располагаться несколько баз данных
  • одна база данных может располагаться в нескольких табличных пространствах

Структура объекта

  • объект (таблица,индекс,...) - логическое понятие, состоит из форков
  • форк - логическое понятие, состоит из файлов сегментов и может быть нескольких типов
    • форк main содержит данные объекта и состоит из файлов сегментов <oid>,<oid>.1,...
    • форк vm (Visibility Map) содержит мета данные о видимости строк на странциах и состоит из файлов сегментов <oid>_vm,<oid>_vm.1,...
    • форк fsm (Free Space Map) содержит метаданные о свободном месте на странциах и состоит из файлов сегментов <oid>_fsm,<oid>_fsm.1,...
    • форк init содержит метаданные для быстрого восстановления не журналируемых объектов, состоит из файлов сегментов <oid>_init,<oid>_init.1,...
  • сегмент - физический файл, имеет заголовок и состоит из страниц (блоков) фиксированного размера, по умолчанию 8Кб (размер блока можно указать при сборке PostgreSQL)

Установка

Rocky Linux 10

  1. установите пакет официального репозитория PostgreSQL
  2. установите PostreSQL нужной версии
  3. Инизиализируйте базу
  4. Включите и запустите сервис
# повышение привилегий до root
sudo -s

# установка пакета официального репозитория
dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm

dnf repolist
#---------------------------------------------------------------------------------------------------
...
pgdg-common   PostgreSQL common RPMs for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
pgdg13        PostgreSQL 13 for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
pgdg14        PostgreSQL 14 for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
pgdg15        PostgreSQL 15 for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
pgdg16        PostgreSQL 16 for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
pgdg17        PostgreSQL 17 for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
pgdg18        PostgreSQL 18 for RHEL / Rocky Linux / AlmaLinux 10 - x86_64
...
#---------------------------------------------------------------------------------------------------

dnf install postgresql18-server

# инициализация кластера баз данных (здесь слово кластер означает совокупность базы данных)
/usr/pgsql-18/bin/postgresql-18-setup initdb

systemctl enable postgresql-18
systemctl start postgresql-18
systemctl status postgresql-18

# проверка сервисной учетки postgres
id postgres
 uid=26(postgres) gid=26(postgres) группы=26(postgres)

passwd -S postgres
 postgres L 2025-12-05 -1 -1 -1 -1

# выход из root
exit

Проверка подключения

# вход под пользователем postgres
sudo su -l postgres

# подключение к кластеру баз данных
psql

#---------------------------------------------------------------------------------------------------
# список баз данных
postgres-# \l
                                                       Список баз данных
    Имя    | Владелец | Кодировка | Провайдер локали | LC_COLLATE  |  LC_CTYPE   | Локаль | Правила ICU |     Права доступа     
-----------+----------+-----------+------------------+-------------+-------------+--------+-------------+-----------------------
 postgres  | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |        |             | 
 template0 | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |        |             | =c/postgres          +
           |          |           |                  |             |             |        |             | postgres=CTc/postgres
 template1 | postgres | UTF8      | libc             | ru_RU.UTF-8 | ru_RU.UTF-8 |        |             | =c/postgres          +
           |          |           |                  |             |             |        |             | postgres=CTc/postgres
(3 строки)

# список табличных пространств
# столбец "Расположение" показывает путь к данным ТП, если этот путь отличается от базового каталога данных
postgres=# \db             
     Список табличных пространств
    Имя     | Владелец | Расположение 
------------+----------+--------------
 pg_default | postgres | 
 pg_global  | postgres | 
(2 строки)

# базовый каталог данных
postgres=# show data_directory;
     data_directory     
------------------------
 /var/lib/pgsql/18/data
(1 строка)


# выход
postgres-# \q
#---------------------------------------------------------------------------------------------------

Администрирование

Автоматическая архивация WAL

По умолчанию автоматическая архивация WAL выключена.

Включение автоматической архивации WAL

/var/lib/pgsql/18/data/postgresql.conf
#-------------------------------------------------------------------------------
# включение режима архивации
wal_level = replica

# включение функции архивации
archive_mode = on

# определение команды архивации, которая будет выполняться после заполнения файла WAL
# команда должна возвращать нулевой код выхода (успех), только если файл WAL был успешно скопирован
# команда будет периодически выполняться до тех пор, пока она не завершится успешно для текущего файла WAL
# %p - полный путь к файлу WAL
# %f - имя файла WAL
archive_command = 'cp "%p" "/path/to/wal/archive/%f"'
#-------------------------------------------------------------------------------

# перезапуск кластера баз данных

min_wal_size и max_wal_size - определяют суммарный объем, который могут занимать WAL файлы

После успешной архивации, файл WAL может быть переименован и перезаписан.

Файлы WAL перезаписываются циклически. После включения автоматической архивации файлы

При включенном режиме архивации WAL, файлы не могут быть перезаписаны пока не будут успешно арх

Успешно архивированные файлы WAL

Резервирование

Физическое резервное копирование

  • pg_basebackup - стандартная утилита для создания полной физической копии всего каталога данных кластера
    • Создает согласованную базовую резервную копию, которую можно использовать в сочетании с архивированием журналов предзаписи (WAL) для восстановления на любой момент времени PITR (Point-In-Time Recovery)
    • Поддерживает потоковую передачу данных и различные форматы (plain, tar, directory)
  • Сторонние инструменты
    • pg_probackup
    • pgBackRest
    • Barman
  • Снимки (snapshot) на уровне файловой системы
    • для этого база должна быть либо остановлена (холодный бэкап)
    • либо переключена в режим резервного копирования pg_start_backup(), pg_stop_backup()

Логическое резервное копирование

  • pg_dump - дамп отдельной базы в виде sql скрипта, выполнение которого полностью восстанавливает структуру и данные базы
  • pg_dumpall - дамп всего кластера баз данных в виде sql скрипта, выполнение которого полностью восстанавливает структуру и данные всех баз кластера, включая табличные пространства роли и прочие объекты кластера
  • команда copy