How to Update MuServer Version Without Losing Data
Complete guide to upgrading your MuServer to a newer version while preserving all player accounts, characters, and items safely with minimal downtime.
Updating MuServer from one version to another is one of the riskiest operations in private server administration. Done without planning, it results in permanent loss of player data. Done correctly, it is a controlled process that typically requires 2 to 4 hours of planned downtime.
This guide covers migration between compatible versions — for example, from Season 6 Episode 1 to Season 6 Episode 3, or from Season 9 to Season 12. Migrations between very distant seasons (e.g., S6 to S13) require additional intermediate steps not covered here and must be done in stages.
Before You Start: Assessing Compatibility
Not every MuServer update is straightforward. Database tables change between versions, and configuration files gain new mandatory keys.
Identifying your current version
Open GameServer/GameServer.ini and locate:
[Version]
ServerVersion = 1.04.0
GameVersion = 0.99.60T
Compare with the target version. If GameVersion changes significantly, there will be database schema changes that must be applied before starting the new binaries.
Identifying available migration scripts
Every MuServer package includes a DBUpdate/ or SQL/ folder with numbered migration scripts. Before proceeding, list those scripts:
DBUpdate/
001_AddColumnResetCount.sql
002_CreateTableEventRanking.sql
003_AlterTableCharacter.sql
004_InsertDefaultEventSchedule.sql
If the package does not include SQL scripts, you will need to manually compare schemas in SQL Server Management Studio (SSMS) — compare sys.columns on the current database versus a fresh database created with the new version.
Step 1: Full Backup — No Exceptions
Run in SSMS before any other action:
-- Full backup with automatic timestamp
DECLARE @BackupPath NVARCHAR(500)
SET @BackupPath = 'C:\Backups\MuOnline_pre_update_' +
REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), ':', '-'), ' ', '_') + '.bak'
BACKUP DATABASE MuOnline
TO DISK = @BackupPath
WITH FORMAT, INIT, COMPRESSION,
NAME = 'MuOnline Full Backup Pre-Update',
STATS = 10;
PRINT 'Backup saved to: ' + @BackupPath
After the backup, verify the file is not corrupted:
RESTORE VERIFYONLY FROM DISK = 'C:\Backups\MuOnline_pre_update_2026-07-03_22-00-00.bak';
-- Expected result: "The backup set on file 1 is valid."
RESTORE VERIFYONLY returns an error, the backup is corrupted. Do not proceed — investigate the disk space or permissions issue before continuing.Also back up configuration files:
xcopy /E /I /Y "C:\MuServer\GameServer\Data" "C:\Backups\GameServer_Data_backup"
xcopy /E /I /Y "C:\MuServer\ConnectServer" "C:\Backups\ConnectServer_backup"
xcopy /E /I /Y "C:\MuServer\DataServer" "C:\Backups\DataServer_backup"
xcopy /E /I /Y "C:\MuServer\EventServer" "C:\Backups\EventServer_backup"
Step 2: Shut Down All Services in the Correct Order
Shut down in this sequence to prevent corrupted data writes:
- Close the web admin panel (if running)
- Terminate
GameServer.exe— wait for the process to fully disappear from Task Manager - Terminate
EventServer.exe - Terminate
DataServer.exe - Terminate
ConnectServer.exe
net stop MuGameServer, net stop MuDataServer, net stop MuConnectServer. Adjust service names to match your setup. Verify in services.msc that all services show "Stopped" status before continuing.Step 3: Create a Test Database and Validate SQL Scripts
Never apply migration scripts directly to the production database without testing first. Restore a test copy:
RESTORE DATABASE MuOnline_Test
FROM DISK = 'C:\Backups\MuOnline_pre_update_2026-07-03_22-00-00.bak'
WITH MOVE 'MuOnline' TO 'C:\SQLData\MuOnline_Test.mdf',
MOVE 'MuOnline_log' TO 'C:\SQLData\MuOnline_Test_log.ldf',
REPLACE, STATS = 10;
With the test database ready, run the migration scripts in numerical order. Typical script for adding a new column:
USE MuOnline_Test;
GO
-- 001_AddColumnResetCount.sql
IF NOT EXISTS (
SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Character' AND COLUMN_NAME = 'ResetCount'
)
BEGIN
ALTER TABLE dbo.Character ADD ResetCount SMALLINT NOT NULL DEFAULT 0;
PRINT 'OK: Column ResetCount added.';
END
ELSE
PRINT 'SKIP: Column ResetCount already exists.';
GO
IF NOT EXISTS before ALTER TABLE ADD COLUMN and IF OBJECT_ID IS NULL before CREATE TABLE. Idempotent scripts can be re-run without breaking the database, which is essential when recovering from partial errors.Example script to create a new event ranking table:
-- 002_CreateTableEventRanking.sql
USE MuOnline_Test;
GO
IF OBJECT_ID('dbo.EventRanking', 'U') IS NULL
BEGIN
CREATE TABLE dbo.EventRanking (
RankID INT IDENTITY(1,1) PRIMARY KEY,
CharName VARCHAR(10) NOT NULL,
EventType TINYINT NOT NULL, -- 1=BloodCastle, 2=DevilSquare, 3=ChaosC
Score INT NOT NULL DEFAULT 0,
RankDate DATETIME NOT NULL DEFAULT GETDATE(),
ServerCode TINYINT NOT NULL DEFAULT 0
);
PRINT 'OK: Table EventRanking created.';
END
ELSE
PRINT 'SKIP: Table EventRanking already exists.';
GO
After running each script, check the "Messages" tab in SSMS. Any line with Msg followed by an error number must be investigated before proceeding.
Step 4: Replace Server Binaries
With scripts validated on the test database, replace the executables. Target structure:
C:\MuServer\
GameServer\
GameServer.exe <- replace with new
GameServer.ini <- MERGE (compare and transfer your values)
Data\
Monster\ <- replace all contents with new version
Events\ <- replace all contents with new version
Maps\ <- replace all contents with new version
ConnectServer\
ConnectServer.exe <- replace with new
ConnectServer.ini <- MERGE (check for new keys)
DataServer\
DataServer.exe <- replace with new
DataServer.ini <- MERGE (confirm connection string)
EventServer\
EventServer.exe <- replace with new
.ini configuration files without comparing the differences. Use WinMerge (free tool) to diff the old .ini (from backup) against the new one: copy new keys into your existing file while keeping your custom values for IP, port, server name, and rates.Typical diff in GameServer.ini when upgrading to Season 9+:
; NEW key in the target version — add to your GameServer.ini
[RefinementSystem]
Enable = 1
MaxRefinementLevel = 15
RefinementFailRate = 30
; EXISTING key — keep your current value
[GameServerInfo]
ServerCode = 0
MaxUser = 300
ServerName = Your MU Server
Step 5: Set Database Compatibility Level (if needed)
If the new MuServer version requires a specific SQL Server compatibility level:
-- Check current level
SELECT name, compatibility_level FROM sys.databases WHERE name = 'MuOnline';
-- SQL Server 2008 / Season 6 (level 100)
ALTER DATABASE MuOnline SET COMPATIBILITY_LEVEL = 100;
-- SQL Server 2012 / Newer seasons (level 110)
-- ALTER DATABASE MuOnline SET COMPATIBILITY_LEVEL = 110;
-- SQL Server 2017/2019 (level 140)
-- ALTER DATABASE MuOnline SET COMPATIBILITY_LEVEL = 140;
Step 6: Apply Migration to Production Database
After full validation on the test database, apply the same scripts to the real database:
USE MuOnline;
GO
-- Run scripts in order:
-- 001_AddColumnResetCount.sql
-- 002_CreateTableEventRanking.sql
-- 003_AlterTableCharacter.sql
-- (etc.)
Step 7: Start Services and Validate
Start in the correct order:
ConnectServer.exeDataServer.exeEventServer.exeGameServer.exe
Monitor logs immediately after each start:
GameServer\Log\GameServer_YYYYMMDD.log
DataServer\Log\DataServer_YYYYMMDD.log
Most common errors and their causes:
[ERROR] Table 'Character' column 'ResetCount' not found
→ Script 001 was not applied to the production database. Run it on MuOnline.
[ERROR] Could not connect to DataServer on 127.0.0.1:55900
→ DataServer did not start or port changed. Check DataServer.ini and restart.
[ERROR] Map file not found: Data/Maps/Devias.att
→ New version map files were not copied. Repeat Step 4.
Run post-migration validation queries:
USE MuOnline;
-- Character count (compare with pre-migration numbers)
SELECT COUNT(*) AS TotalCharacters FROM Character;
-- Verify item integrity
SELECT COUNT(*) AS CharactersWithoutItems
FROM Character
WHERE Items IS NULL OR DATALENGTH(Items) = 0;
-- Expected result: 0
-- Verify guilds are intact
SELECT COUNT(*) AS TotalGuilds FROM Guild;
-- Clear stuck sessions (common after restart)
UPDATE MEMB_STAT SET ConnectStat = 0, ServerName = '' WHERE ConnectStat = 1;
Event Verification After Migration
If events are not triggering at the correct times:
USE MuOnline;
-- Check event schedules configured in the database
SELECT * FROM EventSchedule ORDER BY EventType;
-- Reconfigure Blood Castle schedule (EventType = 1)
UPDATE EventSchedule
SET StartTime1 = '09:00', StartTime2 = '13:00',
StartTime3 = '17:00', StartTime4 = '21:00',
Duration = 60
WHERE EventType = 1;
-- Reconfigure Devil Square schedule (EventType = 2)
UPDATE EventSchedule
SET StartTime1 = '10:00', StartTime2 = '14:00',
StartTime3 = '18:00', StartTime4 = '22:00',
Duration = 30
WHERE EventType = 2;
If events are configured via .ini files instead of the database (common in older Season 6 builds):
; GameServer\Data\Events\BloodCastle.ini
[BloodCastle]
Enable = 1
Open_Time1 = 09:00
Close_Time1 = 10:00
Open_Time2 = 13:00
Close_Time2 = 14:00
Open_Time3 = 17:00
Close_Time3 = 18:00
Open_Time4 = 21:00
Close_Time4 = 22:00
MaxUser_BC1 = 10
MaxUser_BC7 = 10
A successful update results in a server running the new version with all player data intact. Reserve at least 30 minutes of GM testing before announcing the reopening — problems discovered with a full server are exponentially harder to resolve under player pressure.
Perguntas frequentes
Do I need to reinstall SQL Server when updating MuServer?
No. The database remains intact. You replace the server binaries (GameServer/, ConnectServer/, DataServer/) and apply SQL migration scripts to the existing tables. SQL Server itself is not reinstalled.
Which SQL Server version is recommended for Season 6?
SQL Server 2008 R2 or 2012 are the most stable for Season 6. Newer versions (2017/2019) work but may require a compatibility adjustment via: ALTER DATABASE MuOnline SET COMPATIBILITY_LEVEL = 100;
What if GameServer crashes after the update with 'MapServer connect failed'?
Check GameServer/GameServer.ini, section [MapServer], and confirm that MapServerIP and MapServerPort match the new configuration. In Season 6+, MapServer is a separate process and must start before GameServer.
How do I roll back to the previous version if something goes wrong?
Restore the backup in SSMS: RESTORE DATABASE MuOnline FROM DISK = 'C:\\Backups\\MuOnline_pre_update.bak' WITH REPLACE; Then put back the old binaries from the backup folder created in Step 1.