Резервное копирование PostgreSQL без Backup Wrapper
Система использует СУБД PostgreSQL для хранения конфигураций сервисов. Резервная копия базы данных системы может понадобиться для ее восстановления после сбоя или переноса на другое оборудование.
В данном разделе описано, как производить резервное копирование СУБД PostgreSQL с помощью утилиты wal-g.
| Дополнительно с возможностями утилиты wal-g вы можете ознакомиться в официальной документации. |
| Все действия необходимо производить на физическом сервере или виртуальной машине, на которых развернута база данных PostgreSQL. |
Требования
-
Актуальная версия базы данных PostgreSQL.
-
S3-совместимое хранилище для хранения резервных копий, например: MinIO, AWS S3, Yandex Object Storage.
Установка и настройка утилиты wal-g
Установка и настройка утилиты состоит из следующих этапов:
Установка утилиты wal-g
Чтобы установить утилиту wal-g:
-
Скачайте и разархивируйте дистрибутив программы 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. Рекомендуется использовать данный вариант установки. -
Установите утилиту wal-g, выполнив команды:
mv wal-g /usr/local/bin/ chmod +x /usr/local/bin/wal-g
|
Также вы можете установить утилиту wal-g из официального источника, выполнив команды:
Здесь:
|
Настройка подключения к S3-совместимому хранилищу
Чтобы настроить подключение к S3-совместимому хранилищу:
-
Создайте файл конфигурации
.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.
-
-
Установите права доступа к файлу
.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-архивирование:
-
Откройте файл
postgresql.conf.Вы можете узнать расположение файла
postgresql.conf, выполнив SQL-запрос:SHOW config_file -
Добавьте в файл следующие строки:
wal_level = replica archive_mode = on archive_command = '/usr/local/bin/wal-g wal-push %p' archive_timeout = 300 -
Выполните команду перезапуска PostgreSQL:
sudo systemctl restart <postgresql>Здесь:
-
<postgresql>— название сервиса postgresql, напримерpostgresqlилиpostgresql-16.
Чтобы точно узнать название сервиса, выполните следующую команду:
systemctl list-units | grep postgres -
Резервное копирование
Чтобы создать резервную копию таблиц PostgreSQL, выполните следующие действия:
-
Создайте файл скрипта
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 -
Выдайте права доступа для созданного файла
pg-backup.sh, выполнив команду:chmod +x /usr/local/bin/pg-backup.sh -
Настройте планировщик 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.
-
|
Вы можете проверить список созданных резервных копий, выполнив команду:
|
Восстановление из резервной копии
Восстановление из резервной копии описано в разделе Восстановление из резервных копий.
Была ли полезна эта страница?