Mantenimiento Regular de Servidor de MU: Backup, Updates y Rutina
Aprende a crear rutinas de backup automatizado, aplicar updates con seguridad y mantener tu servidor MU Online estable y actualizado.
Por Qué el Mantenimiento Regular es Crítico
Un servidor privado de MU Online acumula datos, logs y fragmentación de base de datos a un ritmo acelerado. Sin mantenimiento periódico, enfrentarás lentitud progresiva, corrupción de datos de personajes y fallos en eventos como Blood Castle y Devil Square. Esta guía cubre los procedimientos esenciales que todo administrador necesita ejecutar semanalmente.
Parte 1: Backup de la Base de Datos
Paso 1 — Identificar las bases de datos del servidor
Tu servidor MU utiliza típicamente dos bases de datos principales en SQL Server:
MuOnline— datos de personajes, cuentas, ítems, guildsMeShop(oWebShop) — tienda online, cash points, transacciones
Abre SQL Server Management Studio (SSMS) y conéctate al servidor local (localhost o .\SQLEXPRESS).
Paso 2 — Crear backup manual mediante T-SQL
Ejecuta lo siguiente en SSMS (Query → New Query):
-- Backup completo de la base de datos MuOnline
BACKUP DATABASE [MuOnline]
TO DISK = 'C:\Backups\MuOnline_Full_' +
CONVERT(VARCHAR, GETDATE(), 112) + '.bak'
WITH FORMAT, COMPRESSION, STATS = 10;
-- Backup completo de la base de datos MeShop
BACKUP DATABASE [MeShop]
TO DISK = 'C:\Backups\MeShop_Full_' +
CONVERT(VARCHAR, GETDATE(), 112) + '.bak'
WITH FORMAT, COMPRESSION, STATS = 10;
C:\Backups\ antes de ejecutar el script. El parámetro COMPRESSION reduce el tamaño del archivo hasta en un 70%, lo que es esencial para no llenar el disco rápidamente.Paso 3 — Automatizar con SQL Server Agent
- En SSMS, expande SQL Server Agent → Jobs → New Job
- En General, asígnale el nombre:
Backup_Diario_MuOnline - En Steps → New Step:
- Type:
Transact-SQL script (T-SQL) - Pega el script del Paso 2
- En Schedules → New Schedule:
- Frequency:
Daily - Time:
03:00:00(horario de menor tráfico)
- Haz clic en OK para guardar el job
.bat que llame a sqlcmd.Paso 4 — Script .bat para backup mediante Programador de tareas (Express)
Crea C:\Scripts\backup_mu.bat:
@echo off
SET HORA=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
sqlcmd -S localhost\SQLEXPRESS -Q "BACKUP DATABASE [MuOnline] TO DISK='C:\Backups\MuOnline_%HORA%.bak' WITH FORMAT, COMPRESSION"
sqlcmd -S localhost\SQLEXPRESS -Q "BACKUP DATABASE [MeShop] TO DISK='C:\Backups\MeShop_%HORA%.bak' WITH FORMAT, COMPRESSION"
echo Backup completado el %DATE% %TIME% >> C:\Logs\backup_log.txt
En el Programador de tareas: Crear tarea → Desencadenadores → Diario → 03:00 → Acciones → Iniciar un programa → apunta a C:\Scripts\backup_mu.bat.
Parte 2: Backup de los Archivos del Servidor
Paso 5 — Estructura de directorios a preservar
Los directorios críticos varían según la versión, pero en Season 6 estándar son:
C:\MuServer\
├── GameServer\
│ ├── Data\ ← configuraciones de monstruos, mapas, drops
│ ├── GameServer.ini ← archivo de configuración principal
│ └── *.cfg ← archivos de configuración de eventos
├── ConnectServer\
│ └── ConnectServer.ini
├── DataServer\
│ └── DataServer.ini
└── EventServer\
└── EventServer.cfg
Paso 6 — Script de backup de archivos
Crea C:\Scripts\backup_files.bat:
@echo off
SET DEST=C:\Backups\Files\%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
mkdir "%DEST%"
xcopy "C:\MuServer\GameServer\Data\" "%DEST%\GameServer\Data\" /E /Y /Q
xcopy "C:\MuServer\GameServer\*.ini" "%DEST%\GameServer\" /Y /Q
xcopy "C:\MuServer\GameServer\*.cfg" "%DEST%\GameServer\" /Y /Q
xcopy "C:\MuServer\ConnectServer\" "%DEST%\ConnectServer\" /E /Y /Q
xcopy "C:\MuServer\DataServer\" "%DEST%\DataServer\" /E /Y /Q
echo Backup de archivos: %DATE% %TIME% >> C:\Logs\backup_log.txt
Parte 3: Limpieza y Optimización de la Base de Datos
Paso 7 — Eliminar logs y personajes inactivos
Los logs acumulados ralentizan las consultas e inflan la base de datos. Ejecuta mensualmente:
-- Eliminar logs de conexión con más de 90 días
DELETE FROM MuOnline.dbo.T_Log_Connectinfo
WHERE ConnectDate < DATEADD(DAY, -90, GETDATE());
-- Eliminar logs de chat con más de 30 días
DELETE FROM MuOnline.dbo.T_Log_Chat
WHERE LogDate < DATEADD(DAY, -30, GETDATE());
-- Eliminar cuentas que nunca iniciaron sesión después de 180 días del registro
DELETE FROM MuOnline.dbo.MEMB_INFO
WHERE mail_chek = '0'
AND memb_joindate < DATEADD(DAY, -180, GETDATE());
SELECT COUNT(*) con la misma cláusula WHERE antes del DELETE para confirmar cuántos registros se eliminarán.Paso 8 — Reconstruir índices fragmentados
-- Verificar la fragmentación de los índices
SELECT
OBJECT_NAME(ips.object_id) AS TableName,
i.name AS IndexName,
ips.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID('MuOnline'), NULL, NULL, NULL, 'LIMITED') ips
JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE ips.avg_fragmentation_in_percent > 30
ORDER BY ips.avg_fragmentation_in_percent DESC;
-- Reconstruir todos los índices de la base de datos MuOnline
USE MuOnline;
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REBUILD WITH (ONLINE = OFF)';
Paso 9 — Reducir el log de transacciones
USE MuOnline;
-- Truncar el log de transacciones
BACKUP LOG [MuOnline] TO DISK = 'NUL';
DBCC SHRINKFILE (MuOnline_log, 1);
Parte 4: Aplicación de Updates del Servidor
Paso 10 — Procedimiento seguro de actualización de archivos
Nunca reemplaces archivos con el servidor en línea. Sigue esta secuencia:
- Anuncia el mantenimiento en tu sitio web/Discord con 30 minutos de anticipación
- Guarda el estado actual: ejecuta
CHECKPOINTen SSMS - Detén los servicios en el orden correcto:
- Cierra
GameServer.exe - Cierra
EventServer.exe - Cierra
DataServer.exe - Cierra
ConnectServer.exe
- Haz backup de los archivos que serán reemplazados (Paso 6)
- Aplica los nuevos archivos
- Inicia los servicios en orden inverso: ConnectServer → DataServer → EventServer → GameServer
Paso 11 — Aplicar scripts SQL de actualización
Cuando el update incluye cambios en la base de datos (nuevas tablas, columnas o datos):
-- Siempre usa una transacción para poder revertir en caso de error
BEGIN TRANSACTION;
-- Ejemplo: agregar columna para un nuevo sistema
ALTER TABLE MuOnline.dbo.Character
ADD NewSystemPoints INT NOT NULL DEFAULT 0;
-- Ejemplo: insertar nuevos ítems en la tabla base de ítems
INSERT INTO MuOnline.dbo.Item_serial (Item_index, Item_name, Item_level)
VALUES (512, 'Nuevo Item', 0);
-- Si todo salió bien, confirma
COMMIT TRANSACTION;
-- Si hubo un error, revierte con:
-- ROLLBACK TRANSACTION;
Paso 12 — Verificar archivos de configuración después de un update
Tras una actualización, revisa los archivos .ini y .cfg para detectar nuevos parámetros que puedan haberse añadido. Compara el archivo nuevo con tu backup:
fc "C:\Backups\GameServer_anterior\GameServer.ini" "C:\MuServer\GameServer\GameServer.ini" > C:\Logs\diff_ini.txt
Parte 5: Rutina de Mantenimiento Semanal
Lista de verificación semanal recomendada
Lunes:
[x] Revisar logs de error del GameServer (GameServer\Log\)
[x] Verificar espacio disponible en disco (mínimo 20% libre)
[x] Confirmar que los backups automáticos se ejecutaron correctamente
Miércoles:
[x] Verificar conectividad: ConnectServer respondiendo en el puerto 44405
[x] Revisar la tabla T_Log_Hack en busca de intentos de exploit
[x] Monitorear el uso de memoria de GameServer.exe
Viernes:
[x] Backup manual completo antes del fin de semana
[x] Verificar eventos programados (Blood Castle, Devil Square)
[x] Probar restauración de backup en entorno separado (mensual)
Paso 13 — Monitorear eventos automáticos
Verifica que los horarios de los eventos sean correctos en GameServer\Data\Events\ o a través de la base de datos:
-- Verificar la configuración de horarios de Blood Castle
SELECT * FROM MuOnline.dbo.EventSchedule
WHERE EventName LIKE 'BloodCastle%'
ORDER BY EventTime;
-- Reiniciar el contador de Blood Castle si se bloquea
UPDATE MuOnline.dbo.EventSchedule
SET EventStatus = 0, CurrentCount = 0
WHERE EventName = 'BloodCastle';
GameServer\Data\Events\BloodCastle.ini con los horarios en formato HH:MM. Consulta la documentación de la versión específica de tu servidor.Solución de Problemas Comunes
GameServer no inicia después de un update: Revisa GameServer\Log\Error.log. La causa más común es una incompatibilidad de versión de DLL. Restaura las DLLs desde tu backup anterior.
Base de datos creciendo rápidamente: Ejecuta EXEC sp_spaceused en cada tabla para identificar la más grande. En general, T_Log_Connectinfo y T_Log_Chat son las responsables; aplica el DELETE del Paso 7.
ConnectServer no acepta conexiones: Verifica que el puerto 44405 esté abierto en el firewall de Windows y en el router. Usa netstat -an | findstr 44405 para confirmar que está escuchando.
Personajes desapareciendo tras reiniciar: Indica que el GameServer se está cerrando sin guardar. Agrega un tiempo de espera antes del cierre: usa el comando de guardado forzado en la consola del GameServer antes de cerrar el proceso.
Perguntas frequentes
¿Con qué frecuencia debo hacer backup de la base de datos?
Lo ideal es tener un backup incremental diario y un backup completo semanal. Para servidores activos, considera ejecutar backups cada 6 horas usando SQL Server Agent Jobs o un script .bat programado en el Programador de tareas de Windows.
¿Puedo aplicar updates de archivos con el servidor en línea?
Nunca reemplaces archivos del GameServer/ con el servidor en funcionamiento. Siempre detén todos los servicios (GameServer, ConnectServer, DataServer, EventServer) antes de reemplazar cualquier ejecutable o archivo .ini de configuración.
¿Qué hacer si la base de datos se corrompe después de un update SQL?
Ejecuta DBCC CHECKDB('MuOnline') en SQL Server Management Studio para verificar la integridad. Si hay errores, restaura el backup más reciente y aplica el script SQL nuevamente línea por línea para identificar el comando problemático.
¿Cómo verificar si el GameServer está consumiendo demasiada memoria?
En el Administrador de tareas (Ctrl+Shift+Esc), monitorea el proceso GameServer.exe. Un consumo superior a 2 GB en servidores Season 6 con menos de 200 jugadores indica un memory leak. Programa un reinicio automático mediante el Programador de tareas a las 04:00 como medida preventiva.