Migrar e otimizar o banco de dados SQL do servidor de MU
Migre o banco de dados do servidor de MU Online entre servidores, atualize entre versões do SQL Server, e otimize performance com índices, manutenção e ajustes de configuração.
Migrar e otimizar o banco de dados é necessário quando você move o servidor para uma nova VPS, atualiza a versão do SQL Server, ou está enfrentando lentidão que afeta a performance dos jogadores.
Migrar e otimizar o banco de dados é necessário quando você move o servidor para uma nova VPS, atualiza a versão do SQL Server, ou está enfrentando lentidão que afeta a performance dos jogadores.
Entendendo os bancos do MU Online
Um servidor de MU Online usa múltiplos bancos de dados:
| Banco | Conteúdo principal | Tabelas críticas |
|---|---|---|
MuOnline | Personagens, inventários, contas | Character, Character_Items, MEMB_INFO |
MuEvent | Eventos (Blood Castle, DS, CC) | EventChipInventory, EventPoint |
MuCastle | Castle Siege | T_CastleSiege, T_CastleSiegeWar |
MUDB (em alguns) | Dados gerais do servidor | varia |
Passo 1 — Fazer backup antes de qualquer migração
NUNCA migre sem backup. Um erro de migração pode ser irreversível.
Backup completo via SSMS
- No SSMS, clique com direito em MuOnline → Tasks → Back Up;
- Backup type: Full;
- Destination: adicione um caminho local (ex:
C:\Backups\MuOnline_pre_migracao.bak); - Clique OK.
Backup via T-SQL (mais confiável)
-- Backup do banco principal
BACKUP DATABASE MuOnline
TO DISK = 'C:\Backups\MuOnline_pre_migracao.bak'
WITH FORMAT, -- sobrescreve backups anteriores no mesmo arquivo
COMPRESSION, -- comprime o arquivo (SQL 2008+)
CHECKSUM, -- verifica integridade
STATS = 10; -- mostra progresso a cada 10%
-- Backup de todos os bancos do servidor de MU
BACKUP DATABASE MuEvent TO DISK = 'C:\Backups\MuEvent.bak' WITH FORMAT, COMPRESSION;
BACKUP DATABASE MuCastle TO DISK = 'C:\Backups\MuCastle.bak' WITH FORMAT, COMPRESSION;
-- Verificar integridade do backup
RESTORE VERIFYONLY FROM DISK = 'C:\Backups\MuOnline_pre_migracao.bak';
Passo 2 — Migração entre servidores (mover VPS)
Copiar o backup para a nova VPS
# Do servidor antigo para o novo via SCP (Linux)
scp C:\Backups\MuOnline_pre_migracao.bak root@NOVO_IP:/backups/
# Via FileZilla: conectar na nova VPS via SFTP e fazer upload
Restaurar na nova VPS
-- Na nova VPS, restaurar o banco
RESTORE DATABASE MuOnline
FROM DISK = 'C:\Backups\MuOnline_pre_migracao.bak'
WITH MOVE 'MuOnline' TO 'C:\SQL\Data\MuOnline.mdf',
MOVE 'MuOnline_log' TO 'C:\SQL\Log\MuOnline_log.ldf',
STATS = 10;
-- Se der erro "already exists", usar REPLACE
RESTORE DATABASE MuOnline
FROM DISK = 'C:\Backups\MuOnline_pre_migracao.bak'
WITH REPLACE, -- sobrescreve banco existente
MOVE 'MuOnline' TO 'C:\SQL\Data\MuOnline.mdf',
MOVE 'MuOnline_log' TO 'C:\SQL\Log\MuOnline_log.ldf',
STATS = 10;
MuOnline e MuOnline_log) devem corresponder exatamente ao que está no banco original. Para descobrir os nomes corretos, execute antes do RESTORE: RESTORE FILELISTONLY FROM DISK = 'C:\Backups\MuOnline_pre_migracao.bak'Verificar após restauração
-- Verificar se o banco foi restaurado corretamente
SELECT name, state_desc, recovery_model_desc
FROM sys.databases
WHERE name = 'MuOnline';
-- Deve mostrar: MuOnline | ONLINE | SIMPLE (ou FULL)
-- Contar personagens (sanidade)
USE MuOnline;
SELECT COUNT(*) AS TotalPersonagens FROM Character;
SELECT COUNT(*) AS TotalContas FROM MEMB_INFO;
Passo 3 — Migração entre versões do SQL Server
SQL 2000 → SQL 2008 R2 → SQL 2014/2017
Impossível ir direto do SQL 2000 ao SQL 2014 — o SQL 2014 não lê backups do SQL 2000. A rota é:
SQL Server 2000 → restaurar em SQL 2008 R2 → atualizar compat → restaurar em SQL 2014
Passo a passo
-- 1. Restaurar o backup do SQL 2000 no SQL 2008 R2
-- (fazer no servidor com SQL 2008 instalado)
RESTORE DATABASE MuOnline
FROM DISK = 'C:\Backups\MuOnline_sql2000.bak';
-- 2. Verificar nível de compatibilidade atual
SELECT name, compatibility_level FROM sys.databases WHERE name = 'MuOnline';
-- SQL 2000 = 80, SQL 2005 = 90, SQL 2008 = 100
-- 3. Atualizar compatibilidade para SQL 2008
ALTER DATABASE MuOnline SET COMPATIBILITY_LEVEL = 100;
-- 4. Fazer backup desse banco já no nível 100
BACKUP DATABASE MuOnline TO DISK = 'C:\Backups\MuOnline_compat100.bak' WITH FORMAT;
-- 5. Restaurar no SQL 2014/2017
-- (fazer no servidor com SQL 2014/2017)
RESTORE DATABASE MuOnline FROM DISK = 'C:\Backups\MuOnline_compat100.bak';
-- 6. Atualizar para compatibilidade SQL 2014/2017
ALTER DATABASE MuOnline SET COMPATIBILITY_LEVEL = 120; -- SQL 2014
-- ou: SET COMPATIBILITY_LEVEL = 140 -- SQL 2017
Atualizar ODBC após migrar SQL
Depois de instalar uma nova versão do SQL Server, o ODBC 32-bit precisa ser reconfigurado:
- Abra
C:\Windows\SysWOW64\odbcad32.exe(SEMPRE usar esse, não o padrão); - Vá em System DSN → selecione a DSN existente → Configure;
- Aponte para o novo servidor SQL;
- Para SQL 2017/2019: use driver ODBC Driver 17 for SQL Server;
- Para SQL 2008/2014: use driver SQL Server Native Client 10.0/11.0.
Passo 4 — Otimizar performance do banco
Identificar queries lentas
-- Queries mais lentas nos últimos dias (requer SQL 2008+)
SELECT TOP 20
total_elapsed_time / execution_count / 1000.0 AS avg_ms,
execution_count,
SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY avg_ms DESC;
-- Ver esperas atuais (o que o SQL está esperando)
SELECT wait_type, wait_time_ms, waiting_tasks_count
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('SLEEP_TASK','BROKER_TO_FLUSH','BROKER_TASK_STOP',
'CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE','FT_IFTS_SCHEDULER_IDLE_WAIT',
'HADR_WORK_QUEUE','ONDEMAND_TASK_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH',
'RESOURCE_QUEUE','SERVER_IDLE_CHECK','SLEEP_DBSTARTUP','SLEEP_DCOMSTARTUP',
'SLEEP_MASTERDBREADY','SLEEP_MASTERMDREADY','SLEEP_MASTERUPGRADED',
'SLEEP_MSDBSTARTUP','SLEEP_SYSTEMTASK','SLEEP_TEMPDBSTARTUP',
'SNI_HTTP_ACCEPT','SP_SERVER_DIAGNOSTICS_SLEEP','SQLTRACE_BUFFER_FLUSH',
'WAITFOR','XE_DISPATCHER_WAIT','XE_TIMER_EVENT')
ORDER BY wait_time_ms DESC;
Criar índices essenciais
A tabela Character é a mais consultada — índices aqui têm maior impacto:
USE MuOnline;
GO
-- Índice em ConnectStat (usado em TODAS as queries de jogadores online)
CREATE INDEX IX_Character_ConnectStat
ON Character (ConnectStat)
INCLUDE (Name, Class, cLevel);
-- Índice em AccountID (busca de personagens por conta)
CREATE INDEX IX_Character_AccountID
ON Character (AccountID)
INCLUDE (Name, Class, cLevel);
-- Índice para ranking de level
CREATE INDEX IX_Character_Level
ON Character (cLevel DESC)
WHERE ConnectStat = 0 -- apenas personagens offline (ranking geral)
INCLUDE (Name, Class, AccountID);
-- Índice de resets (se o servidor tem sistema de reset)
-- Verificar se a coluna existe antes de criar:
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID('Character') AND name = 'Resets')
BEGIN
CREATE INDEX IX_Character_Resets
ON Character (Resets DESC)
INCLUDE (Name, Class, cLevel);
END;
-- Índice na tabela MEMB_INFO para login
CREATE INDEX IX_MEMB_INFO_Login
ON MEMB_INFO (memb_id)
INCLUDE (memb_pw, bloc_code);
-- Índice na tabela de itens (muitas transações)
CREATE INDEX IX_Items_AccountID
ON Character_Items (AccountID)
INCLUDE (ItemGroup, ItemNumber, ItemLevel, ItemDurability);
Verificar e reconstruir índices fragmentados
-- Ver fragmentação dos índices
SELECT
OBJECT_NAME(ips.object_id) AS Tabela,
i.name AS Indice,
ips.avg_fragmentation_in_percent AS Fragmentacao
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 > 10 -- só os fragmentados
ORDER BY ips.avg_fragmentation_in_percent DESC;
-- Reconstruir índices fragmentados acima de 30%
ALTER INDEX ALL ON Character REBUILD;
ALTER INDEX ALL ON Character_Items REBUILD;
ALTER INDEX ALL ON MEMB_INFO REBUILD;
-- Reorganizar índices entre 10-30% de fragmentação (menos agressivo)
ALTER INDEX ALL ON Character REORGANIZE;
Configurações do SQL Server para melhor performance
-- Configurar memória máxima do SQL Server (deixar ~1-2 GB para o OS)
-- Ex: em uma VPS de 8 GB, deixar 1.5 GB para o OS → 6.5 GB para SQL
EXEC sp_configure 'max server memory', 6500; -- em MB
RECONFIGURE;
-- Habilitar parallelism para queries pesadas
EXEC sp_configure 'max degree of parallelism', 4; -- usar até 4 CPUs
RECONFIGURE;
-- Otimizar para processamento de queries ad-hoc
EXEC sp_configure 'optimize for ad hoc workloads', 1;
RECONFIGURE;
-- Ver configuração atual
SELECT name, value_in_use FROM sys.configurations
WHERE name IN ('max server memory (MB)', 'max degree of parallelism');
Manutenção do banco (defrag + estatísticas)
-- Script de manutenção completa (executar semanalmente, de madrugada)
USE MuOnline;
GO
-- 1. Atualizar estatísticas de todas as tabelas
EXEC sp_updatestats;
-- 2. Reconstruir índices
ALTER INDEX ALL ON Character REBUILD WITH (ONLINE = OFF, FILLFACTOR = 80);
ALTER INDEX ALL ON MEMB_INFO REBUILD WITH (ONLINE = OFF, FILLFACTOR = 80);
-- 3. Limpar planos de execução em cache (forçar recompilação)
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
-- 4. Verificar integridade física do banco
DBCC CHECKDB ('MuOnline') WITH NO_INFOMSGS;
Passo 5 — Limpeza de dados antigos
Bancos de MU crescem muito com logs e sessões antigas:
-- Limpar personagens sem login há mais de 1 ano (cuidado!)
-- PRIMEIRO verificar quantos seriam afetados:
SELECT COUNT(*) FROM MEMB_INFO
WHERE DATEDIFF(DAY, memb_lDate, GETDATE()) > 365;
-- Limpar conectStat travado (personagens "online" após crash)
UPDATE Character SET ConnectStat = 0 WHERE ConnectStat = 1;
-- Verificar logs de transações que cresceram muito
SELECT name, log_size_mb = size * 8.0 / 1024
FROM sys.master_files
WHERE type = 1; -- type 1 = log file
-- Encolher log de transações (se estiver muito grande)
USE MuOnline;
CHECKPOINT;
DBCC SHRINKFILE (MuOnline_log, 1024); -- encolher para ~1 GB
Checklist de migração
PRÉ-MIGRAÇÃO
[ ] Backup completo de todos os bancos (.bak)
[ ] Backup verificado com RESTORE VERIFYONLY
[ ] Anotar: versão do SQL, nome dos bancos, nomes das DSNs
MIGRAÇÃO
[ ] Novo SQL Server instalado e configurado
[ ] Bancos restaurados com RESTORE DATABASE
[ ] Nível de compatibilidade atualizado (se necessário)
[ ] ODBC 32-bit reconfigurado (C:\Windows\SysWOW64\odbcad32.exe)
PÓS-MIGRAÇÃO
[ ] Testar conexão do DataServer ao SQL
[ ] Testar login de personagem
[ ] Verificar contagem de personagens/contas
[ ] Criar índices essenciais
[ ] Configurar backup automático no novo servidor
[ ] Testar backup e restore de teste
PERFORMANCE
[ ] Índices criados em Character e MEMB_INFO
[ ] Memória do SQL Server configurada
[ ] SQL Agent com job de manutenção semanal
Perguntas frequentes
Posso migrar de SQL Server 2000 para SQL Server 2014?
Sim, mas é um processo em duas etapas — SQL 2000 não importa diretamente no 2014. Restaure primeiro em SQL 2008 R2, atualize o nível de compatibilidade e então migre para 2014/2017.
Como transferir o banco para outra VPS?
Gere um backup .bak no servidor atual com BACKUP DATABASE, copie o arquivo via SFTP para a nova VPS e restaure com RESTORE DATABASE.
Banco do MU está lento — como otimizar?
As causas mais comuns são: tabela Character sem índice em ConnectStat, ausência de índice na tabela de itens, e banco com fragmentação alta. Criar índices nas colunas mais consultadas resolve a maioria dos casos.
Posso usar SQL Express para o servidor de MU?
SQL Express tem limite de 10 GB por banco e sem SQL Agent. Para servidores pequenos é suficiente. Servidores maiores (S6+, muitos jogadores) precisam da versão Standard ou Developer.