Backup automatizado de toda a base MySQL
Publicado por Mauricio Sousa (última atualização em 26/01/2015)
[ Hits: 8.911 ]
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...
#! /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()
Dígito verificador, módulo 11 simples, para uso interno no "postgresql" como
Python com CouchDB usando couchdbkit
Acompanhar status de uma replicação MySQL
Crie alias para as tarefas que possuam longas linhas de comando - bash e zsh
Criando um gateway de internet com o Debian
Configuração básica do Conky para mostrar informações sobre a sua máquina no Desktop
Aprenda a criar músicas com Inteligência Artificial usando Suno AI
Entendendo o que é URI, URL, URN e conhecendo as diferenças entre POST e GET
Criando um Pen Drive Bootável no Linux
Instalando Discord no Fedora 40
Instalando Discord no Ubuntu 24.04 LTS
Como instalar o XFCE4-terminal na sua distribuição Linux e integrá-lo ao sistema
Como instalar o Tilix Terminal no Gnome e usá-lo como menu drop-down ao estilo Quake
Alguém do ramo de educação por aqui? (6)
Como instalar/atua... o Ubuntu sem formatar o HD? [RESOLVIDO] (3)