postgresql postgres backup barman

Barman

O Barman é uma ferramenta de backup completa desenvolvida pela 2ndQuadrant. Ele é capaz de fazer backups completos e incrementais, comprimidos, gestão de política de retenção de backups, expurgo automático de segmentos de WAL antigos, entre outras funcionalidades. Também tem boa integração com o repmgr.

A configuração é sobre arquivos estilo ini em /etc/barman.conf e /etc/barman.d, com ; (ponto-e-vírgula) iniciando comentários. É comum criar um arquivo de configuração para cada instância, por exemplo com a instância 'app' identificada pela seção [app] do arquivo /etc/barman.d/app.conf:

[app]

; como o barman consegue acessar a máquina original por ssh
ssh_command = ssh postgres@pg-1.local

; como o barman consegue acessar a máquina original por postgres
conninfo = host=pg-1.local user=barman dbname=postgres

; modo de backup (concorrente, por rsync e com deduplicação)
backup_options = concurrent_backup
backup_method = rsync
reuse_backup = link

; cria um restore_command na restauração usando barman-wal-restore
recovery_options = 'get-wal'

; aceita arquivamento por barman-cli
archiver = on

; aceita arquivamento por pg_receivewal
streaming_conninfo = host=pg-1.local user=barman
streaming_archiver = on
slot_name = barman

; política de retenção - os últimos 2 backups válidos são mantidos
retention_policy = REDUNDANCY 2
; política de retenção - backups válidos que restauram ao menos os últimos 5 dias são mantidos
; retention_policy = RECOVERY WINDOW OF 5 DAYS

; caminho para os binários da versão do PostgreSQL
path_prefix = "/usr/pgsql-16/bin"

Sobre as configurações:

Comandos

Todos os comandos do Barman aceitam o nome da instância como primeiro argumento ('app', como no exemplo). Em alguns, como 'check' e 'backup', é possível usar 'all' para indicar que a operação deve ser aplicada a todas as instâncias configuradas no Barman.

Check

O comando barman check faz uma validação das configurações e mostra um relatório listando problemas:

[barman@pg-a ~]$ barman check app
Server app:
        PostgreSQL: OK
        is_superuser: OK
        PostgreSQL streaming: OK
        wal_level: OK
        replication slot: OK
        directories: OK
        retention policy settings: OK
        backup maximum age: OK (no last_backup_maximum_age provided)
        compression settings: OK
        failed backups: OK (there are 0 failed backups)
        minimum redundancy requirements: OK (have 0 backups, expected at least 0)
        ssh: OK (PostgreSQL server)
        systemid coherence: OK (no system Id stored on disk)
        pg_receivexlog: OK
        pg_receivexlog compatible: OK
        receive-wal running: OK
        archive_mode: OK
        archive_command: OK
        continuous archiving: OK
        archiver errors: OK

Mais detalhes sobre cada erro podem ser encontrados no log /var/log/barman/barman.log.

Backup

O comando barman backup é usado para gerar um novo backup da instância:

[barman@pg-a ~]$ barman backup app
Starting backup using rsync-concurrent method for server app in /var/lib/barman/app/base/20240530T013618
Backup start at LSN: 0/3000028 (000000010000000000000003, 00000028)
This is the first backup for server app
WAL segments preceding the current backup have been found:
        000000010000000000000001 from server app has been removed
Starting backup copy via rsync/SSH for 20240530T013618
Copy done (time: 2 seconds)
This is the first backup for server app
Asking PostgreSQL server to finalize the backup.
Backup size: 31.0 MiB. Actual size on disk: 31.0 MiB (-0.00% deduplication ratio).
Backup end at LSN: 0/3000138 (000000010000000000000003, 00000138)
Backup completed (start time: 2024-05-30 01:36:19.040241, elapsed time: 5 seconds)
Processing xlog segments from streaming for app
        000000010000000000000002
Processing xlog segments from file archival for app
        000000010000000000000002
        000000010000000000000003
        000000010000000000000003.00000028.backup

Backups podem ser listados com barman list-backup:

[barman@pg-a ~]$ barman list-backup app
app 20240530T013618 - Sat May 30 01:36:22 2024 - Size: 47.0 MiB - WAL Size: 0 B

O Barman não agenda backups, mas podemos gerar backups periodicamente agendando no crontab, pelo usuário barman: 0 0 * * * barman backup all.

Restauração

Para restaurar um backup na mesma máquina de origem, forneça o nome da instância, o identificador do backup (ou 'latest' para restaurar o mais recente) e o caminho de destino no servidor remoto:

[barman@pg-a ~]$ barman recover app 20240530T013618 16/data_restaurado

Para restaurar o backup em outra máquina, forneça também o ssh_command:

[barman@pg-a ~]$ barman recover app latest 16/data --remote-ssh-command 'ssh postgres@pg-2.local'

Arquivamento

A forma ideal de fazer o arquivamento de segmentos de WAL é com um comando que garante a escrita em disco no destino. O Barman traz um comando barman-wal-archive para esse arquivamento (e outro de restauração barman-wal-restore). É necessário informar o hostname ou IP da máquina do barman, seguido do nome da instância, como reconhecida pelo Barman, assim como o caminho para o segmento a ser arquivado (%p). Por exemplo:

archive_command = 'barman-wal-archive pg-a.local app %p'

Prática

Instale e configure o Barman na máquina pg-a, obtendo um backup da máquina pg-1 e restaurando na máquina pg-2. Configure o arquivamento dos segmentos e o envio de WAL por streaming com slot de replicação: