Postgresql – Backup de todas as base de dados

postgresql

Motivado por esse post ( http://www.vivaolinux.com.br/dica/PostgreSQL-Fazendo-backup-de-um-servidor-inteiro ) resolvi fazer algumas adaptações para atender as minhas especificações.

Eu preciso ter backup do servidor inteiro mais não necessáriamente preciso retornar todas as bases para o novo servidor novamente, por esse motivo fiz o meu próprio script para resolver esse problema.

Utilizando a linguagem python associada aos aplicativos do postgresql montei esta rotina.

#!/usr/bin/env python
#! -*- coding:utf8 -*-
########################################################
#  Script para fazer o pg_dump de todos os
#   bancos da máquina em que ele for executado
#  Valdinei dos Santos
#  valdineidossantos(at)gmail.com.br
#  27 Julho de 2009
########################################################
#Importando o getstatusoutput responsavel por executar os comandos do sistema operacional
from commands import getstatusoutput
from datetime import datetime
from os import path

#config
psql="/usr/bin/psql"
pg_dump="/usr/bin/pg_dump"
user="pguser-vale"
host="valdineidossantos.com"
repository = "/media/backup/databases/"

#Functions
def getAllDatabases(psql, user, host):
    print "\nRecuperando as bases de dados do servidor %s" % host
    command = "%s -U %s -h %s -l" % (psql, user, host)
    status, output = getstatusoutput ( command )
    if int(status) == 0:
       #return lista de servidores
       return stringToListServers( output )
    else:
        return [[],] 

def stringToListServers( databaseString ):
    print "\nFormatando a string"
    temp_pieces = databaseString.split("\n")
    dataBases = []
    for i in temp_pieces[3:]:
        try:
            pieces = i.split("|")
            owner  = pieces[1].strip()
            dbName = pieces[0].strip()
            encode = pieces[2].strip()
            data   = [dbName, encode, owner]
            if data:
                dataBases.append ( data )
        except Exception, e:
            continue
            #print e.__doc__
    return dataBases

#Init
if __name__ == '__main__':

    allDataBases =  getAllDatabases(psql, user, host)

    day = datetime.now().strftime("%Y%m%d")
    for database, encode, owner in allDataBases:
        #name Example databasename-20092707.dump
        dumpName = "%s-%s.dump" % (database, day)    

        #/dev/null/databasename-20092707.dump
        file = path.join(repository, dumpName)

        command = "%s -U %s -h %s -E %s  -f %s -i -Fc %s " % (pg_dump, user, host, encode, file, database)

        status, output = getstatusoutput( command)

        if int(status) > 0:
            print "Erro no backup da database %s\n %s" % (database, output)

Após esse script finalizado teremos no diretorio que foi setado no config “repository” todos os bancos de dados disponiveis no servidor.
Para voltar novamente com a base dados para o novo servidor rodamos o comando.

pg_restore -d |nome da base dados| -Fc |caminho/nome do arquivo dump|

Temos algumas outras opções em shell script  mas preferi usar  o python  🙂
Python

This entry was posted on segunda-feira, julho 27th, 2009 at 12:20 and is filed under Banco de Dados, programação. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

6 Responses to “Postgresql – Backup de todas as base de dados”

  1. Francisco Souza Says:

    Salve salve Valdinei. Gostei pra caramba do script 🙂
    Publica ele no VOL também hehe

    Forte abraço e parabéns pelo blog! 😉

  2. Rafael Henter Says:

    Dinei,

    Segue um script parecido so que em ShellScript:

    
    #/usr/local/bin/bash
    
    PSQL=`which psql`
    GREP=`which grep`
    AWK=`which awk`
    PGDUMP=`which pg_dump`
    
    # Informacoes sobre banco
    DBHOST='localhost'             # IP do Host que deseja backupear
    PGUSER='pguser'                # Usuario do Postgres que vc utiliza
    PGPORT='5432'                  # Porta do Postgres que vc utiliza - Default 5432
    
    
    for bancos in `$PSQL -U $PGUSER -h $DBHOST -l | $GREP pguser | $AWK '{print$1}'`
    do
        DUMP_FILE="/tmp/123/dump${bancos}.dump"
        echo "Backup :"${bancos}
        $PGDUMP -d $bancos -h $DBHOST -p $PGPORT -U $PGUSER -Fc -f $DUMP_FILE
        echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    done
    
    
  3. Thiago Avelino Says:

    Dump não é backup!

    “pg_dump NÃO é backup” por Fábio Telles Rodrigues

    http://www.postgresql.org.br/eventos/pgday/sp/2010

  4. Valdinei Says:

    Não é backup?
    Engraçado sempre fiz isso como backup e nunca tive problemas…

    O que seria backup nobre colega?

  5. Leonardo Claro Says:

    Boa tarde Valdinei, depois leia esse artigo desse link que você poderá entender: http://savepoint.blog.br/dump-nao-e-backup/

  6. Antonio Pereira Says:

    Essa frase diz tudo: “pg_dump não é O backup, ele é parte de uma estratégia de backup” Fabio Telles
    Recomendo muito a leitura do artigo indicado pelo Leonardo, logo acima…

Leave a Reply