Skip to content

Instantly share code, notes, and snippets.

@carlosleopoldo
Last active August 13, 2025 20:45
Show Gist options
  • Select an option

  • Save carlosleopoldo/8467f5557ff4b50b38256814185382ca to your computer and use it in GitHub Desktop.

Select an option

Save carlosleopoldo/8467f5557ff4b50b38256814185382ca to your computer and use it in GitHub Desktop.
WordPress MySQL Backup Script

🗄️ WordPress MySQL Backup Script

En: Automated MySQL backup script that extracts database credentials from wp-config.php Es: Script de copia de seguridad automatizado de MySQL que extrae las credenciales de la base de datos de wp-config.php

📋 Descripción

Script en Bash que automatiza la creación de backups de bases de datos MySQL para sitios WordPress. Extrae automáticamente las credenciales de conexión desde el archivo wp-config.php y genera un dump SQL completo con timestamp.

✨ Características

  • 🔧 Extracción automática de credenciales desde wp-config.php
  • 📅 Nombres con timestamp para organizar backups por fecha/hora
  • 🛡️ Manejo robusto de errores con mensajes informativos colorizados
  • 🔍 Validación de conexión antes del dump para detectar problemas
  • ⚡ Opciones optimizadas de mysqldump para backups seguros y eficientes
  • 🐳 Compatibilidad TCP explícita para evitar warnings de protocolo
  • 📚 Documentación completa con docblocks en cada función

🎯 Funcionalidades Técnicas

Extracción de Datos

  • Parsea múltiples formatos de wp-config.php con expresiones regulares robustas
  • Maneja diferentes estilos de comillas y espaciado
  • Separa automáticamente host:puerto en parámetros independientes
  • Convierte localhost a 127.0.0.1 para conexiones TCP limpias

Backup MySQL

  • --single-transaction: Garantiza consistencia de datos
  • --routines --triggers: Incluye procedimientos almacenados y triggers
  • --add-drop-table: Facilita restauración limpia
  • --extended-insert: Inserts optimizados para archivos más pequeños
  • --quick --lock-tables=false: Minimiza uso de memoria y bloqueos

📁 Estructura de Archivos Generados

mi_sitio_backup_20250813_142530.sql

Formato del nombre: {DB_NAME}_backup_{YYYYMMDD_HHMMSS}.sql

🚀 Instalación y Uso

Requisitos Previos

# Verificar que mysqldump esté instalado
which mysqldump

# Verificar permisos de lectura en wp-config.php
ls -la wp-config.php

Instalación

# 1. Descargar el script en la carpeta de WordPress
wget -O backup_mysql.sh "URL_DEL_GIST"

# 2. Dar permisos de ejecución
chmod +x backup_mysql.sh

Ejecución

# Ejecutar backup
./backup_mysql.sh

# Ejecutar con output detallado
./backup_mysql.sh 2>&1 | tee backup.log

📊 Ejemplo de Output

=== INICIANDO BACKUP DE MYSQL ===
Extrayendo configuración de wp-config.php...

Líneas de configuración encontradas:
define( 'DB_NAME', 'mi_wordpress' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'mi_password' );
define( 'DB_HOST', 'localhost:3306' );

✓ Base de datos: 'mi_wordpress'
✓ Usuario: 'wp_user'
✓ Host: '127.0.0.1' (Puerto: 3306)
  Nota: Cambiando localhost por 127.0.0.1 para forzar conexión TCP

Probando conexión a MySQL...
✓ Conexión a MySQL exitosa

Creando dump de la base de datos...
Archivo de destino: mi_wordpress_backup_20250813_142530.sql
✓ Backup creado exitosamente
✓ Archivo: mi_wordpress_backup_20250813_142530.sql
✓ Tamaño: 15M

=== BACKUP COMPLETADO ===

🔧 Configuración Soportada

Formatos de wp-config.php Compatibles

// Formato estándar
define( 'DB_HOST', 'localhost:3306' );

// Con comillas simples
define('DB_HOST', 'localhost:3306');

// Sin espacios
define("DB_HOST","localhost:3306");

// Solo host (puerto 3306 por defecto)
define( 'DB_HOST', 'localhost' );

🚨 Solución de Problemas

Error: "No se encontró el archivo wp-config.php"

# Verificar que el script esté en la carpeta correcta
ls -la wp-config.php backup_mysql.sh

Error: "mysqldump no está instalado"

# Ubuntu/Debian
sudo apt-get install mysql-client

# CentOS/RHEL
sudo yum install mysql

# macOS
brew install mysql-client

Error de conexión MySQL

# Verificar servicio MySQL
sudo systemctl status mysql

# Probar conexión manual
mysql -h 127.0.0.1 -P 3306 -u usuario -p base
#!/bin/bash
##
# Script para crear backup de MySQL desde configuración de WordPress
#
# Descripción: Extrae los datos de conexión desde wp-config.php y genera
# un dump SQL de la base de datos completa
#
# Uso: ./backup_mysql.sh
#
# Requisitos:
# - El script debe estar en la misma carpeta que wp-config.php
# - mysqldump debe estar instalado y disponible
# - Permisos de lectura en wp-config.php
#
# @author Carlos Leopoldo Magaña Zavala
# @version 1.0
##
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # Sin color
# Función para mostrar mensajes con colores
print_message() {
local color=$1
local message=$2
echo -e "${color}${message}${NC}"
}
##
# Función para extraer valores de wp-config.php
#
# @param string $1 Nombre de la constante a buscar (ej: DB_NAME)
# @return string Valor de la constante
##
extract_wp_config_value() {
local config_name=$1
local config_file="wp-config.php"
if [[ ! -f "$config_file" ]]; then
print_message $RED "Error: No se encontró el archivo wp-config.php"
exit 1
fi
# Extraer el valor usando múltiples métodos para mayor compatibilidad
local value=""
# Método 1: Buscar con comillas simples
value=$(grep -E "define\s*\(\s*['\"]${config_name}['\"]" "$config_file" | sed -E "s/.*define\s*\(\s*['\"]${config_name}['\"],\s*['\"]([^'\"]*)['\"].*/\1/")
# Método 2: Si no encontró nada, buscar con formato más flexible
if [[ -z "$value" ]]; then
value=$(grep -E "define.*${config_name}" "$config_file" | sed -E "s/.*['\"]([^'\"]*)['\"][^'\"]*\).*/\1/" | tail -1)
fi
# Método 3: Usar awk como respaldo
if [[ -z "$value" ]]; then
value=$(awk -F"'" "/define.*${config_name}/ { for(i=1;i<=NF;i++) if(\$i ~ /${config_name}/) print \$(i+2) }" "$config_file" | head -1)
fi
if [[ -z "$value" ]]; then
print_message $RED "Error: No se pudo extraer el valor de ${config_name}"
print_message $YELLOW "Línea encontrada:"
grep -E "define.*${config_name}" "$config_file" || print_message $RED "No se encontró la línea"
exit 1
fi
echo "$value"
}
##
# Función para validar que mysqldump esté disponible
##
check_mysqldump() {
if ! command -v mysqldump &> /dev/null; then
print_message $RED "Error: mysqldump no está instalado o no está en el PATH"
exit 1
fi
}
##
# Función principal para crear el backup
##
main() {
print_message $YELLOW "=== INICIANDO BACKUP DE MYSQL ==="
# Verificar que mysqldump esté disponible
check_mysqldump
# Extraer datos de configuración
print_message $YELLOW "Extrayendo configuración de wp-config.php..."
# Mostrar las líneas de configuración encontradas para debug
print_message $YELLOW "\nLíneas de configuración encontradas:"
grep -E "define.*DB_(NAME|USER|PASSWORD|HOST)" wp-config.php
print_message $YELLOW ""
DB_NAME=$(extract_wp_config_value "DB_NAME")
DB_USER=$(extract_wp_config_value "DB_USER")
DB_PASSWORD=$(extract_wp_config_value "DB_PASSWORD")
DB_HOST_RAW=$(extract_wp_config_value "DB_HOST")
# Separar host y puerto si están en formato host:puerto
if [[ "$DB_HOST_RAW" == *":"* ]]; then
DB_HOST=$(echo "$DB_HOST_RAW" | cut -d':' -f1)
DB_PORT=$(echo "$DB_HOST_RAW" | cut -d':' -f2)
print_message $GREEN "✓ Host: '$DB_HOST' (Puerto: $DB_PORT)"
else
DB_HOST="$DB_HOST_RAW"
DB_PORT="3306"
print_message $GREEN "✓ Host: '$DB_HOST' (Puerto por defecto: $DB_PORT)"
fi
# Si el host es localhost, usar 127.0.0.1 para evitar problemas con sockets
if [[ "$DB_HOST" == "localhost" ]]; then
DB_HOST="127.0.0.1"
print_message $YELLOW " Nota: Cambiando localhost por 127.0.0.1 para forzar conexión TCP"
fi
print_message $GREEN "✓ Base de datos: '$DB_NAME'"
print_message $GREEN "✓ Usuario: '$DB_USER'"
# Validar que los valores no estén vacíos
if [[ -z "$DB_NAME" || -z "$DB_USER" || -z "$DB_HOST" ]]; then
print_message $RED "Error: Faltan datos de configuración"
exit 1
fi
# Generar nombre del archivo de backup con timestamp
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${DB_NAME}_backup_${TIMESTAMP}.sql"
print_message $YELLOW "Creando dump de la base de datos..."
print_message $YELLOW "Archivo de destino: $BACKUP_FILE"
# Probar la conexión antes del dump
print_message $YELLOW "Probando conexión a MySQL..."
mysql \
--host="$DB_HOST" \
--port="$DB_PORT" \
--protocol=TCP \
--user="$DB_USER" \
--password="$DB_PASSWORD" \
--execute="SELECT 1;" \
"$DB_NAME" > /dev/null 2>&1
if [[ $? -ne 0 ]]; then
print_message $RED "✗ Error: No se pudo conectar a MySQL"
print_message $YELLOW "Verifica los datos de conexión:"
print_message $YELLOW " Host: $DB_HOST"
print_message $YELLOW " Puerto: $DB_PORT"
print_message $YELLOW " Usuario: $DB_USER"
print_message $YELLOW " Base de datos: $DB_NAME"
exit 1
fi
print_message $GREEN "✓ Conexión a MySQL exitosa"
# Crear el dump de la base de datos con host y puerto separados
mysqldump \
--host="$DB_HOST" \
--port="$DB_PORT" \
--protocol=TCP \
--user="$DB_USER" \
--password="$DB_PASSWORD" \
--single-transaction \
--routines \
--triggers \
--add-drop-table \
--extended-insert \
--quick \
--lock-tables=false \
"$DB_NAME" > "$BACKUP_FILE"
# Verificar si el dump se creó correctamente
if [[ $? -eq 0 && -f "$BACKUP_FILE" ]]; then
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
print_message $GREEN "✓ Backup creado exitosamente"
print_message $GREEN "✓ Archivo: $BACKUP_FILE"
print_message $GREEN "✓ Tamaño: $BACKUP_SIZE"
# Mostrar primeras líneas del archivo para verificar
print_message $YELLOW "\nPrimeras líneas del backup:"
head -5 "$BACKUP_FILE"
else
print_message $RED "✗ Error al crear el backup"
# Eliminar archivo parcial si existe
[[ -f "$BACKUP_FILE" ]] && rm "$BACKUP_FILE"
exit 1
fi
print_message $GREEN "\n=== BACKUP COMPLETADO ==="
}
# Ejecutar función principal
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment