Backup do PGSQL

De gutocarvalho.net

Crie o arquivo abaixo

#!/bin/bash

#
# SCRIPT para fazer dump dos bancos de dados do PGSQL
# Ele faz dump banco a banco e dump all e envia relatorio por e-mail o relatorio
#

#
# autor: guto@gutocarvalho.net
# data da criacao: 2008-07-23
#

#
# pre-requesitos de pacotes:
#
# psql
# pg_dump
# pg_dumpall
# bzip2
# mail
#

#
# como usar?
# configure as variaveis/constantes internas e execute-o
# ./pgsqlbkp
#
 
#### variaveis/constantes ###########################################################

host="localhost"                # nome do host
user="root"                     # nome de login
pass="senha"                   # senha

server=$(uname -a|awk '{ print $2 }')           # nome do servidor
email="monitoramento@dominio.gov.br"                                # email de destino do relatorio

bk="/backup/cpd/pgsql/dumps"   # diretorio de destino dos dumps
bl="/backup/cpd/pgsql/logs"            # diretorio de destino dos logs

nb="7"          # numero maximo de arquivos de backup a serem mantidos

be="template0|template1|postgres"       # bancos que nao vao entrar no backup

nw=$(date +%Y%m%d.%H%M%S)               # variavel de hora
ln="$bl/pgsql.dumps.$nw.log"            # formato do arquivo de log

_pg_dump=$(which pg_dump)"         # caminho para comando pgsqldump
_pg_dumpall=$(which pg_dumpall)"           # caminho para comando pgsqlldump
_psql=$(which psql)"               # caminho para o comando pgdump

_mail=$(which mail)                   # caminho para comando mail

### verificando se voce é o usuario root ###################################

if [ $(id -u) != "0" ];then
        echo -e "\nErro: este script precisa ser executado com usuario root..."
        echo -e "Ajuda: torne-se root, use o comando (su -) ou (sudo -s -H).\n"
        exit 1
fi

### verifica se as ferramentas do pgsql estao instalados ####################################

if [ ! -x $_pg_dump ];then
        echo -e "\nErro: Este script não conseguiu encontrar o comando pg_dump"
        echo -e "Ajuda: Corrija o caminho na variavel _pg_dump\n"
        exit 1
fi

if [ ! -x $_pg_dumpall ];then
        echo -e "\nErro: Este script não conseguiu encontrar o comando pg_dumpall"
        echo -e "Ajuda: Corrija o caminho na variavel _pg_dumpall\n"
        exit 1
fi

if [ ! -x $_psql ];then
        echo -e "\nErro: Este script não conseguiu encontrar o comando psql"
        echo -e "Ajuda: Corrija o caminho na variavel _pgsql\n"
        exit 1
fi

### verifica se o mailx esta instalado ####################################

if [ ! -x $_mail ];then
        echo "Erro: Este script não conseguiu encontrar o comando mail"
        echo "Ajuda: Corrija o caminho na variavel _mail"
        exit 1
fi

### verificando se existe o diretorio para armazenar os logs #############################
        
        if [ ! -d $bl ]; then
                echo -e "\nErro: o diretorio de logs nao existe!"
                echo -e "Ajuda: ajuste o conteudo da variavel bl\n"
                exit 1
        fi

### verificando se existe o diretorio para armazenar os dumps #############################

        if [ ! -d $bk ]; then
                echo -e "\nErro: o diretorio de destino nao existe!"
                echo -e "Ajuda: ajuste o conteudo da variavel bk\n"
                exit 1
        fi

### funcao de backup ##########################################################

function backup()
{
        echo -e "\nIniciando backup de bancos pgsql... $(date +%Y%m%d.%H%M%S)\n" | tee -a $ln

        echo "Nome do servidor: $server"|tee -a $ln
        echo "O script esta configurado para armazenar os ultimos ( $nb ) dumps..."|tee -a $ln
        echo "O script esta ignorando os seguintes bancos: [ $be ]"|tee -a $ln
        echo "Os bancos estao sendo salvos em: [ $bk ]"|tee -a $ln
        echo -e "Os logs estao sendo salvos em: [ $bl ]\n"|tee -a $ln

        echo "Buscando informacoes no pgsql server..." | tee -a $ln

        # fazendo dump banco a banco no pgsql
        for db in $($_psql --username=$user -h $host -l -t -A | cut -d\| -f1 | egrep -v $be); do
                echo -e "\nefetuando backup do banco: [ $db ]" | tee -a $ln
                # fazendo o dump dos bancos detectados
                $_pg_dump --username=$user -h $host $db | bzip2 -c > $bk/pgsql.$db.$(date +%Y%m%d.%H%M%S).dump.bz2
                echo "arquivo com dump do banco [ $db ] gerado!" | tee -a $ln
                # rotina para limpeza de arquivos antigos
                if [ $(ls -1 $bk/pgsql.$db.*|wc -l) -gt $nb ];then
                        oldfile=$(ls -1 $bk/pgsql.$db.* -r --sort=time|head -1)
                        echo "o arquivo antigo [ $oldfile ] esta sendo apagado..." | tee -a $ln
                        rm $oldfile
                else
                        echo nao existem arquivos antigos a serem limpos... |tee -a $ln
                fi
        
        done

        # fazendo dumpall do pgsql
        echo -e "\nefetuando backup tipo dump all" | tee -a $ln
        $_pg_dumpall -h $host -U $user | bzip2 -c > $bk/pgsql.all-databases.$(date +%Y%m%d.%H%M%S).dump.bz2
        echo "arquivo com o dump all gerado!"
        # rotina para limpeza de arquivos antigos
        if [ $(ls -1 $bk/pgsql.all-databases.*|wc -l) -gt $nb ];then
                oldfile=$(ls -1 $bk/pgsql.all-databases.* -r --sort=time|head -1)
                echo "o arquivo antigo [ $oldfile ] esta sendo apagado..." | tee -a $ln
                rm $oldfile
        else
                echo nao existem arquivos antigos a serem limpos... |tee -a $ln
        fi
        
        # enviando e-mail
        echo -e "\nBackup finalizando em $(date +%Y%m%d.%H%M%S)...\n"|tee -a $ln
        echo -e "Enviando relatorio do dump via e-mail para: $email ...\n" |tee -a $ln
        mail -s "pgsql-dump do servidor ( $server )" $email < $ln

}

### rodando o script

backup

ajuste a permissão

chmod 700 script

agora crie os diretórios de dump e logs e depois ajuste as variáveis do script.

para rodar o script

./script
Ferramentas pessoais