Como Fazer Backup Automatizado de um Banco de Dados em Arquivo .sql com Python

Como Fazer Backup Automatizado de um Banco de Dados em Arquivo .sql com Python

A automação de backups é essencial para garantir a segurança da informação e a continuidade de negócios sem depender de rotinas manuais. Utilizando o módulo nativo subprocess do Python, é possível invocar utilitários de linha de comando como mysqldump (MySQL/MariaDB) ou pg_dump (PostgreSQL) para exportar a estrutura e os dados do banco diretamente para um arquivo .sql compactado ou rotulado com data e hora.

Python
import os
import subprocess
from datetime import datetime

def exportar_backup_sql():
    # Configurações do banco de dados e diretório de destino
    db_user = "root"
    db_password = "sua_senha_segura"
    db_name = "meu_banco"
    diretorio_destino = "./backups"
    
    # Garante que a pasta de destino exista
    os.makedirs(diretorio_destino, exist_ok=True)
    
    # Gera nome de arquivo único com timestamp (ex: backup_meu_banco_20261023_085600.sql)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    caminho_arquivo = os.path.join(diretorio_destino, f"backup_{db_name}_{timestamp}.sql")
    
    # Comando CLI do mysqldump (para PostgreSQL, substitua por pg_dump)
    # Nota: No PostgreSQL, defina PGPASSWORD no ambiente para evitar expor a senha no comando
    comando = [
        "mysqldump",
        f"-u{db_user}",
        f"-p{db_password}",
        db_name
    ]
    
    try:
        # Executa o comando redirecionando a saída padrão (stdout) para o arquivo .sql
        with open(caminho_arquivo, "w", encoding="utf-8") as arquivo_sql:
            resultado = subprocess.run(
                comando,
                stdout=arquivo_sql,
                stderr=subprocess.PIPE,
                text=True,
                check=True
            )
        print(f"Backup realizado com sucesso! Salvo em: {caminho_arquivo}")
        
    except subprocess.CalledProcessError as err:
        print(f"Erro ao gerar backup: {err.stderr}")
    except FileNotFoundError:
        print("Erro: O utilitário mysqldump não foi encontrado no PATH do sistema.")

# Exemplo de execução prática
if __name__ == "__main__":
    exportar_backup_sql()
  • Módulo Nativo subprocess: Permite executar comandos do sistema operacional diretamente a partir do código Python sem a necessidade de bibliotecas externas de terceiros.

  • Passagem do Comando em Lista: Utilizar uma lista de strings (["mysqldump", "-u...", ...]) em vez de uma string única concatenada melhora o manuseio de argumentos pelo sistema e previne injeções de comandos no Shell.

  • Segurança da Senha: Para ambientes de produção com PostgreSQL ou MySQL, é recomendado injetar as credenciais via variáveis de ambiente (como PGPASSWORD ou um arquivo ~/.my.cnf) em vez de passá-las abertamente no argumento do comando.

  • Opção check=True: Garante que o Python levante uma exceção (CalledProcessError) caso o utilitário do banco retorne um código de erro (ex: senha incorreta ou banco inexistente), evitando a criação de arquivos .sql vazios sem notificação.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

C# e Banco de Dados: Como Conectar e Realizar Operações com SQL Server