# Резервное копирование и восстановление

Данный раздел описывает способы резервного копирования и восстановления
из резервной копии в Picodata.

## Общие сведения {: #intro }

Объектами резервного копирования в Picodata являются:

- файлы конфигурации, необходимые для запуска кластера Picodata
- данные, которые хранятся на инстансе: копия всех глобальных таблиц БД
  (включая конфигурацию СУБД, БД, хранимые процедуры, пользовательские
  объекты) и часть шардированных таблиц БД (пользовательских таблиц,
  [сегментированных по заданным колонкам])

При резервном копировании мы различаем работу со всем кластером и работу
с отдельными инстансами.

## Копирование всего кластера {: #cluster_backup }

Наиболее предпочтительным является резервное копирование кластера
целиком: это обеспечивает наиболее беспроблемное и консистентное
восстановление СУБД.

Для этой цели в Picodata доступны два способа: с помощью SQL и через
роль Ansible.

### С помощью SQL {: #cluster_backup_sql }

[DDL](../reference/sql/ddl.md)-команда `BACKUP` используется для
создания согласованной, кластерной резервной копии данных:

```sql title="Создание резервной копии"
BACKUP OPTION (TIMEOUT = 3.0);
```

По умолчанию, резервные копии сохраняются в `<instance-dir>/backup`.

См. также:

- [Рабочая директория инстанса](../reference/config.md#instance_instance_dir)

Для восстановления из ранее созданной резервной копии используйте
CLI-команду `picodata restore`:

```shell title="Восстановление из резервной копии"
picodata restore --path <backup-path>
```

Более подробно команда `BACKUP` описана в нашем [Справочнике
SQL](../reference/sql/backup.md).

### С помощью Ansible {: #cluster_backup_ansible }

Для данного метода используйте [роль Picodata для Ansible], где создание
резервной копии и восстановление из нее происходит простым вводом
соответствующей команды:

```shell title="Создание резервной копии"
ansible-playbook -i hosts.yml picodata.yml -t backup
```

```shell title="Восстановление из резервной копии"
ansible-playbook -i hosts.yml picodata.yml -t restore
```

См. также:

- [Развертывание кластера через Ansible](deploy_ansible.md)

## Копирование отдельных инстансов {: #local_backup }

Резервное копирование отдельных инстансов не требуется в том случае,
если в кластере настроена репликация (т.е. значение параметра
`replication_factor` превышает `1`). При выходе из строя одного инстанса,
его данные останутся в кластере на оставшихся инстансах того же
репликасета. Для возврата инстанса в работу потребуется сначала
[исключить его прежний UUID] из репликасета и затем запустить его без
каких-либо данных — после присоединения обратно к репликасету данные
автоматически скопируются на него.

[исключить его прежний UUID]: ../reference/cli.md#expel
[роль Picodata для Ansible]: deploy_ansible.md
[сегментированных по заданным колонкам]: ../overview/glossary.md#sharding

### Создание локальной резервной копии {: #create_local_backup }

При выходе из строя инстанса, данные которого не реплицированы (либо в
ситуации, когда недоступны все реплики в репликасете), кластер может
продолжить работу, однако шардированные данные, хранившиеся на таком
инстансе, не будут доступны. Эти данные, а также данные глобальных
таблиц, овеществляются в виде файлов `*.xlog`, `*.vylog` и `*.snap` в
рабочей директории инстанса. Имея резервную копию этих файлов, можно
перезапустить инстанс под прежним UUID и вернуть его в состав
raft-группы.

Резервное копирование файлов инстанса может быть выполнено
следующей командой:

```shell
rsync -r <instance_dir> <backup_dir>
```

где:

- `<instance_dir>` — рабочая директория инстанса, указанная при запуске в
  параметре [`picodata run --instance-dir`]
- `<backup_dir>` — целевая директория для хранения резервной копии

[`picodata run --instance-dir`]: ../reference/cli.md#run_instance_dir

### Восстановление из локальной резервной копии {: #local_restore }

Восстановление данных инстанса из резервной копии выполняется той же
командой `rsync`, но в обратную сторону:

```shell
rsync -r <backup_dir> <instance_dir>
```

!!! note "Примечание"
    Восстановление из резервной копии следует проводить
    после остановки инстанса, чтобы избежать возможной
    неконсистентности данных.

!!! note "Примечание"
    При работе в защищенной ОС информацию из этого
    раздела следует использовать совместно с документацией ОС. В качестве
    примера см. [Руководство по комплексу средств защиты ОС Альт 8
    СП](https://www.basealt.ru/fileadmin/user_upload/manual/lknv.11100-01-99-03-rukovodstvo-po-ksz.pdf),
    п. 3.6.5. «Пример настройки системы резервного копирования данных».

