Skip to content

Instantly share code, notes, and snippets.

@gustavofonseca
Created April 7, 2016 14:16
Show Gist options
  • Save gustavofonseca/8708234c280f09c6b83fce2a5321fa4e to your computer and use it in GitHub Desktop.
Save gustavofonseca/8708234c280f09c6b83fce2a5321fa4e to your computer and use it in GitHub Desktop.
Fabfile com funções para backup e restore de BD Postgres
# coding: utf-8
import os
import sys
import tempfile
import multiprocessing
from datetime import datetime
from fabric.api import *
TIME_FORMAT = "%Y-%m-%dT%H:%M:%S%z"
MAX_JOBS = multiprocessing.cpu_count()
# -------
# Constantes passíveis de definição via argumentos.
# -------
TEMPDIR = env.get('tempdir', tempfile.gettempdir())
@task
def dump_db(dbname, host, port, user, jobs=None):
""" Realiza dump completo (estrutura e dados) do BD especificado.
O dump segue o formato ``dictionary``, e será paralelizado com o número de
processos definido pelo argumento ``jobs``.
"""
dump_filename = '{dbname}-{datetime}.sqldump'.format(
dbname=dbname, datetime=datetime.now().strftime(TIME_FORMAT))
dump_filepath = os.path.join(TEMPDIR, dump_filename)
if jobs is None:
jobs = MAX_JOBS
cmd = """\
pg_dump {dbname} -h {host} -p {port} -U {user} --format=d \
--jobs={jobs} --no-synchronized-snapshots --file={dump_filepath}\
""".format(dbname=dbname,
host=host,
port=port,
user=user,
dump_filepath=dump_filepath,
jobs=jobs)
local(cmd)
return dump_filepath
@task
def restore_db(dump_filepath, dbname, host, port, user, jobs=None):
""" Restaura o BD ``default`` com base no arquivo ``dump_filepath``.
"""
if jobs is None:
jobs = MAX_JOBS
cmd = """\
pg_restore -d {dbname} -h {host} -p {port} -U {user} --format=d \
--jobs={jobs} --create --clean {dump_filepath}\
""".format(dbname=dbname,
host=host,
port=port,
user=user,
dump_filepath=dump_filepath,
jobs=jobs)
local(cmd)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment