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

