Подготовка СУБД PostgreSQL

Подготовка СУБД PostgreSQL к выполнению резервного копирования при помощи СРК RuBackup включает:

  1. Подготовку сервера с СУБД PostgreSQL;

  2. Создание пользователя СУБД для безопасного выполнения резервной копии PostgreSQL.

Для подготовки pg_probackup перейдите к разделу Резервное копирование с использованием подмодуля pg_probackup.

Для корректной работы восстановления с развертыванием в ОС Alt Linux необходимо в файле /etc/passwd добавить строку postgres:x:46:46:PostgreSQL Server:/var/lib/pgsql:/bin/bash и закомментировать строку postgres:x:46:46:PostgreSQL Server:/var/lib/pgsql:/dev/null

1. Подготовка сервера с СУБД PostgreSQL

Для подготовки сервера с СУБД PostgreSQL необходимо выполнить следующие действия:

  1. Для обеспечения доступа пользователя rubackup_backuper к СУБД измените метод доступа в конфигурационном файле СУБД PostgreSQL /etc/postgresql/12/main/pg_hba.conf (расположение файла может отличаться в зависимости от дистрибутива Linux и версии PostgreSQL) на md5.

    05
    Рисунок 1. Пример итогового файла
  2. Для непрерывного архивирования и восстановления СУБД PostgreSQL необходимо включить архивирование WAL, для чего:

    • в конфигурационном файле СУБД PostgreSQL /etc/postgresql/12/main/postgresql.conf (расположение файла может отличаться в зависимости от дистрибутива Linux и версии PostgreSQL) настройте следующие параметры:

      wal_level = replica
      archive_mode = on
      archive_command '/opt/rubackup/modules/rb_module_postgresql
      pgsql-archive-push %p'

      Также возможно использовать команду:

      archive_command = 'cp %p /opt/rubackup/mnt/ postgresql_archives/%f'
    • там же установите значение параметра data_directory (если оно не определено), иначе модуль резервного копирования не сможет определить местоположение файлов СУБД:

      data_directory = '/var/lib/postgresql/12/main'
    • в файле postgresql.conf для версий PostgreSQL 12 и более новых, должна быть прописана строка, определяющая порядок развертывания СУБД из резервной копии:

      restore_command '/opt/rubackup/modules/rb_module_postgresql pgsql-archive-get %f %p'

      Также возможно использовать команду:

      restore_command = 'cp /opt/rubackup/mnt/ postgresql_archives/%f %p'

      Без добавления этой строки для версий PostgreSQL 12 и более новых модуль будет отказываться стартовать и будет выдавать сообщение об ошибке:

      06
      Рисунок 2. Сообщение об ошибке

      Если размер архива слишком большой, произведите сжатие архивных файлов WAL утилитой gzip:

      archive_command = 'gzip < %p > /opt/rubackup/mnt/postgresql_archives/%f.gz'

      Для сжатия архивных файлов можно воспользоваться любой другой утилитой, но таким образом, чтобы имя WAL-файлов после сжатия было формата TTTTTTTTXXXXXXXXYYYYYYYY.extension, где extension – это расширение файла.

      Для восстановления архива используйте утилиту gunzip или любую другую подходящую утилиту:

      restore_command = 'gunzip < /opt/rubackup/mnt/postgresql_archives/%f.gz > %p'
  3. После внесения изменений в конфигурационный файл перезапустите PostgreSQL командой:

    sudo service postgresql restart

Значение параметра archive_command должно содержать каталог в файловой системе сервера PostgreSQL, в который будут копироваться архивируемые сегменты WAL.

В настройках RuBackup для каждой СУБД PostgreSQL в файле /opt/rubackup/etc/rb_module_postgresql.conf определен параметр archive_catalog, содержащий значение каталога, в котором предполагается временное хранение архивных WAL-файлов. Значение этого параметра по умолчанию:

/opt/rubackup/mnt/postgresql_archives/

При планировании установки СРК RuBackup вы можете назначить для хранения архивных WAL-файлов выделенное хранилище требуемого размера и сделать на него ссылку на том сервере PostgreSQL, где это требуется.

Объем необходимого пространства под архивные WAL-файлы зависит от нагруженности базы данных и периодичности бэкапов, а также значения параметра auto_remove_wal в конфигурационном файле.

Указанный каталог должен быть доступен для записи и чтения пользователю postgres, а также пользователю, под контролем которого работает клиент RuBackup!

Обеспечить это можно командой:

sudo chown postgres:postgres /opt/rubackup/mnt/postgresql_archives/

Для правильной работы клиента RuBackup параметр archive_catalog в конфигурации RuBackup и параметр archive_command в конфигурационном файле PostgreSQL должны иметь одинаковое значение для одной и той же СУБД.

После изменения параметров конфигурационного файла необходимо перезагрузить PostgreSQL при помощи команды:

sudo systemctl restart postgresql

При настройке резервного копирования PostgreSQL в ОС Astra Linux SE 1.6 и 1.7 необходимо в файле /etc/parsec/mswitch.conf для параметра zero_if_notfound установить значение yes и затем перезагрузить сервис PostgreSQL:

sudo service postgresql restart

2. Создание пользователя СУБД для безопасного выполнения базовой резервной копии PostgreSQL

Пользователь для выполнения операции создания базовой резервной копии должен обладать правами на выполнение функций начала и окончания резервного копирования экземпляра PostgreSQL. Для настройки выполните следующие действия:

  1. Вызовите psql при помощи команды:

    sudo -u postgres psql
  2. В psql создайте пользователя rubackup_backuper (в качестве пароля укажите желаемый пароль вместо 12345):

    create user rubackup_backuper password '12345';
    alter role rubackup_backuper with login;

    В PostgreSQL версии 14 и ниже используются функции pg_stop_backup и pg_start_backup, а в версии 15 и выше - pg_backup_stop и pg_backup_start.

    grant execute on function pg_backup_start to rubackup_backuper;
    grant execute on function pg_backup_stop(bool, bool) to rubackup_backuper;
    grant execute on function pg_switch_wal to rubackup_backuper;
    grant pg_read_all_settings to rubackup_backuper;

    Вместо пользователя rubackup_backuper вы можете создать пользователя с другим именем и с таким же набором прав. В файле конфигурации модуля /opt/rubackup/etc/rb_module_postgresql.conf необходимо указать имя пользователя и его пароль:

    sudo cat /opt/rubackup/etc/ rb_module_postgresql.conf
    username rubackup_backuper
    password 12345

    Для параметра pg_ctl необходимо указать абсолютный путь для используемой версии PostgreSQL.

3. Настройка SELinux

В некоторых случаях SELinux может блокировать выполнение резервного копирования модуля PostgreSQL. На это может указывать следующая ошибка в логах postgresql:

cp: cannot create regular file
'/opt/rubackup/mnt/postgresql_archives/00000001000004B500000077':
Permission denied

Для того, чтобы устранить данную ошибку, выполните следующие шаги:

  1. Установите необходимые инструменты управления SELinux:

    Убедитесь, что у вас установлен пакет policycoreutils-python-utils (или policycoreutils-python в зависимости от вашего дистрибутива):

    sudo yum install policycoreutils-python-utils # For RHEL/CentOS/Fedora
    sudo apt install policycoreutils-python-utils # For Debian/Ubuntu
  2. Создайте пользовательский модуль политики SELinux:

    Сначала создайте файл для определения вашей пользовательской политики. Например, создайте файл с именем my_custom_policy.te:

    vi my_custom_policy.te

    Добавьте в этот файл следующее содержимое, заменив /path/to/your/folder фактическим путем к каталогу, который вы хотите исключить, и именем my_custom_t1 пользовательского типа:

    module my_custom_policy 1.0;
    require
    {
      type unconfined_t;
      type my_custom_t;
    }
    type my_custom_t;
    allow unconfined_t my_custom_t:file { read write execute };
    allow unconfined_t my_custom_t:dir { read write add_name remove_name };
  3. Скомпилируйте и установите модуль политики:

    • Скомпилируйте модуль политики:

      checkmodule -M -m -o my_custom_policy.mod my_custom_policy.te
      semodule_package -o my_custom_policy.pp -m my_custom_policy.mod
    • Установите модуль политики:

      sudo semodule -i my_custom_policy.pp
  4. Пометьте каталог пользовательским типом SELinux:

    Используйте команду semanage fcontext`, чтобы добавить контекст, и команду restorecon, чтобы его применить:

    sudo semanage fcontext -a -t my_custom_t "/path/to/your/folder(/.*)?"
    sudo restorecon -R -v /path/to/your/folder