How to migrate your MU Online server from a VPS to a dedicated server
Plan and execute the migration of your MU Online server from a shared VPS to a dedicated server, with a hardware checklist, DNS cutover, database migration, and a maintenance window with zero data loss.
Migrating a private MU Online server from a VPS to a dedicated server is the natural next step when the community grows and shared CPU, disk IO, and network limits start causing lag, login timeouts, and freezes during peak hours. Unlike a simple plan upgrade, this migration involves switching physic
Migrating a private MU Online server from a VPS to a dedicated server is the natural next step when the community grows and shared CPU, disk IO, and network limits start causing lag, login timeouts, and freezes during peak hours. Unlike a simple plan upgrade, this migration involves switching physical hosts, which usually means a new IP, a fresh OS install, and the need to move an entire MySQL database without losing a single character. This tutorial covers hardware planning, preparing the new environment, migrating data and files, the DNS switch, and the final cutover with the smallest possible downtime, plus the mistakes that most often derail this migration in practice.
Why migrate from VPS to dedicated
A VPS shares CPU, disk, and network with other VPS instances on the same physical host, even when the plan promises "guaranteed" resources. On a MU server with many concurrent players, MySQL handles a high volume of queries per second (login, movement, trade guards, PK logs), and it's precisely the shared disk IO that tends to be the bottleneck — not CPU. A dedicated server delivers exclusive disk (ideally NVMe) and network, eliminating the "noisy neighbor" that steals performance during peak hours. Dedicated servers also tend to have larger network links and more stable routing, reducing the latency spikes players feel as "ping spikes."
Assessing whether the timing is right
Before spending money on a dedicated server, measure the actual symptoms. A top/htop showing high IO wait during peak hours, together with slow queries in MySQL's slow_query_log, is the main indicator that the VPS is the bottleneck, not your poorly indexed database. It's worth confirming this first, because migrating to a dedicated server doesn't fix poorly written queries — it only buys more hardware headroom.
| Sign | Indicates migration is needed? | How to confirm |
|---|---|---|
| CPU constantly above 80% at peak | Yes, if queries are already optimized | htop / vmstat at peak hours |
| High IO wait, disk isn't NVMe | Yes, strong indication | iostat -x 1 |
| Database missing indexes | Not yet — optimize first | EXPLAIN on the slowest queries |
| Network with latency spikes for multiple countries | Depends on the datacenter, not just the host | mtr/traceroute |
| Fewer than 100 CCU and no reported lag | No, the VPS is still fine | Community feedback + metrics |
Choosing the dedicated server hardware
For a MU Online server with hundreds of concurrent players, the real bottleneck is almost always disk IO and RAM available for MySQL to cache, not raw CPU. Prioritize NVMe disk in RAID 1 (redundancy), at least 32 GB of RAM (so the InnoDB buffer pool can grow comfortably), and a CPU with good per-core clock speed (the GameServer and MySQL scale better with high clock speed than with many weak cores).
| Item | Recommended minimum | Ideal for 300+ CCU |
|---|---|---|
| CPU | 4 cores, high clock | 8 cores, high clock |
| RAM | 16 GB | 32-64 GB |
| Disk | SATA SSD | NVMe in RAID 1 |
| Network | 100 Mbps dedicated | 1 Gbps dedicated |
| Datacenter | 99.9% declared uptime | Power and link redundancy |
Planning the maintenance window
Announce the date and time at least 3-5 days in advance, across every channel (Discord, website, launcher). Choose the lowest-traffic time (usually the middle of the night) and estimate the real duration based on a dry-run — not just an optimistic guess. A common mistake is announcing "30 minutes" and having the actual migration take 3 hours because the database dump was never tested beforehand.
Preparing the dedicated server before cutover
All the heavy lifting should happen before taking the old server offline. That includes: installing the operating system, configuring MySQL/MariaDB with the same (or compatible) versions as the source, installing the MuServer/emulator, copying the game's static files (Data/, configs, maps), and running a full boot test of GameServer and ConnectServer pointed at a test database. Only after that test passes should you schedule the real window.
# On the new dedicated server, test that MySQL comes up correctly
sudo systemctl status mysql
mysql -u root -p -e "SHOW VARIABLES LIKE 'version';"
# Validate available disk space before the migration
df -h
Migrating the MySQL database with zero data loss
The most critical step. After putting the server into real maintenance (ConnectServer refusing new logins), generate the full dump:
# On the source VPS, after blocking new logins
mysqldump -u root -p --single-transaction --routines --triggers MuOnline > mu_dump_final.sql
# Validate size and integrity before transferring
ls -lh mu_dump_final.sql
md5sum mu_dump_final.sql
Transfer the dump via rsync or scp to the dedicated server (never by email or third-party upload service, given the volume and sensitivity of account data). At the destination, restore it and check the md5sum of the received file before importing:
scp mu_dump_final.sql user@dedicated-server-ip:/backup/
mysql -u root -p MuOnline < mu_dump_final.sql
After importing, run a sanity check: character count, account count, and the last logged login date should match what existed at the source at the moment of the dump.
Migrating static files and configs
Besides the database, copy the entire server folder (GameServer/ConnectServer/JoinServer executables, .txt/.xml config files, maps, and any custom event scripts). Use rsync -avz to preserve permissions and avoid silent corruption on large binary files. Review MySQL connection strings in each config — the dedicated server will have a different local IP (or socket) from the VPS.
Adjusting DNS and the client's fixed IP
Update your domain's A record to the new dedicated server IP, and lower the DNS TTL to something low (300 seconds) a few days before the migration, so propagation is fast at cutover time. If the game client uses a hardcoded fixed IP instead of a domain (common in many launchers), you'll need to distribute a client or launcher update with the new IP — plan for this with extra lead time, since DNS propagation doesn't solve this case.
| Item to update | Where | Recommended timing |
|---|---|---|
| Domain A record | DNS panel | Lower TTL 3-5 days before |
| Fixed IP in client/launcher | Launcher config | Distribute before cutover |
| Dedicated server firewall | ufw/iptables | Before opening to the public |
| GameServer/ConnectServer ports | Firewall and router | Tested with a dry-run |
Executing the cutover
- Announce the start of maintenance and block new logins on the old VPS.
- Generate the final MySQL dump and validate the checksum.
- Transfer the dump and files to the dedicated server.
- Restore the database and confirm the sanity counts.
- Bring up GameServer, ConnectServer, and JoinServer on the dedicated server and test login with a GM account.
- Update DNS (or distribute the new IP via the launcher).
- Keep the old VPS running, not accepting logins, for 24-48h as a fallback.
- Announce completion and monitor the dedicated server through the first peak hours.
Keeping the old VPS as a temporary fallback
Don't shut down or cancel the VPS right away. Keep it active (not receiving game traffic) for at least 24 to 48 hours after cutover, with the most recent dump also stored there. If something critical fails on the dedicated server, you can quickly revert DNS while you investigate, instead of losing your player base entirely.
Common errors and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Characters "missing" after migration | Dump taken while the server was still accepting logins | Always block login before the final dump |
| GameServer can't connect to MySQL on the dedicated server | Connection string still points to the old IP | Update host/socket in the config |
| Players can't log in after cutover | DNS hasn't propagated or TTL is high | Lower TTL days beforehand; test with nslookup |
| Lag persists even on the dedicated server | MySQL config not migrated/optimized | Review my.cnf/buffer pool at the destination |
| Firewall blocking game ports | Rules not replicated on the dedicated server | Check ufw/iptables before announcing |
Migration checklist
- Bottleneck symptoms confirmed (IO wait, CPU, slow queries).
- Dedicated server hardware sized and provisioned.
- Full dry-run done before the real window.
- Maintenance window announced in advance.
- MySQL dump generated after login block, with checksum validated.
- Static files and configs migrated via rsync.
- DNS/IP updated and tested.
- Old VPS kept as fallback for 24-48h.
With the server now running stably on the dedicated hardware, the next step is to revisit your backup and monitoring strategy now that you have full control over the hardware — and, if you don't yet have a documented process from scratch, it's worth reviewing the MU Online server creation tutorial to check whether anything got left behind in the new infrastructure.
Frequently asked questions
When does it make sense to move from a VPS to a dedicated server?
When the server consistently passes 150-200 concurrent players, or when you notice CPU/IO spikes on the VPS during peak hours even after optimizing MySQL. If the monthly cost of a dedicated server is lower than an equally sized VPS, it's also time to migrate.
How much downtime should I expect during the migration?
With planning and a prior dry-run, the actual maintenance window stays between 30 minutes and 2 hours, depending on database size. Most of the work (provisioning the dedicated server, installing dependencies, testing) happens beforehand, without taking the server offline.
Do I need to change the server's IP?
Yes, almost always, because the dedicated server has its own IP different from the VPS. This requires updating the domain's DNS and, usually, the fixed IP inside the game client (connection config file), so notify the community in advance.
How do I avoid losing characters and items during the migration?
Take the final MySQL dump only after putting the server into maintenance mode (no new connections), validate the dump's hash/size, and only then take down the old server. Never migrate while the source server is still accepting logins.
Is it worth migrating to a rented dedicated server or building my own hardware?
A rented dedicated server (bare metal in a datacenter) has better uptime, power and link redundancy, and hardware support — it generally pays off more than home-built hardware, which suffers from power outages and limited residential upload.