Backup All MySQL Databases on Linux Server
What you will need:
- Access to the server’s Linux shell with root (or sudo) user privileges.
- MySQL root user password.
Process description:
This process backup all MySQL databases available on the server. For each database, an individual backup is generated in SQL format. Each file is then compressed (.gz), using the database name followed by the execution date as the file name (e.g., mydatabase_2025-06-27.gz). This facilitates organization, specific recovery, and versioning of backups.
Creating the shell file for backup
Create a file in the Linux shell:
nano backup_mysql.sh
Paste the following content into this file:
#!/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"
save the file and exit nano (ctrl+x, y, enter)
Edit the file you created and change the line below with the mysql root password:
MYSQL_PASSWORD="sua_senha_root_segura_do_mysql"
save the file and exit nano (ctrl+x, y, enter)
Change the file permissions:
chmod +x backup_mysql.sh
By default, the backup will be created in /backup/mysql. If you wish, you can change the location to save the file by editing the created file and changing BACKUP_DIR=”/backup/mysql”.
Running the backup:
Run the file and wait for the process to complete:
./backup_mysql.sh
This is a simple but very useful script for backing up all MySQL databases on a Linux server.