Utilizando comandos do PostgreSQL sem digitar senha
João Carlos Ottobboni for Siedos Sistemas e Resultados ・ Mar 21 '21
Enviando mensagens no slack com shell script
João Carlos Ottobboni for Siedos Sistemas e Resultados ・ Mar 21 '21
Agora que você esta pronto, Vamos lá !
Recentemente, precisei criar alguns scripts para implementar backups automatizados para o meu ambiente de produção com o PostgreSQL. Desenvolvi um script de backup no ambiente de produção e salvo o backup no servidor de homologação para posterior restauração.
Usando o cronjob, você possui uma a automatização da execução desses backups . Os scripts produzem os seguintes formatos de backups:
Backup simples: produz uma versão gzip do script SQL
Backup personalizado: produz um arquivo compactado em formato personalizado, adequado para entrada no pg_restore.
Crie o arquivo pg_backup.sh e cole o seguinte conteúdo nele.
#!/bin/bash | |
############################## | |
## POSTGRESQL BACKUP CONFIG ## | |
############################## | |
# Optional hostname to adhere to pg_hba policies. Will default to "localhost" if none specified. | |
HOSTNAME=localhost | |
# Optional username to connect to database as. Will default to "postgres" if none specified. | |
USERNAME=postgres | |
# This dir will be created if it doesn't exist. This must be writable by the user the script is | |
# running as. | |
BACKUP_DIR=/home/jcottobboni/backups/database/postgresql/ | |
SUFFIX="-daily" | |
FINAL_BACKUP_DIR=$BACKUP_DIR"`date +\%Y-\%m-\%d`$SUFFIX/" | |
# Database name to backup | |
DATABASE=db_name | |
# Will produce a custom-format backup if set to "yes" | |
ENABLE_CUSTOM_BACKUPS=yes | |
# Will produce a gzipped plain-format backup if set to "yes" | |
ENABLE_PLAIN_BACKUPS=yes | |
#### SETTINGS FOR ROTATED BACKUPS #### | |
# Number of days to keep daily backups | |
DAYS_TO_KEEP=15 | |
#### SETTINGS FOR COPY BACKUPS #### | |
STAGING_ADDRESS='user@ip' | |
STAGING_FOLDER="$FINAL_BACKUP_DIR" | |
########################### | |
### INITIALISE DEFAULTS ### | |
########################### | |
if [ ! $HOSTNAME ]; then | |
HOSTNAME="localhost" | |
fi; | |
if [ ! $USERNAME ]; then | |
USERNAME="postgres" | |
fi; | |
########################### | |
#### START THE BACKUPS #### | |
########################### | |
function perform_backups() | |
{ | |
./slack-cli chat send "Starting backup to database ${DATABASE}" '##slack-channel-name' | |
echo "Making backup directory in $FINAL_BACKUP_DIR" | |
if ! mkdir -p $FINAL_BACKUP_DIR; then | |
echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2 | |
exit 1; | |
fi; | |
echo -e "\n\nPerforming full backup of $DATABASE" | |
echo -e "--------------------------------------------\n" | |
if [ $ENABLE_PLAIN_BACKUPS = "yes" ] | |
then | |
echo "Plain backup of $DATABASE" | |
if ! pg_dump -Fp -h $HOSTNAME -U $USERNAME $DATABASE | gzip > $FINAL_BACKUP_DIR$DATABASE.sql.gz.in_progress; then | |
echo "[!!ERROR!!] Failed to produce plain backup database $DATABASE" 1>&2 | |
else | |
mv $FINAL_BACKUP_DIR$DATABASE.sql.gz.in_progress $FINAL_BACKUP_DIR$DATABASE.sql.gz | |
fi | |
fi | |
if [ $ENABLE_CUSTOM_BACKUPS = "yes" ] | |
then | |
echo "Custom backup of $DATABASE" | |
if ! pg_dump -Fc -h $HOSTNAME -U $USERNAME $DATABASE -f $FINAL_BACKUP_DIR$DATABASE.custom.in_progress; then | |
echo "[!!ERROR!!] Failed to produce custom backup database $DATABASE" | |
else | |
mv $FINAL_BACKUP_DIR$DATABASE.custom.in_progress $FINAL_BACKUP_DIR$DATABASE.custom | |
fi | |
fi | |
./slack-cli chat send "Finishing Backup Production for database: ${DATABASE}" '#slack-channel-name' | |
echo -e "\nDatabase backup complete!" | |
} | |
function copy_backups_to_staging_server() | |
{ | |
echo "Making backup directory in $FINAL_BACKUP_DIR on Staging Server" | |
if ! ssh $STAGING_ADDRESS "mkdir -p $FINAL_BACKUP_DIR"; then | |
echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2 | |
exit 1; | |
fi; | |
scp $FINAL_BACKUP_DIR$DATABASE.sql.gz $STAGING_ADDRESS:$STAGING_FOLDER | |
} | |
# DAILY BACKUPS | |
# Delete daily backups older than DAYS_TO_KEEP | |
find $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec rm -rf '{}' ';' | |
perform_backups | |
copy_backups_to_staging_server |
Agora precisamos conceder ao script permissão de execução
chomd +x pg_backup.sh
Os comando scp envia uma cópia do backup para outro servidor, neste exemplo, envio para o meu servidor de homologação para manter uma copia atual todos os dias em homologação, além da redundância ao guardar o arquivo sempre que preciso restaurar a base de homologação ja tenho um arquivo no servidor, mas você pode enviar para qualquer máquina que desejar, para este comando funcionar sem a necessidade de digitar a senha, é necessário copiar sua chave ssh para o servidor com este comando:
ssh-copy-id -i ~/.ssh/id_rsa.pub 'user'@'server-address-or-ip'
Por último para que esse backup seja executado automaticamente precisamos criar uma entrada no agendador de tarefas do linux, digite o comando para abrir o crontab:
crontab -e
Agora insira esta linha no arquivo
# PostgreSQL Backup
00 00 * * * /path/to/script/pg_backup.sh
Top comments (0)