Backup automatizado de toda a base MySQL

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

[ Hits: 9.188 ]

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

Acompanhar status de uma replicação MySQL

Conexão python com Mysql

Banco de dados int Python

Dígito verificador, módulo 11 simples, para uso interno no "postgresql" como

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


  

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