Резервное копирование PostgreSQL без Backup Wrapper

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

В данном разделе описано, как производить резервное копирование СУБД PostgreSQL с помощью утилиты wal-g.

Дополнительно с возможностями утилиты wal-g вы можете ознакомиться в официальной документации.
Все действия необходимо производить на физическом сервере или виртуальной машине, на которых развернута база данных PostgreSQL.

Требования

  • Актуальная версия базы данных PostgreSQL.

  • S3-совместимое хранилище для хранения резервных копий, например: MinIO, AWS S3, Yandex Object Storage.

Установка и настройка утилиты wal-g

Установка и настройка утилиты состоит из следующих этапов:

Установка утилиты wal-g

Чтобы установить утилиту wal-g:

  1. Скачайте и разархивируйте дистрибутив программы Backup Wrapper, выполнив команды:

    wget https://files.rvision.ru/platform/6dfaa56c92a665a855a9/backup-wrapper-1.0.0.tar.gz
    tar -xzvf backup-wrapper-1.0.0.tar.gz
    cd backup-wrapper-1.0.0
    В архиве программы Backup Wrapper содержится бинарный файл актуальной версии утилиты wal-g. Рекомендуется использовать данный вариант установки.
  2. Установите утилиту wal-g, выполнив команды:

    mv wal-g /usr/local/bin/
    chmod +x /usr/local/bin/wal-g

Также вы можете установить утилиту wal-g из официального источника, выполнив команды:

curl -L https://github.com/wal-g/wal-g/releases/download/<walg_version>/wal-g-pg-<os_name>-amd64.tar.gz | tar xz
mv wal-g-pg-<os_name>-amd64 /usr/local/bin/wal-g
chmod +x /usr/local/bin/wal-g

Здесь:

  • <walg_version> — версия утилиты wal-g, например, v3.0.3.

  • <os_name> — название и версия используемой операционной системы, например, ubuntu-20.04.

Настройка подключения к S3-совместимому хранилищу

Чтобы настроить подключение к S3-совместимому хранилищу:

  1. Создайте файл конфигурации .walg.json от имени пользователя postgres, выполнив команду:

    su - postgres -c 'cat <<EOF >/<path_to_postgresql>/.walg.json
    {
      "PGDATA": "<pgdata>",
      "PGHOST": "<pghost>",
      "AWS_ACCESS_KEY_ID": "<access_key>",
      "AWS_SECRET_ACCESS_KEY": "<secret_key>",
      "AWS_ENDPOINT": "<aws_endpoint>",
      "AWS_S3_FORCE_PATH_STYLE": "true",
      "AWS_REGION": "<aws_region>",
      "WALG_S3_PREFIX": "<walg_s3_prefix>",
      "WALG_COMPRESSION_METHOD": "lz4",
      "WALG_DELTA_MAX_STEPS": "7"
    }
    EOF'

    Здесь:

    • <path_to_postgresql> — путь до корневой директории PostgreSQL, например, /var/lib/pgsql/.

    • <pgdata> — путь до директории с данными PostgreSQL (PGDATA), например, /var/lib/pgsql/16/data/.

    • <pghost> — имя хоста сервера базы данных для подключения. Например, /var/run/postgresql, если подключение происходит через UNIX-сокет.

    • <access_key> — идентификатор ключа доступа к S3-совместимому хранилищу.

    • <secret_key> — секретный ключ доступа к S3-совместимому хранилищу.

    • <aws_endpoint> — URL-адрес для подклчения к S3-совместимому хранилищу, например, http://minio:9000.

    • <aws_region> — код региона, в котором развернуты и выполняются ваши сервисы и функции AWS, например, ru-central1-a.

    • <walg_s3_prefix> — путь до хранилища, в котором будут храниться резервные копии, например, s3://backups/postgresql/wal.

  2. Установите права доступа к файлу .walg.json, выполнив команды:

    chown postgres:postgres /<path_to_postgresql>/.walg.json
    chmod 600 /<path_to_postgresql>/.walg.json

    Здесь:

    • <path_to_postgresql> — путь до корневой директории PostgreSQL, например, /var/lib/pgsql/.

Настройка WAL-архивирования

Чтобы настроить WAL-архивирование:

  1. Откройте файл postgresql.conf.

    Вы можете узнать расположение файла postgresql.conf, выполнив SQL-запрос:

    SHOW config_file
  2. Добавьте в файл следующие строки:

    wal_level = replica
    archive_mode = on
    archive_command = '/usr/local/bin/wal-g wal-push %p'
    archive_timeout = 300
  3. Выполните команду перезапуска PostgreSQL:

    sudo systemctl restart <postgresql>

    Здесь:

    • <postgresql> — название сервиса postgresql, например postgresql или postgresql-16.

    Чтобы точно узнать название сервиса, выполните следующую команду:

    systemctl list-units | grep postgres

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

Чтобы создать резервную копию таблиц PostgreSQL, выполните следующие действия:

  1. Создайте файл скрипта pg-backup.sh в директории /usr/local/bin/ со следующим содержимым:

    #!/bin/bash
    set -euo pipefail
    
    LOG="/var/log/pg-backup.log"
    exec >> "$LOG" 2>&1
    
    echo "=== $(date '+%Y-%m-%d %H:%M:%S') Starting backup ==="
    
    DAY_OF_WEEK=$(date +%u)
    
    if [ "$DAY_OF_WEEK" -eq 1 ]; then
        echo "Creating FULL backup (Monday)"
        sudo -u postgres wal-g backup-push --permanent
    else
        LAST_FULL=$(sudo -u postgres wal-g backup-list --json 2>/dev/null | \
            jq -r '[.[] | select(.backup_name | test("^base_[^_]+$"))] | sort_by(.time) | last | .backup_name // empty')
    
        if [ -z "$LAST_FULL" ]; then
            echo "No FULL backup found, creating FULL"
            sudo -u postgres wal-g backup-push --permanent
        else
            echo "Creating DELTA backup from $LAST_FULL"
            sudo -u postgres wal-g backup-push --delta-from-name="$LAST_FULL"
        fi
    fi
    
    echo "=== $(date '+%Y-%m-%d %H:%M:%S') Backup completed ==="
    
    echo "Cleaning old backups..."
    sudo -u postgres wal-g delete retain FULL 4 --confirm
  2. Выдайте права доступа для созданного файла pg-backup.sh, выполнив команду:

    chmod +x /usr/local/bin/pg-backup.sh
  3. Настройте планировщик Cron для автоматизации резервного копирования, выполнив команду:

    echo '<cron_expression> root /usr/local/bin/pg-backup.sh' | sudo tee /etc/cron.d/pg-backup

    Здесь:

    • <cron_expression> — cron-выражение, определяющее расписание запусков wal-g. Например, 0 2 * * * — резервные копии будут создаваться ежедневно в 02:00.

      Чтобы составить cron-выражение, можно воспользоваться генератором, например, crontab.guru.

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

sudo -u postgres wal-g backup-list

Восстановление из резервной копии

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

Была ли полезна эта страница?

Обратная связь