﻿# Резервное копирование и восстановление баз данных с помощью WAL-G и Rclone 

> [HTML Version](backup-and-recovery-with-wal-g-and-rclone.html)

Вы можете настроить резервное копирование и восстановление данных ELMA365 с помощью следующих программ:

- WAL-G — это утилита для создания резервных копий и восстановления баз данных, которая поддерживает несколько СУБД, включая [PostgreSQL](#wal-g-in-postgres) и [MongoDB](#wal-g-in-mongo).  
  
Она использует механизм непрерывного архивирования (Continuous Archiving) и точки восстановления (Point-in-Time Recovery, PITR) для обеспечения надёжной архивации и восстановления данных.  
  
WAL-G поддерживает хранение резервных копий в различных облачных хранилищах, таких как Amazon S3, Google Cloud Storage, Azure Blob Storage и других;

- [Rclone](#rclone) — это многопоточная программа с открытым исходным кодом и командной строкой для управления контентом. Позволяет переносить данные в облако и другие хранилища. 

В статье описан процесс резервного копирования и восстановления PostgreSQL 15 и MongoDB 6 в ОС Ubuntu Linux 22.04.

## Настройка WAL-G для PostgreSQL

С помощью WAL-G вы можете:

- выполнить резервное копирование данных;

- [восстановить данные из резервной копии](#psql-restore).

### Резервное копирование для PostgreSQL

Для резервного копирования данных с помощью WAL-G выполните следующие действия:

1. Предварительно установите WAL-G с [официального GitHub-репозитория](https://github.com/wal-g/wal-g):

````
wget https://github.com/wal-g/wal-g/releases/download/v3.0.5/wal-g-pg-ubuntu-22.04-amd64.tar.gz  
tar -xzf wal-g-pg-ubuntu-22.04-amd64.tar.gz   
sudo mv wal-g-pg-ubuntu-22.04-amd64 /usr/local/bin/wal-g-pg

2. ````
Настройте переменные окружения для доступа к облачному хранилищу. Для этого откройте файл конфигурации \[OBJECT\] и добавьте следующие параметры:

````
\{  
"WALG\_S3\_PREFIX": "s3://elma365-backup/postgres",  
"AWS\_ENDPOINT": "https://storage.yandexcloud.net",  
"AWS\_ACCESS\_KEY\_ID": "<your-access-key-id>",  
"AWS\_SECRET\_ACCESS\_KEY": "<your-secret-access-key>",  
"AWS\_REGION": "us-east-1",  
"AWS\_S3\_FORCE\_PATH\_STYLE": "true",  
"WALG\_COMPRESSION\_METHOD": "brotli",  
"WALG\_DELTA\_MAX\_STEPS": "6",  
"PGHOST": "/var/run/postgresql",  
"PGDATA": "/var/lib/postgresql/15/main",  
"PGSSLMODE": "disable"  
\}

````
Где:

- \[OBJECT\]  — путь к хранилищу S3, где будут храниться резервные копии и **.WAL**-файлы (Write-Ahead Logs);

- \[OBJECT\] — точка доступа (endpoint) для S3-совместимого хранилища;

- \[OBJECT\] — идентификатор ключа доступа (Access Key ID) для аутентификации в S3-совместимом хранилище;

- \[OBJECT\] — секретный ключ (Secret Access Key) для аутентификации в S3-совместимом хранилище;

- \[OBJECT\] — регион, в котором находится S3-совместимое хранилище;

- \[OBJECT\]  — указывает, что нужно использовать path-style для доступа к S3-бакетам;

- \[OBJECT\]  — метод сжатия, используемый для резервных копий. В данном случае используется алгоритм \[OBJECT\], который обеспечивает хорошее соотношение между степенью сжатия и скоростью;

- \[OBJECT\]  — максимальное количество шагов (delta steps), которые WAL-G может использовать для постепенно увеличивающихся (дельта) резервных копий. Позволяет экономить место, храня только изменения между резервными копиями;

- \[OBJECT\] — путь к сокету PostgreSQL, через который WAL-G будет подключаться к базе данных. Используется для выполнения команд, требующих подключения к PostgreSQL;

- \[OBJECT\] — путь к каталогу данных PostgreSQL. WAL-G использует этот параметр для определения, где находятся данные PostgreSQL, чтобы корректно выполнять резервное копирование и восстановление;

- \[OBJECT\] — указывает, что SSL/TLS-шифрование для подключения к PostgreSQL отключено. Это может быть полезно для локальных подключений, где шифрование не требуется.

3. Измените владельца файла:

````
chown postgres: /etc/postgresql/15/main/.walg.json

4. ````
Чтобы использовать WAL-G, настройте PostgreSQL для работы с непрерывным архивированием. Для этого откройте файл конфигурации \[OBJECT\] и добавьте следующие параметры:

````
archive\_mode = on  
archive\_timeout = 600s  
archive\_command = '/usr/local/bin/wal-g-pg wal-push "%p" --config /etc/postgresql/15/main/.walg.json >> /var/log/postgresql/archive\_command.log 2>\&1'  
wal\_level = replica  
restore\_command = '/usr/local/bin/wal-g-pg wal-fetch "%f" "%p" --config /etc/postgresql/15/main/.walg.json >> /var/log/postgresql/restore\_command.log 2>\&1'

5. ````
Для создания полной резервной копии базы данных выполните команду:

````
sudo -u postgres /usr/local/bin/wal-g-pg backup-push --config /etc/postgresql/15/main/.walg.json /var/lib/postgresql/15/main/

### ````
Восстановление данных для PostgreSQL

**Важно**: восстановление из резервной копии должно производиться в пустую базу данных. Предварительно убедитесь, что у вас есть резервная копия удаляемой БД. Только после этого приступайте к удалению. Подробнее о подготовке к восстановлению читайте в статье [«PostgreSQL»](postgresql.md#prepare-to-recovery).

Для восстановления базы данных из резервной копии с помощью WAL-G: 

1. Остановите PostgreSQL, если он запущен:

````
sudo systemctl stop postgresql

2. ````
Переместите или удалите содержимое директории \[OBJECT\]:

````
sudo mv /var/lib/postgresql/15/main /var/lib/postgresql/15/main\_old

3. ````
Создайте пустую директорию для восстановления:

````
sudo mkdir /var/lib/postgresql/15/main  
sudo chown postgres:postgres /var/lib/postgresql/15/main

4. ````
Для просмотра списка резервных копий баз данных выполните команду:

````
sudo -u postgres /usr/local/bin/wal-g-pg backup-list --config /etc/postgresql/15/main/.walg.json

5. ````
Выполните команду восстановления:

````
sudo -u postgres /usr/local/bin/wal-g-pg backup-fetch /var/lib/postgresql/15/main LATEST --config /etc/postgresql/15/main/.walg.json

````
Здесь \[OBJECT\] указывает на последнюю резервную копию. Вы также можете ввести наименование нужной копии, полученной из списка на предыдущем шаге, например, **base\_000000010000000000000009**.

6. Запустите PostgreSQL:

````
sudo systemctl start postgresql

## ````
Настройка WAL-G для MongoDB

С помощью WAL-G вы можете:

- выполнить резервное копирование данных;

- [восстановить данные из резервной копии](#mongo-restore).

### Резервное копирование для MongoDB

Для резервного копирования данных с помощью WAL-G выполните следующие действия:

1. Предварительно установите WAL-G с [официального GitHub-репозитория](https://github.com/wal-g/wal-g):

````
wget https://github.com/wal-g/wal-g/releases/download/v3.0.5/wal-g-mongo-ubuntu-22.04-amd64.tar.gz  
tar -xzf wal-g-mongo-ubuntu-22.04-amd64.tar.gz  
sudo mv wal-g-mongo-ubuntu-22.04-amd64 /usr/local/bin/wal-g-mongo

2. ````
Настройте переменные окружения для доступа к облачному хранилищу. Откройте файл конфигурации \[OBJECT\] и добавьте следующие параметры:

````
\{  
"WALG\_S3\_PREFIX": "s3://elma365-backup/mongo",  
"AWS\_ENDPOINT": "https://storage.yandexcloud.net",  
"AWS\_ACCESS\_KEY\_ID": "<your-access-key-id>",  
"AWS\_SECRET\_ACCESS\_KEY": "<your-secret-access-key>",  
"AWS\_REGION": "us-east-1",  
"AWS\_S3\_FORCE\_PATH\_STYLE": "true",  
"WALG\_COMPRESSION\_METHOD": "brotli",  
"MONGODB\_URI": "mongodb://superuser:SecretPassword@mongodb-server.your\_domain:27017/?authSource=admin\&connect=direct\&socketTimeoutMS=60000\&connectTimeoutMS=10000",  
"WALG\_STREAM\_CREATE\_COMMAND": "mongodump --archive --oplog --uri='mongodb://superuser:SecretPassword@mongodb-server.your\_domain:27017/?authSource=admin\&connectTimeoutMS=10000'",  
"WALG\_STREAM\_RESTORE\_COMMAND": "mongorestore --archive --oplogReplay --uri='mongodb://superuser:SecretPassword@mongodb-server.your\_domain:27017/?authSource=admin\&connectTimeoutMS=10000'"  
\}

````
Где:

- \[OBJECT\] — путь к S3, где будут храниться резервные копии и **.WAL**-файлы (Write-Ahead Logs);

- \[OBJECT\] — точка доступа (endpoint) для S3-совместимого хранилища;

- \[OBJECT\] — идентификатор ключа доступа (Access Key ID) для аутентификации в S3-совместимом хранилище;

- \[OBJECT\] — секретный ключ (Secret Access Key) для аутентификации в S3-совместимом хранилище;

- \[OBJECT\] — регион, в котором находится S3-совместимое хранилище;

- \[OBJECT\] — указывает, что нужно использовать path-style для доступа к S3-бакетам;

- \[OBJECT\] — метод сжатия, используемый для резервных копий. В данном случае используется алгоритм \[OBJECT\], который обеспечивает хорошее соотношение между степенью сжатия и скоростью;

- \[OBJECT\] — URI для подключения к MongoDB;

- \[OBJECT\] — команда, используемая WAL-G для создания резервной копии MongoDB;

- \[OBJECT\] — команда, используемая WAL-G для восстановления резервной копии MongoDB.

3. Для создания полной резервной копии баз данных выполните команду:

````
/usr/local/bin/wal-g-mongo backup-push --config /home/user/.walg.json

4. ````
Для просмотра списка резервных копий баз данных выполните команду:

````
/usr/local/bin/wal-g-mongo backup-list --config /home/user/.walg.json

### ````
Восстановление данных для MongoDB

**Важно**: восстановление из резервной копии должно производиться в пустую базу данных. Предварительно убедитесь, что у вас есть резервная копия удаляемой базы данных. Только после этого приступайте к удалению БД. Подробнее о подготовке к восстановлению читайте в статье [«MongoDB»](mongodb.md#prepare-to-recovery).

Чтобы восстановить базу данных из резервной копии, используйте команду:

````
/usr/local/bin/wal-g-mongo backup-fetch LATEST --config /home/user/.walg.json

````
Здесь \[OBJECT\] указывает на последнюю резервную копию. Вы также можете указать наименование нужной копии, полученной из списка на предыдущем шаге, например, **stream\_20250214T093724Z**.

## Настройка Rclone

1. Установите Rclone с помощью команды:

````
sudo -v ; curl https://rclone.org/install.sh | sudo bash

2. ````
Настройте Rclone для работы с S3:

1. Запустите команду для настройки нового S3-хранилища:

````
rclone config

2. ````
В открывшемся окне выберите опцию **n** для создания нового хранилища.

3. Введите имя для вашего хранилища. Например **source-s3** для исходного хранилища и **backup-s3** для целевого.

4. Выберите тип хранилища **s3**. 

5. Выберите провайдера **Other**.  

6. Введите параметры доступа к вашему S3-хранилищу:

- \[OBJECT\] — ваш идентификатор ключа доступа;

- \[OBJECT\] — ваш секретный ключ;

- \[OBJECT\] — регион вашего S3-хранилища;

- \[OBJECT\] — точка доступа S3-хранилища.

7. Повторите шаги для настройки второго S3-хранилища.

3. Скопируйте данные из одного S3-хранилища в другое с помощью команды \[OBJECT\]:

````
rclone copy source-s3:bucket-name/path backup-s3:backup-bucket-name/path -v --ignore-errors --fast-list --checksum

````
Где:

- \[OBJECT\] — имя удалённого хранилища, настроенного для исходного S3;

- \[OBJECT\] — имя бакета и путь к данным в исходном хранилище;

- \[OBJECT\] — имя удалённого хранилища, настроенного для целевого S3;

- \[OBJECT\] — имя бакета и путь для резервной копии в целевом хранилище;

- \[OBJECT\] — включает подробный вывод (verbose mode);

- \[OBJECT\] — игнорирует ошибки, возникающие во время выполнения команды;

- \[OBJECT\] — ускоряет процесс создания списка файлов и директорий, особенно при работе с облачными хранилищами, такими как S3, Google Drive и другими;

- \[OBJECT\] — включает проверку контрольных сумм (хешей) файлов при копировании или синхронизации.