Backup de todos os bancos de dados mysql em um servidor Linux

Backup de todos os bancos de dados mysql em servidor linux

O que será necessário:

  • Acesso ao shell Linux do servidor com usuário root(ou sudo)
  • Senha do usuário root do mysql

Descrição do processo:

Este processo realiza o backup de todos os bancos de dados mysql disponíveis no servidor. Para cada banco de dados, é gerado um backup individual em formato SQL. Em seguida, cada arquivo é compactado (.gz), utilizando como nome o próprio banco de dados seguido da data de execução (por exemplo: meubanco_2025-06-27.gz). Isso facilita a organização, a recuperação específica e o versionamento dos backups.

Criando o arquivo shell para backup

Crie um arquivo no shell do linux:

nano backup_mysql.sh

Neste arquivo cole o conteúdo abaixo:

#!/bin/bash

# Script de backup MySQL para usuário root
# Configurações do MySQL
MYSQL_USER="root"
MYSQL_PASSWORD="sua_senha_root_segura_do_mysql"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"

# Diretório onde os backups serão salvos
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y%m%d_%H%M%S")

# Verificar se está sendo executado como root
if [ "$EUID" -ne 0 ]; then
    echo "Este script deve ser executado como root (sudo)."
    echo "Use: sudo ./backup_mysql.sh"
    exit 1
fi

# Criar diretório de backup se não existir
mkdir -p "$BACKUP_DIR"

# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${BLUE}=== Backup MySQL - Usuário Root ===${NC}"
echo "Data/Hora: $(date)"
echo "Usuário: root"
echo "Host: $MYSQL_HOST"
echo "Diretório de backup: $BACKUP_DIR"
echo ""

# Tentar várias formas de autenticação para root
echo "Tentando conectar como root..."

# Método 1: Sem senha (auth_socket)
mysql -u root -e "SELECT 1;" &>/dev/null
if [ $? -eq 0 ]; then
    echo -e "${GREEN}✓ Conectado usando auth_socket (sem senha)${NC}"
    AUTH_METHOD="no_password"
else
    # Método 2: Com senha
    if [ -z "$MYSQL_PASSWORD" ]; then
        echo -n "Digite a senha do MySQL root: "
        read -s MYSQL_PASSWORD
        echo ""
    fi
    
    mysql -u root -p"$MYSQL_PASSWORD" -e "SELECT 1;" &>/dev/null
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ Conectado usando senha${NC}"
        AUTH_METHOD="with_password"
    else
        echo -e "${RED}Erro: Não foi possível conectar ao MySQL como root.${NC}"
        echo "Verifique se:"
        echo "1. O MySQL está rodando"
        echo "2. A senha está correta"
        echo "3. O usuário root tem permissões adequadas"
        exit 1
    fi
fi

echo ""

# Função para executar comandos MySQL baseado no método de autenticação
execute_mysql() {
    if [ "$AUTH_METHOD" = "no_password" ]; then
        mysql -u root "$@"
    else
        mysql -u root -p"$MYSQL_PASSWORD" "$@"
    fi
}

# Função para executar mysqldump baseado no método de autenticação
execute_mysqldump() {
    if [ "$AUTH_METHOD" = "no_password" ]; then
        mysqldump -u root "$@"
    else
        mysqldump -u root -p"$MYSQL_PASSWORD" "$@"
    fi
}

# Obter lista de todos os bancos de dados (excluindo system databases)
echo "Buscando bancos de dados..."
DATABASES=$(execute_mysql -e "SHOW DATABASES;" | grep -v -E "^(Database|information_schema|performance_schema|mysql|sys)$")

if [ -z "$DATABASES" ]; then
    echo -e "${YELLOW}Nenhum banco de dados de usuário encontrado para backup.${NC}"
    exit 0
fi

echo -e "${GREEN}Bancos de dados encontrados:${NC}"
for db in $DATABASES; do
    echo "  - $db"
done
echo ""

# Contador para estatísticas
TOTAL_DATABASES=$(echo "$DATABASES" | wc -l)
SUCCESS_COUNT=0
ERROR_COUNT=0

# Fazer backup de cada banco de dados
for DATABASE in $DATABASES; do
    echo -e "${YELLOW}Fazendo backup do banco: $DATABASE${NC}"
    
    # Nome do arquivo de backup
    BACKUP_FILE="$BACKUP_DIR/${DATABASE}_${DATE}.sql"
    
    # Executar mysqldump com opções otimizadas para root
    execute_mysqldump \
        --single-transaction \
        --routines \
        --triggers \
        --events \
        --hex-blob \
        --add-drop-database \
        --complete-insert \
        --disable-keys \
        --extended-insert \
        --quick \
        --lock-tables=false \
        --databases "$DATABASE" > "$BACKUP_FILE" 2>/dev/null
    
    # Verificar se o backup foi bem-sucedido
    if [ $? -eq 0 ] && [ -s "$BACKUP_FILE" ]; then
        FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
        echo -e "${GREEN}  ✓ Dump criado: $FILE_SIZE${NC}"
        
        # Comprimir o arquivo
        echo "  Comprimindo arquivo..."
        gzip "$BACKUP_FILE"
        
        if [ $? -eq 0 ]; then
            COMPRESSED_SIZE=$(du -h "${BACKUP_FILE}.gz" | cut -f1)
            echo -e "${GREEN}  ✓ Comprimido: $COMPRESSED_SIZE${NC}"
            ((SUCCESS_COUNT++))
        else
            echo -e "${RED}  ✗ Erro na compressão${NC}"
            ((ERROR_COUNT++))
        fi
    else
        echo -e "${RED}  ✗ Erro no backup do banco: $DATABASE${NC}"
        ((ERROR_COUNT++))
        # Remover arquivo vazio ou corrompido
        [ -f "$BACKUP_FILE" ] && rm "$BACKUP_FILE"
    fi
    echo ""
done

# Definir permissões adequadas para os arquivos de backup
echo "Definindo permissões dos arquivos..."
chown root:root "$BACKUP_DIR"/*.gz 2>/dev/null
chmod 600 "$BACKUP_DIR"/*.gz 2>/dev/null

# Relatório final
echo -e "${BLUE}=== Relatório Final ===${NC}"
echo "Total de bancos processados: $TOTAL_DATABASES"
echo -e "${GREEN}Backups bem-sucedidos: $SUCCESS_COUNT${NC}"
if [ $ERROR_COUNT -gt 0 ]; then
    echo -e "${RED}Erros encontrados: $ERROR_COUNT${NC}"
fi
echo ""

# Mostrar espaço em disco usado
TOTAL_SIZE=$(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1)
echo "Espaço total usado: $TOTAL_SIZE"
echo "Arquivos salvos em: $BACKUP_DIR"
echo ""

# Listar arquivos criados
echo -e "${GREEN}Arquivos de backup criados hoje:${NC}"
ls -lah "$BACKUP_DIR"/*_${DATE}.sql.gz 2>/dev/null | while read line; do
    echo "  $line"
done

# Limpeza de backups antigos (manter apenas os últimos 7 dias)
echo ""
echo -e "${YELLOW}Limpando backups antigos (mais de 7 dias)...${NC}"
DELETED_FILES=$(find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -print)
if [ -n "$DELETED_FILES" ]; then
    echo "Arquivos removidos:"
    echo "$DELETED_FILES" | while read file; do
        echo "  - $(basename "$file")"
    done
    find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
else
    echo "Nenhum arquivo antigo encontrado para remoção."
fi

# Verificar espaço em disco
echo ""
echo -e "${BLUE}Status do sistema:${NC}"
echo "Espaço livre em disco:"
df -h "$BACKUP_DIR" | tail -1 | awk '{print "  Usado: " $3 " | Disponível: " $4 " | Uso: " $5}'

echo ""
echo -e "${GREEN}Backup finalizado com sucesso!${NC}"
echo "Finalizado em: $(date)"

# Log do backup
LOG_FILE="$BACKUP_DIR/backup_$(date +%Y%m).log"
echo "$(date): Backup realizado - $SUCCESS_COUNT sucessos, $ERROR_COUNT erros" >> "$LOG_FILE"

Salve o arquivo e saida do nano (ctrl+x, y, enter)

Edite o arquivo que criou e altere a linha abaixo com a senha do root do mysql:

MYSQL_PASSWORD="sua_senha_root_segura_do_mysql"

Salve o arquivo e saia do nano (ctrl+x, y, enter)

Altere as permissões do arquivo:

chmod +x backup_mysql.sh

Como padrão o backup será criado em /backup/mysql . Se desejar você pode alterar o local para salvar o arquivo editando o arquivo criado e alterando BACKUP_DIR=”/backup/mysql”

Executando o backup:

Execute o arquivo e aguarde o processo:

./backup_mysql.sh

Esse é um script simples mas muito útil para Backup de Todos os Bancos de Dados mysql no Servidor Linux.

Veja Mais: Restaurando MySQL usando o MySQL Workbench
Veja Mais: Erros que todo sysadmin iniciante comete
Veja Mais: Dispositivos de Armazenamento Secundário: Definição, Tipos e Casos de Uso em Backup
Veja Mais: O que ninguém te conta sobre gerenciar servidores em produção

See More: How to Install Portainer for Docker Management with Nginx Proxy Manager on Ubuntu

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *