O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Servidor

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.

EQ Equipe ViciadosMU · Atualizado em 1 jul 2026 · ⏱ 22 min de leitura
Resposta rápida

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:

BancoConteúdo principalTabelas críticas
MuOnlinePersonagens, inventários, contasCharacter, Character_Items, MEMB_INFO
MuEventEventos (Blood Castle, DS, CC)EventChipInventory, EventPoint
MuCastleCastle SiegeT_CastleSiege, T_CastleSiegeWar
MUDB (em alguns)Dados gerais do servidorvaria

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

  1. No SSMS, clique com direito em MuOnlineTasks → Back Up;
  2. Backup type: Full;
  3. Destination: adicione um caminho local (ex: C:\Backups\MuOnline_pre_migracao.bak);
  4. 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;
Atenção: Os nomes dos arquivos lógicos (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:

  1. Abra C:\Windows\SysWOW64\odbcad32.exe (SEMPRE usar esse, não o padrão);
  2. Vá em System DSN → selecione a DSN existente → Configure;
  3. Aponte para o novo servidor SQL;
  4. Para SQL 2017/2019: use driver ODBC Driver 17 for SQL Server;
  5. 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.

EQ

Equipe editorial do ViciadosMU — portal de MU Online no ar desde 2003.

Continue lendo

Artigos relacionados