Backup automatizado de toda a base MySQL

Publicado por Mauricio Sousa (última atualização em 26/01/2015)

[ Hits: 9.183 ]

Download mysql-backup.py




Funções do script:

- Busca em cada execução todos os bancos da base local, assegurando que nenhum banco novo fique esquecido de fazer backup.
- Comprime os arquivo no formato "bz2" e os salva no diretório "/var/backups/mysql", podendo ser alterado no script.
- Cria para cada banco um diretório com o nome do mesmo, facilitando a localização e identificação dos arquivos.
- Mantém os backups dos últimos 7 dias, removendo os mais antigos.
- A rotina de limpeza sempre checa se existe pelo menos um arquivo de backup, caso só exista um, mesmo que tenha mais de 7 dias é preservado, assegurando que se por algum motivo os backups não tenham sido feitos nos últimos dias, a rotina de limpeza não remova todos.

Para que o script seja executado diariamente de forma automática deve ser adicionada a linha de execução ao crontab do usuário root. Na máquina que roda o serviço MySQL execute os comandos abaixo:

$ sudo su
# chmod +x /root/mysql-backup.py
# crontab -e

Adicione as linhas abaixo, o script será executado diariamente às duas da manhã:

0 2 * * * /root/mysql-backup.py >> /tmp/mysql-backup.log

Espero ter ajudado.
Abraços...

  



Esconder código-fonte

#! /usr/bin/python
# -*- coding: utf-8 -*-
import os, time, subprocess
from ConfigParser import ConfigParser

#author="Maurício Sousa"

config = ConfigParser()
# em Debian, /etc/mysql/debian.cnf contem 'root' login and password.
config.read("/etc/mysql/debian.cnf")
username = config.get('client', 'user')
password = config.get('client', 'password')
hostname = config.get('client', 'host')
date = time.strftime('%Y-%m-%d-%H:%M')
# diretorio de armazenamento dos backups
dest = "/var/backups/mysql"

def clear(directory):
  number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])
  if number_of_files > 1:
    print "% s - Foram encontrados %s arquivos de backup no diretório %s" % (date, number_of_files, directory)
    purge_dir(directory)
  else:
    print "%s - Foram encontrados %s arquivos de backup nenhum será removido %s" % (date, number_of_files, directory)

def checkfile(filename):
    filestats = os.stat(filename) # pega informaçoes do arquivo
    if time.time() - filestats.st_mtime > 86400*7: # checa se o arquivo tem mais de 7 dias e remove caso positivo
        print "Removendo: %s" % (filename)
        os.remove(filename)

def purge_dir(path):
  dirList = os.listdir(path) # Lista o diretório
  for filename in dirList:
    checkfile(os.path.join(path, filename)) # executa funcao checkfile.


def backup():
 database_list_command="mysql -u %s -p%s -h %s --silent -N -e 'show databases'" % (username, password, hostname) #lista databases
 for database in os.popen(database_list_command).readlines():
     database = database.strip()
     if database == 'information_schema':
         continue
     if database == 'performance_schema':
         continue
     print "%s - Criando Backup database: %s" % (date, database)
     target_dir = "%s/%s" % (dest, database)
     if not os.path.exists(target_dir):
      print "%s - Criando novo diretório: %s" % (date, target_dir)
      os.makedirs(target_dir)
     filename = "%s/%s-%s.sql" % (target_dir, database, date)
     os.popen("mysqldump --max_allowed_packet=128M --single-transaction -u %s -p%s -h%s %s | bzip2 -c > %s.bz2" % (username, password, hostname, database, filename))
     clear(target_dir)

backup()

Scripts recomendados

yFone - Yes, outra agenda telefonica escrita em python! ;- )

Banco de dados int Python

Dump MySQL com relatório de logs por e-mail

inserção

Cadastro de pacientes - Py3k


  

Comentários
[1] Comentário enviado por SawyeRv2 em 07/11/2016 - 14:26h

Muito bom o script amigo!
Favoritado!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts