Cómo Hacer Backup Automático del Servidor de MU en la Nube
Aprende a automatizar el backup de tu servidor MU Online S6 en la nube con scripts, programación de tareas y mejores prácticas de seguridad de datos.
Por Qué Automatizar el Backup del Servidor de MU Online
Administrar un servidor de MU Online Season 6 implica un ecosistema complejo de datos: la base de datos SQL Server con cuentas, personajes, inventarios, progreso de quests, registros del Castle Siege, datos de guildas y transacciones de zen. Perder esa base de datos — ya sea por falla de hardware, corrupción o error humano — significa perder todo el historial del servidor.
La automatización del backup resuelve el principal problema de los administradores: la disciplina. El backup manual funciona mientras lo recuerdas. Un sistema automatizado funciona mientras el servidor está encendido. La diferencia entre los dos puede determinar la supervivencia de tu proyecto.
En este tutorial configurarás un flujo completo de backup automático: generación del archivo, compresión, envío a almacenamiento en la nube y rotación de archivos antiguos.
Entendiendo Qué Necesita Ser Guardado
Antes de automatizar cualquier cosa, es fundamental saber qué guardar. Un servidor MU S6 típico tiene dos categorías de datos críticos.
Base de Datos SQL Server
El núcleo del servidor. La base MuOnline (o el nombre que configuraste) contiene:
- Tabla
Character— todos los personajes, incluyendo clase (Dark Knight, Dark Wizard, Fairy Elf, Magic Gladiator, Dark Lord, Summoner), nivel, stats (STR, AGI, VIT, ENE, CMD para Dark Lord), conteo de resets - Tabla
AccountCharacter— vínculo entre cuentas y personajes - Tabla
Inventory— ítems equipados y en el inventario de cada personaje - Tablas
GuildyGuildMember— estructura completa de guildas - Tablas de evento — registros del Castle Siege, Crywolf Fortress, Blood Castle, Devil Square
- Tabla
MuCash/ VIP — si el servidor tiene sistema de puntos o VIP
Archivos de Configuración del GameServer
Estos archivos no están en la base de datos y frecuentemente son olvidados:
GameServer\
└── Data\
├── Monster\ → spots y drops personalizados por mapa
├── MapServerInfo.txt → configuraciones de mapa (Lorencia, Noria, Devias, Dungeon,
│ Lost Tower, Atlans, Tarkan, Icarus, Aida, Karutan,
│ Kanturu, Kalima, Land of Trials, Crywolf Fortress,
│ Raklion, Vulcanus, Acheron)
├── Item\ → drops y atributos de ítems personalizados
└── *.ini / *.xml → archivos de configuración general del servidor
.txt del GameServer — no en la base SQL. Un backup solo del SQL no recuperará esas configuraciones.Configurando el Backup Automático del SQL Server
Paso 1 — Crear el Script T-SQL de Backup
Abre SQL Server Management Studio (SSMS) y crea un procedimiento de backup. Este script usa compresión nativa y guarda en una carpeta local antes del envío a la nube.
-- Procedure: sp_BackupMuOnline
-- Crea un backup comprimido con timestamp en el nombre del archivo
USE master;
GO
CREATE PROCEDURE sp_BackupMuOnline
@BackupPath NVARCHAR(500) = 'D:\Backups\MuOnline\'
AS
BEGIN
DECLARE @FileName NVARCHAR(600)
DECLARE @DateStamp NVARCHAR(20)
DECLARE @FullPath NVARCHAR(700)
-- Formato: MuOnline_20240115_0300.bak
SET @DateStamp = CONVERT(NVARCHAR(8), GETDATE(), 112)
+ '_'
+ REPLACE(CONVERT(NVARCHAR(5), GETDATE(), 108), ':', '')
SET @FileName = 'MuOnline_' + @DateStamp + '.bak'
SET @FullPath = @BackupPath + @FileName
BACKUP DATABASE [MuOnline]
TO DISK = @FullPath
WITH
COMPRESSION, -- reduce el tamaño hasta un 80%
CHECKSUM, -- valida integridad durante el backup
FORMAT,
STATS = 10, -- progreso cada 10%
NAME = N'Backup automatico ViciadosMU';
-- Registra el backup en la tabla de log
INSERT INTO MuOnline.dbo.BackupLog (FechaHora, Archivo, Estado)
VALUES (GETDATE(), @FileName, 'OK');
PRINT 'Backup completado: ' + @FullPath;
END;
GO
BackupLog en la base MuOnline para tener un historial de cuándo se ejecutó cada backup. Si algún día el servidor se cuelga a la hora del backup, sabrás exactamente cuál fue el último exitoso.Paso 2 — Programar via SQL Server Agent
En SSMS, expande SQL Server Agent → Jobs → New Job. Configura:
- Nombre:
Backup_Automatico_MuOnline - Step 1: T-SQL, ejecuta
EXEC sp_BackupMuOnline - Schedule: Diario a las 03:00 (menor tráfico de jugadores)
Para backups incrementales cada 6 horas, crea un segundo schedule con frecuencia de 6 horas para un backup del transaction log (modo de recuperación Full requerido).
Enviando a la Nube con PowerShell
Con el archivo .bak guardado localmente, el siguiente paso es enviarlo automáticamente a almacenamiento en la nube. PowerShell nativo de Windows se integra con las principales opciones sin necesidad de software adicional.
Usando rclone para Múltiples Proveedores
rclone es una herramienta de línea de comandos gratuita y de código abierto que se conecta a Google Drive, Mega, Dropbox, OneDrive, servicios compatibles con S3 y decenas más. Es la opción más versátil para servidores MU.
# Script: BackupMuNube.ps1
# Ejecuta el backup SQL y lo sube a la nube via rclone
param(
[string]$BackupDir = "D:\Backups\MuOnline\",
[string]$RcloneDest = "gdrive:Backups/MuOnline/", # ajusta a tu remote
[int]$DiasRetencion = 7 # elimina backups locales con mas de 7 dias
)
$LogFile = "D:\Backups\Logs\backup_$(Get-Date -Format 'yyyyMM').log"
function Write-Log {
param([string]$Msg)
$line = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Msg"
Write-Host $line
Add-Content -Path $LogFile -Value $line
}
Write-Log "=== Iniciando backup automatico MuOnline ==="
# 1 → Ejecuta el backup en SQL Server
Write-Log "Generando backup de la base de datos..."
$SqlResult = sqlcmd -S localhost -Q "EXEC sp_BackupMuOnline" -b
if ($LASTEXITCODE -ne 0) {
Write-Log "ERROR: Fallo el backup SQL. Codigo: $LASTEXITCODE"
exit 1
}
Write-Log "Backup SQL completado con exito."
# 2 → Identifica el archivo mas reciente
$Archivo = Get-ChildItem -Path $BackupDir -Filter "*.bak" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
if (-not $Archivo) {
Write-Log "ERROR: No se encontro archivo .bak en $BackupDir"
exit 1
}
Write-Log "Archivo para enviar: $($Archivo.Name) ($([math]::Round($Archivo.Length/1MB,2)) MB)"
# 3 → Sube a la nube con rclone
Write-Log "Subiendo a la nube: $RcloneDest"
& rclone copy $Archivo.FullName $RcloneDest --progress --log-level INFO
if ($LASTEXITCODE -ne 0) {
Write-Log "ERROR: Fallo la subida. Verifica la configuracion de rclone."
exit 1
}
Write-Log "Subida completada con exito."
# 4 → Elimina backups locales antiguos (rotacion)
Write-Log "Eliminando backups locales con mas de $DiasRetencion dias..."
$Corte = (Get-Date).AddDays(-$DiasRetencion)
$Antiguos = Get-ChildItem -Path $BackupDir -Filter "*.bak" |
Where-Object { $_.LastWriteTime -lt $Corte }
foreach ($f in $Antiguos) {
Remove-Item $f.FullName -Force
Write-Log "Eliminado: $($f.Name)"
}
Write-Log "Rotacion completada. Backups eliminados: $($Antiguos.Count)"
Write-Log "=== Backup finalizado con exito ==="
Configurando rclone
Después de instalar rclone, ejecuta rclone config y sigue el asistente para configurar tu proveedor. Para Google Drive:
rclone config
→ n (nuevo remote)
→ Nombre: gdrive
→ Tipo: drive (Google Drive)
→ Sigue el flujo de autenticacion OAuth en el navegador
→ Confirma la configuracion
Para probar: rclone lsd gdrive: debería listar las carpetas de tu Google Drive.
Programando el Script en el Programador de Tareas de Windows
Con el script PowerShell listo, programa su ejecución automática:
- Abre Programador de Tareas (
taskschd.msc) - Haz clic en Crear Tarea Básica
- Configura:
- Nombre:
BackupMuOnlineNube - Disparador: Diario a las 03:30 (30 minutos después del backup SQL)
- Acción: Iniciar un programa
- Programa:
powershell.exe - Argumentos:
-NonInteractive -ExecutionPolicy Bypass -File "D:\Scripts\BackupMuNube.ps1"
- En Condiciones, desmarca "Iniciar la tarea solo si el equipo tiene alimentación de CA" (el VPS funciona 24h)
- En Configuración, marca "Ejecutar la tarea tan pronto como sea posible si se pierde un inicio programado"
svc_backup con acceso solo a las carpetas necesarias.Estrategia de Retención y Organización en la Nube
Mantener todos los backups para siempre consume espacio y dificulta encontrar el archivo correcto en una emergencia. Usa una estrategia por capas:
gdrive:Backups/MuOnline/
├── diario/ → ultimos 7 dias (reemplazados por la rotacion del script)
├── semanal/ → 1 backup por semana, retenidos por 4 semanas
└── mensual/ → 1 backup por mes, retenidos por 6 meses
Para poblar automáticamente las carpetas semanal y mensual, agrega al script PowerShell:
# Al final del script, despues de la subida exitosa:
# Backup semanal (todos los lunes)
if ((Get-Date).DayOfWeek -eq 'Monday') {
& rclone copy $Archivo.FullName "gdrive:Backups/MuOnline/semanal/" --progress
Write-Log "Backup semanal subido."
}
# Backup mensual (cada dia 1)
if ((Get-Date).Day -eq 1) {
& rclone copy $Archivo.FullName "gdrive:Backups/MuOnline/mensual/" --progress
Write-Log "Backup mensual subido."
}
Probando la Restauración
Un backup que nunca se ha probado puede ser inútil. Reserva tiempo una vez al mes para probar la restauración:
-- Restaura la base en un entorno de prueba (NUNCA en el servidor de produccion)
-- Primero, pon la base de destino fuera de linea o usa un nombre diferente
RESTORE DATABASE [MuOnline_Prueba]
FROM DISK = 'D:\Backups\MuOnline\MuOnline_20240115_0300.bak'
WITH
MOVE 'MuOnline' TO 'D:\TestDB\MuOnline_Prueba.mdf',
MOVE 'MuOnline_log' TO 'D:\TestDB\MuOnline_Prueba_log.ldf',
REPLACE,
STATS = 10;
-- Valida la integridad sin restaurar (mas rapido para verificacion rutinaria)
RESTORE VERIFYONLY
FROM DISK = 'D:\Backups\MuOnline\MuOnline_20240115_0300.bak'
WITH CHECKSUM;
RESTORE DATABASE apuntando a la base de produccion mientras el servidor MU está funcionando. Esto derrumbará el GameServer y corrompera datos. Usa siempre una base con nombre diferente (ej: MuOnline_Prueba) para pruebas de restauración.Monitoreo y Alertas
Configura alertas por correo electrónico para saber cuándo falla un backup:
# Agrega al final del script, en el bloque de manejo de errores:
function Envia-AlertaEmail {
param([string]$Asunto, [string]$Cuerpo)
$ServidorSmtp = "smtp.gmail.com"
$Puerto = 587
$De = "[email protected]"
$Para = "[email protected]"
$Credencial = New-Object PSCredential(
$De,
(ConvertTo-SecureString "TU_CONTRASENA_APP" -AsPlainText -Force)
)
Send-MailMessage `
-SmtpServer $ServidorSmtp `
-Port $Puerto `
-UseSsl `
-Credential $Credencial `
-From $De `
-To $Para `
-Subject $Asunto `
-Body $Cuerpo `
-Encoding UTF8
}
# Llama la funcion en caso de error:
# Envia-AlertaEmail "ERROR Backup MuOnline" "Backup fallo en $(Get-Date). Revisa el log: $LogFile"
Con este sistema completo tendrás: backup SQL automático a las 3:00, subida a la nube a las 3:30, rotación de archivos locales, retención por capas en la nube y alertas por correo en caso de fallo. Tus datos de personajes, cuentas, inventarios y configuraciones del servidor estarán protegidos incluso en escenarios de falla crítica de hardware.
Perguntas frequentes
¿Con qué frecuencia debo hacer backup del servidor?
Para servidores activos, realiza backups completos diariamente y backups incrementales cada 4-6 horas. La base de datos MU almacena personajes, cuentas, inventarios y progreso de quests — perder 6 horas de datos ya es suficiente para frustrar jugadores y dañar la reputación del servidor.
¿El backup automático impacta el rendimiento del servidor durante el proceso?
Depende del método. Un backup directo con BACKUP DATABASE en SQL Server genera I/O intenso en el disco. Para minimizar el impacto, programa los backups en las horas de menor tráfico (madrugada), usa compresión (WITH COMPRESSION) y, si es posible, escribe el backup en un disco físico separado antes de subirlo a la nube.
¿Qué archivos del servidor de MU necesito incluir en el backup además de la base de datos?
Además de la base SQL, incluye las carpetas Data\\ del GameServer (configuraciones de monstruos, spots, drops, Castle Siege), los archivos .ini y .xml del ConnectServer y JoinServer, los archivos de configuración del WebEngine o panel web, y cualquier script personalizado de evento o NPC que hayas editado.
¿Cómo verifico que el backup enviado a la nube está íntegro?
Siempre que sea posible, realiza una prueba de restauración mensual en un entorno separado. Para verificación rápida, compara el tamaño del archivo de backup con el esperado y, en el caso de backups SQL con CHECKSUM, usa RESTORE VERIFYONLY para validar la integridad sin restaurar completamente.
¿Cuál es el tamaño promedio de una base de datos de servidor MU S6?
Varía mucho con la antigüedad del servidor y el número de cuentas. Un servidor nuevo con pocas centenas de cuentas ocupa entre 500 MB y 2 GB. Servidores más antiguos con miles de cuentas y logs extensos pueden llegar a 10-20 GB. Monitorea el crecimiento para dimensionar correctamente el almacenamiento en la nube.