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
