Como agendar um backup automático do PostgreSQL no Cron evitando o problema de senha

Este artigo mostra como agendar um backup automático do PostgreSQL no Cron evitando o problema de senha, ou seja, como fazer o pg_dump ser executado no Cron (crontab -e) e não solicitar senha. Outro problema que acontece também é quando o Cron executa o comando pg_dump, mas salva um arquivo de backup em branco, isso é devido a permissão que veremos adiante.

[ Hits: 3.758 ]

Por: Buckminster em 06/02/2024


Criando a linha no cron



Criando os diretórios (lembre do sudo se for o caso):

# mkdir /home/usuario/bkpBD

(crie onde ficar melhor para você e dê o nome que quiser)

# chmod 755 /home/usuario/bkpBD
# mkdir /home/usuario/logs
# chmod 755 /home/usuario/logs

# crontab -e

Coloque no final do arquivo a seguinte linha adaptando para o teu usuário, banco de dados, etc:

40 2 * * * /usr/bin/pg_dump -U postgres -f /home/usuario/bkpBD/perdido.sql perdido >> /home/usuario/logs/perdido.sql.log || tail -1 /home/usuario/logs/perdido.sql.log | mailx 'teuemail@gmail.com' -s "Falha no backup do banco!"

Salve e saia do arquivo.

Na linha acima estamos dizendo para fazer um backup todo dia às 02:40 horas da madrugada no diretório /home/usuario/bkpBD salvando o arquivo de backup com o nome perdido.sql.

Os comandos após os sinais de ">>" dizem para salvar um arquivo de log em /home/usuario/bkpBD com o nome de perdido.sql.log e, caso o backup falhar, os dois pipes (||) dizem para executar o próximo comando somente se o anterior falhar, então será acrescentada uma linha (tail -1) com o log do erro no mesmo arquivo e será enviada a mensagem entre aspas para o e-mail indicado.

Caso o backup der certo não será enviada mensagem nenhuma, pois não é necessário.

Para fazer um backup no terminal basta o seguinte comando:

# /usr/bin/pg_dump -U postgres -f /home/usuario/bkpBD/perdido.sql perdido

Será pedida a senha do usuário postgres.

Na linha acima estamos criando um backup completo do banco inteiro com schemas, tabelas, dados, etc, no formato de texto simples/plano.

Prefira esse formato e prefira fazer backups e restores pela linha de comando, pois caso você trabalhar também com o PgAdmin4 evitará o problema de versões (uma versão do PgAdmin não faz o restore feito pelo backup de outra, dependendo da versão).

Caso quiser colocar no Cron somente a linha:

40 2 * * * /usr/bin/pg_dump -U postgres -f /home/usuario/bkpBD/perdido.sql perdido

o backup também será executado, mas não fará log em caso de erro. Você pode também criar seu próprio script de backup e chamá-lo no Cron.

Para fazer um restore desse backup do comando acima no terminal:

# psql -U postgres perdido < perdido.sql

Restore no Windows:

C:> psql -U postgres -d perdido -f C:\Users\Usuario\Desktop\perdido.sql

Na linha acima você coloca o caminho onde salvou o arquivo de backup.

psql: use para restaurar a partir de um arquivo de script SQL de texto simples criado usando pg_dump com formato de texto simples, veja os formatos abaixo.

pg_restore: use para restaurar de um arquivo .tar, diretório ou formato personalizado criado usando pg_dump.

Exemplo com pg_dump e pg_restore:

# pg_dump -U postgres -f perdido.dump perdido -Fc
# pg_restore -d perdido /home/usuario/bkpBD/perdido.dump -c -U postgres

# pg_dump -U postgres -f perdido.tar perdido -Ft
# pg_restore -d perdido /home/usuario/bkpBD/perdido.tar -c -U postgres

Formatos possíveis de serem usados com pg_dump (tirado da documentação oficial do PostgreSQL):

-F format --format=format

p plain Produz um arquivo de script SQL de texto simples (o padrão). Backups com esse formato (-Fp ou --format=plain ou sem indicação nenhuma de formato) devem ser restaurados somente com psql.

Veja bem, não confunda o -f (minúsculo; file, arquivo) da linha "/usr/bin/pg_dump -U postgres -f /home/usuario/bkpBD/perdido.sql perdido" com o -F (maiúsculo) que indica o formato.

c custom Produz um arquivo em formato personalizado adequado para entrada em pg_restore. Juntamente com o formato de saída do diretório, este é o formato de saída mais flexível, pois permite a seleção manual e a reordenação de itens arquivados durante a restauração. Este formato é compactado por padrão.

d directory Produz um arquivo em formato de diretório adequado para entrada em pg_restore. Criará um diretório com um arquivo para cada tabela e objeto grande sendo despejado, além de um arquivo de índice que descreve os objetos despejados em um formato legível para o pg_restore.

Um arquivo em formato de diretório pode ser manipulado com ferramentas Unix padrão; por exemplo, os arquivos em um arquivo descompactado podem ser compactados com as ferramentas gzip, lz4 ou zstd. Este formato é compactado usando o padrão gzip e também oferece suporte a dumps paralelos.

t tar Produz um arquivo em formato .tar adequado para entrada em pg_restore. O formato tar é compatível com o formato de diretório: extrair um arquivo no formato tar produz um arquivo válido no formato de diretório. No entanto, o formato tar não oferece suporte à compactação. Além disso, ao usar o formato tar, a ordem relativa dos itens de dados da tabela não pode ser alterada durante a restauração.

Outras explicações

localhost:5432:perdido:postgres:123456 "localhost" é a própria máquina (127.0.0.1), "5432" é a porta onde o Postgres está escutando, "perdido" é o nome do banco de dados e "123456" é a senha, adapte para as suas necessidades. Nesses arquivos .pgpass você pode colocar várias linhas caso tiver vários usuários e/ou bancos de dados, uma linha para cada usuário e/ou banco de dados e portas diferentes, se for o caso.

Pode colocar até uma linha assim:

# IPV4
localhost:*:*:sergtsop:senha_sergtsop

Essa linha acima diz que o usuário sergtsop está liberado para conectar em localhost em qualquer banco e qualquer porta. Caso for conexão remota é só alterar para o IP correspondente, por exemplo:

192.168.10.123:*:*:sergtsop:senha_sergtsop

#IPV6
\:\:1:*:*:sergtsop:senha_sergtsop

RESUMÃO

su -
# vim ~/.pgpass

Coloque dentro a seguinte linha adaptando para tuas necessidades:

localhost:5432:perdido:postgres:123456

Salve e saia do arquivo.

# chmod 600 ~/.pgpass

Veja bem, a permissão 600 é estritamente necessária, senão o arquivo será ignorado.

# mkdir /home/usuario/bkpBD
(crie onde ficar melhor para você e dê o nome que quiser)

# chmod 755 /home/usuario/bkpBD
# mkdir /home/usuario/logs
# chmod 755 /home/usuario/logs
# crontab -e

40 2 * * * /usr/bin/pg_dump -U postgres -f /home/usuario/bkpBD/perdido.sql perdido >> /home/usuario/logs/perdido.sql.log || tail -1 /home/usuario/logs/perdido.sql.log | mailx 'teuemail@gmail.com' -s "Falha no backup do banco!"

Salve e saia do arquivo.

Teste mudando o horário, na linha acima, de "40 2" para um horário próximo ao que você está (veja com o comando date no terminal) e aguarde para ver no diretório indicado se o backup foi criado, depois deixe o horário de backup que ficar melhor para você.

O método com o .pgpass é bastante seguro, pois se alguém conseguir invadir teu servidor para ver a senha dentro do .pgpass é porque a vaca já foi para o brejo, mas recomendo utilizar .pgpass somente para backups no próprio servidor (localhost). É fortemente recomendado fazer backups em HDs/SSDs/Storages diferentes.

Outra solução para evitar o problema de senha no Cron é criar um usuário só para fazer dump com o método de autenticação no mínimo md5 no arquivo pg_hba.conf. Porém, esse método não é recomendado por questões de segurança, por questões físicas e envolve bastante conhecimento.

Faça sempre o backup no próprio servidor, compacte (com proteção) e envie para onde precisar usando sftp ou outro meio criptografado. O dump compactado certamente fica muito menor e ainda terá proteção, uma vez que é texto puro.

Evite fazer backups remotamente, mas caso for imprescindível, automatize o backup local, crie um script para compactar o backup e enviá-lo por sftp, ssh, etc. Banco de dados não é para ficar circulando por aí.

Não abordarei este método, pois é fortemente não recomendado, mas para fins didáticos darei umas dicas.

No link abaixo você encontra como alterar o pg_hba.conf, sugiro fazer o que está no link e depois criar o novo usuário e acrescentá-lo no pg_hba.conf para agendar no Cron com o comando crontab -e:
Não me responsabilizo se, por acaso, você não saiba o que está fazendo.

Sugiro você dar uma estudada antes, mas como eu recomendei: prefira o método com o arquivo .pgpass e backups locais.

Criando um novo usuário no PostgreSQL (para versão 12 e acima):

# createuser -D -P -R -S backdump

(dê o nome da sua preferência)

Opções: -D não pode criar novos bancos de dados -P atribui uma senha -R não pode criar novas regras -S não será superusuário (root) O usuário deverá ser criado somente para o fim específico de fazer backup por questões de segurança, inclusive backup remoto.

E depois altere o pg_hba.conf.

# find / | grep pg_hba.conf
(encontrando o caminho do arquivo)

# cd /etc/postgresql/15/main
# vim pg_hba.conf

(usei o vim, use teu editor de texto preferido)

O backup remoto ainda tem o problema de rotas, firewall, etc.

Depois, dependendo, você terá de criar umas regras como usuário postgres (ou outro superusuário do banco) permitindo o usuário backdump fazer backup, algo como:

GRANT CONNECT ON DATABASE "perdido" to backdump;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO backdump;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO backdump;

Não me responsabilizo se, por acaso, você não saiba o que está fazendo. Sugiro você dar uma estudada antes, mas como eu recomendei: prefira o método com o arquivo .pgpass e backups locais. É mais simples de configurar e mais seguro em vários aspectos.

Referências


Página anterior    

Páginas do artigo
   1. Backup automático com Postgres e Cron
   2. Criando a linha no cron
Outros artigos deste autor

Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg

Como um monte de letras de um código fonte transforma-se em voltagens?

Compilação do Kernel

Encapsulando BIND 9 e Apache 2 para obter maior segurança

Como ter o ChatGPT no seu site em PHP

Leitura recomendada

Instalando e Configurando o pgAgent no Linux (pgAdmin e PostgreSQL)

Unificando bases de dados com Schemas

Encoding do Postgres (latin1) e encoding do SO (Debian/Ubuntu)

Postgres e os Sistemas Alterdata

Automação comercial livre no Slackware 12

  
Comentários
[1] Comentário enviado por maurixnovatrento em 07/02/2024 - 18:31h


Muito bom artigo.

______________________________________________________________________
Inscreva-se no meu Canal: https://www.youtube.com/@LinuxDicasPro
Repositório GitHub do Canal: https://github.com/LinuxDicasPro
Grupo do Telegram: https://t.me/LinuxDicasPro
Meu GitHub Pessoal: https://github.com/mxnt10

[2] Comentário enviado por amarildosertorio em 12/02/2024 - 11:51h

Sugestão pra backup e restore do PostgreSQL - Barman (Backup and Recovery Manager)

https://tureba.org/postgresql-barman.html


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts