Posts com Tags backup

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

Tags: , , ,

tar e rm alguns segredos…

Hoje vamos falar um pouco sobre backup e sobre uma curiosidade do comando rm.
Eu precisa criar um pacote compactado com os arquivos fontes de um aplicativo da empresa onde trabalho. Mas neste pacote não poderiam ir os arquivos de trabalho do sistema como PDF, Imagens, XML e etc.
Para fazer a compactação geramente utilizo o tar pois ele é de simples entendimento e largamente utilizado por pessoas que utilizam UNIX.
A sintaxe básica é:

tar  arquivo_saida arquivo_entrada1 arquivo_entrada_n

Assim como utilizei a flag –exclude no rsync posso utilizar no tar também.
Então para resolver meu problema foi simples digitei.

tar -vczf arquivosFontes.tar.gz /home/valdinei/ --exclude /home/valdinei/userFiles

Onde as opções são definidas da seguinte forma:

-v mostrar as saidas na tela
-c criação de arquivo
-z tipo de compactação
-f arquivo

Resolvido o problema com este comando, mas fazendo os testes para descobrir como o comando funcionava foram sendo criados arquivo lixo em meu ambiente de teste. Este arquivos eram os –exclude, –exclude= e coisas do tipo pois fiz muitas tentativas 🙂

Para apagarmos apagarmos arquivos é so utilizar o comando rm <arquivo>, sendo este um arquivo com um nome normal.
Neste caso meu arquivo não tinha um nome normal.

Digite no seu console

touch --test.

Depois

 rm --test

para ver o que acontece…. nada vai dar um erro.

Tem um explicação logica para isso, quando chamamos um comando é utlizado uma nova shell para executa-la e como o sinal (–) é utlizado para a passagem de paramentros da um erro pois agora este sinal pertence ao nome do arquivo.

Sem se extender mais sobre o assunto vamos a solução:

rm -- --test

Pronto apagamos o arquivo. Porque?
Bem agora definimos que o comando vai ser executado pelo shell que estamos utilizando.

Espero ter ajudado pois isso me salvou hoje criando um arquivo limpo e deixando minha máquina sem arquivos com nomes bizarros.

Abraços
Dinei.

Tags: , , , , ,