Backup incremental vs. completo para servidores de MU Online: cuál elegir
Entendé las diferencias entre backup completo, incremental y diferencial para servidores de MU Online, con ejemplos de scripts, rotación de retención y un plan de recuperación de desastres comprobable.
Perder la base de datos de un servidor de MU Online —cuentas, personajes, ítems, guildas, historial de ranking— es el tipo de incidente que puede terminar con un proyecto de la noche a la mañana, especialmente si la comunidad ya invirtió tiempo y dinero en él. La pregunta "backup incremental o compl
Perder la base de datos de un servidor de MU Online —cuentas, personajes, ítems, guildas, historial de ranking— es el tipo de incidente que puede terminar con un proyecto de la noche a la mañana, especialmente si la comunidad ya invirtió tiempo y dinero en él. La pregunta "backup incremental o completo" no tiene una respuesta única: la elección correcta depende del tamaño de la base, de la frecuencia de cambio de los datos y del tiempo aceptable de recuperación en caso de desastre. Este tutorial explica las diferencias técnicas entre los tipos de backup, muestra cómo combinarlos en la práctica para un servidor de MU, y presenta un plan de recuperación comprobable, porque un backup que nunca se restauró es solo una suposición.
Los tres tipos de backup
Antes de decidir una estrategia, hay que entender exactamente qué hace cada tipo:
| Tipo | Qué copia | Velocidad de generación | Velocidad de restauración | Espacio en disco |
|---|---|---|---|---|
| Completo (full) | Toda la base de datos/archivos, desde cero | Lenta | Rápida (archivo único) | Alto |
| Incremental | Solo lo que cambió desde el último backup de cualquier tipo | Muy rápida | Lenta (depende de toda la cadena) | Bajo |
| Diferencial | Solo lo que cambió desde el último completo | Rápida (crece con el tiempo) | Media (completo + 1 diferencial) | Medio |
La elección entre incremental y diferencial es el punto más confundido: el incremental es más liviano para generar, pero más riesgoso para restaurar, porque toda la cadena (completo + incremental 1 + incremental 2 + ... + incremental N) debe estar intacta. Si un archivo intermedio se corrompe, todo lo que viene después queda inservible.
Qué necesita entrar en el backup de un servidor de MU
Muchos administradores hacen backup solo de la base de datos y se olvidan de archivos esenciales para la recuperación completa:
| Componente | Por qué es crítico | Frecuencia recomendada |
|---|---|---|
| Base de datos (cuentas, personajes, ítems, guildas) | Pérdida = pérdida total del progreso de los jugadores | Completo diario + incremental/log cada 15-30 min |
| Archivos de configuración del servidor (GameServer, ConnectServer, JoinServer) | Recrearlos desde cero puede tomar horas si no está documentado | En cada cambio + semanal |
| Logs de transacciones/auditoría (trade, comandos GM) | Necesario para investigar disputas y fraudes después de un incidente | Junto con el backup de la base de datos |
| Cliente y archivos personalizados (ítems, mapas, alas custom) | La pérdida obliga a reconstruir todo el trabajo de personalización | Semanal o en cada release |
| Scripts de automatización (cron, deploy, anti-cheat) | Sin ellos, restaurar el servidor no recupera la operación completa | En cada cambio |
Estrategia recomendada según el tamaño del servidor
No existe una estrategia única: el tamaño de la base de datos y el volumen de jugadores activos cambian el cálculo de costo-beneficio.
| Tamaño del servidor | Estrategia recomendada | Retención |
|---|---|---|
| Pequeño (hasta 200 online) | Completo diario, sin incremental (base lo bastante pequeña) | 14 días |
| Mediano (200 a 1000 online) | Completo semanal + incremental diario | 30 días de completos, 14 días de incrementales |
| Grande (1000+ online) | Completo diario + incremental/log cada 15-30 min | 30 días de completos, 7 días de log de transacciones |
Ejemplo de script de backup completo (MySQL/MariaDB)
La mayoría de los emuladores de MU (MuEmu, IGCN) usa MySQL o MariaDB. Un script básico de backup completo, programado vía cron:
#!/bin/bash
DATA=$(date +%Y%m%d_%H%M%S)
DESTINO="/backup/mu/completo"
BANCO="mu_online"
mysqldump --single-transaction --routines --triggers \
-u backup_user -p"SENHA_AQUI" "$BANCO" | gzip > "$DESTINO/full_${BANCO}_${DATA}.sql.gz"
# Elimina backups completos con más de 30 días
find "$DESTINO" -name "full_${BANCO}_*.sql.gz" -mtime +30 -delete
El parámetro --single-transaction es esencial en bases InnoDB: garantiza una foto consistente de la base sin bloquear las tablas durante el dump, evitando un impacto perceptible para los jugadores online en el momento del backup.
Ejemplo de backup incremental vía binlog (MySQL)
Para un incremental real (no un "completo pequeño"), habilitá el binary log de MySQL y hacé backup de él periódicamente:
# my.cnf — habilitar binlog
[mysqld]
log-bin = /var/log/mysql/mu-bin
binlog_expire_logs_seconds = 604800
server-id = 1
#!/bin/bash
# Copia los binlogs generados desde el último backup completo
DESTINO="/backup/mu/incremental"
mysqladmin -u backup_user -p"SENHA_AQUI" flush-logs
cp /var/log/mysql/mu-bin.* "$DESTINO/"
Restaurar con binlog exige aplicar el completo más reciente y luego "reproducir" los binlogs en el orden exacto; por eso documentá siempre el orden cronológico de los archivos en el nombre o en un índice separado.
Rotación y política de retención (3-2-1)
La regla clásica de backup 3-2-1 se aplica bien a servidores de MU: 3 copias de los datos, en 2 medios distintos, con 1 copia fuera del lugar físico del servidor (otra ciudad, otro proveedor de nube). Un VPS que aloja el backup en la misma máquina del servidor de producción no es un backup real: es solo una copia que muere junto con el mismo incidente (falla de disco, intrusión, baneo de la cuenta del proveedor).
| Copia | Ubicación sugerida | Propósito |
|---|---|---|
| 1ª copia | Disco separado en el mismo servidor | Recuperación rápida ante un error operativo (query mala, borrado accidental) |
| 2ª copia | Otro servidor/VPS, misma región | Recuperación si el disco principal falla físicamente |
| 3ª copia | Almacenamiento en la nube (S3, Backblaze, Google Cloud Storage) en otra región | Recuperación de desastre total (intrusión, baneo de cuenta, incendio en el datacenter) |
Cifrado y seguridad del backup
Un backup con datos de cuentas de jugadores (aunque las contraseñas estén hasheadas) es un activo sensible: si se filtra, expone correos, IPs de login e historial de compras de la tienda. Cifrá el archivo antes de enviarlo a la nube:
gpg --symmetric --cipher-algo AES256 --output "full_mu_online_${DATA}.sql.gz.gpg" "full_mu_online_${DATA}.sql.gz"
Guardá la contraseña de cifrado en un gestor de contraseñas separado de la infraestructura del servidor: si el servidor se ve comprometido, el backup cifrado sigue protegido incluso si el atacante tiene acceso a la máquina.
Probando la restauración (el paso que todos se saltean)
Un cronograma de prueba de restauración debe existir independientemente de lo "confiable" que parezca el proceso:
- Reservá un ambiente aislado (VPS de prueba o contenedor) sin acceso a la red de producción.
- Restaurá el backup completo más reciente desde cero.
- Aplicá los incrementales/binlogs en el orden correcto, si corresponde.
- Levantá el GameServer apuntando a esa base restaurada y validá el login, personaje e inventario de una cuenta de prueba conocida.
- Documentá el tiempo total empleado; ese número es tu RTO real (tiempo de recuperación), no una estimación teórica.
Monitoreo y alertas de falla de backup
Un backup que falla silenciosamente es peor que no tener backup, porque crea una falsa sensación de seguridad. Configurá una alerta automática (webhook en Discord, correo) cuando el script de backup termine con error o cuando el archivo generado tenga un tamaño anormalmente pequeño comparado con el histórico:
TAMANHO=$(stat -c%s "$DESTINO/full_${BANCO}_${DATA}.sql.gz")
if [ "$TAMANHO" -lt 1000000 ]; then
curl -H "Content-Type: application/json" -d '{"content":"⚠️ ¡El backup de MU generó un archivo sospechosamente pequeño!"}' "$WEBHOOK_DISCORD"
fi
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| La restauración falla por un archivo incremental faltante | Un binlog de la cadena fue borrado por rotación automática | Ajustar binlog_expire_logs_seconds y sincronizarlo con la retención del backup completo |
| El backup completo traba el juego durante la generación | Faltó --single-transaction en el mysqldump | Agregar el parámetro para un dump consistente sin bloqueo de tablas |
| Un backup nunca probado falla en el momento de la recuperación real | Ausencia de rutina de prueba de restauración | Programar una prueba mensual en ambiente aislado |
| Todas las copias de backup están en el mismo servidor | Falta de política 3-2-1 | Enviar al menos una copia a otra región/proveedor |
| La alerta de falla nunca llega | Script sin verificación de éxito/tamaño de archivo | Agregar chequeo de código de salida y tamaño con notificación vía webhook |
Lista de verificación de estrategia de backup
- Backup completo programado con frecuencia adecuada al tamaño del servidor.
- Incremental o diferencial configurado si el volumen de cambio lo justifica.
- Regla 3-2-1 aplicada (copia fuera del servidor de producción).
- Archivos cifrados antes de cualquier envío a la nube.
- Alerta automática de falla de backup configurada.
- Prueba de restauración completa realizada en ambiente aislado en el último mes.
- Documentación del orden de restauración (completo + incrementales) actualizada.
Con la estrategia de backup validada y probada, el siguiente paso natural es revisar la infraestructura general del servidor —desde el aprovisionamiento hasta la configuración de seguridad— descrita con más detalle en el tutorial de creación de servidor de MU Online.
Preguntas frecuentes
¿El backup incremental es siempre más rápido que el completo?
Sí, en el momento de generarlo: copia solo lo que cambió desde el último backup. Pero la restauración es más lenta y más riesgosa, porque depende de que toda la cadena de incrementales anteriores esté íntegra.
¿Puedo usar solo backup incremental y nunca más hacer uno completo?
No es recomendable. La cadena de incrementales crece indefinidamente y cualquier archivo corrupto en el medio invalida la restauración de todo lo que viene después. Rehacé un completo periódicamente (semanal es común) para 'resetear' la cadena.
¿Cuál es la diferencia entre incremental y diferencial?
El incremental copia solo lo que cambió desde el último backup (de cualquier tipo). El diferencial copia todo lo que cambió desde el último completo. El diferencial usa más espacio que el incremental, pero restaura más rápido, porque solo depende del completo + el último diferencial.
¿Con qué frecuencia debo hacer backup de la base de datos de un servidor de MU activo?
Para servidores con jugadores activos, un backup completo diario de la base de datos (fuera del pico de acceso) y un incremental del log de transacciones cada 15-30 minutos es una práctica común, que minimiza la pérdida de progreso en caso de falla.
¿Probar el backup es realmente necesario si 'siempre funcionó'?
Sí, es obligatorio. Un backup que nunca se restauró es una suposición, no una garantía. Reservá un ambiente de prueba mensual para restaurar el backup más reciente desde cero y validar que el servidor arranca correctamente con esos datos.