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

Backup de todos os bancos de dados mysql em servidor linux

Backup de Todos os Bancos de Dados mysql no 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.

Deixe um comentário

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