Como corrigir erro de banco de dados corrompido no servidor de MU Online
Diagnostique tabelas corrompidas no MySQL/MariaDB do seu servidor de MU Online, recupere dados de personagens e itens com segurança, e implemente rotina de backup para evitar perda permanente de progresso.
Poucos incidentes assustam mais um administrador de servidor de MU Online do que abrir o GameServer pela manhã e encontrar erros de tabela corrompida no banco de dados — com o risco real de perder personagens, itens e progresso de jogadores. A boa notícia é que a maioria dos casos de corrupção é rec
Poucos incidentes assustam mais um administrador de servidor de MU Online do que abrir o GameServer pela manhã e encontrar erros de tabela corrompida no banco de dados — com o risco real de perder personagens, itens e progresso de jogadores. A boa notícia é que a maioria dos casos de corrupção é recuperável, total ou parcialmente, desde que o diagnóstico e a correção sigam uma ordem cuidadosa que não piore o dano. Este tutorial cobre o processo completo: identificar o tipo e a extensão da corrupção, recuperar o máximo de dados possível, restaurar de backup quando necessário, e implementar uma rotina que reduza drasticamente o risco de isso acontecer de novo.
Reconhecendo os sintomas de corrupção
Os sinais mais comuns de corrupção de banco de dados em um servidor de MU incluem: o GameServer falhando ao iniciar com erro relacionado a uma tabela específica (Character, Warehouse, AccountCharacter), consultas SQL simples retornando erro Table 'X' is marked as crashed, personagens ou itens desaparecendo ou aparecendo duplicados, e o próprio MySQL registrando erros de I/O ou de índice corrompido no log (mysqld.log ou Event Viewer no Windows).
Primeira ação: pare de escrever no banco
Antes de qualquer diagnóstico, pare o GameServer e qualquer outro processo que escreva no banco (JoinServer, painel web, ferramentas de administração). Continuar operando sobre um banco corrompido aumenta o risco de a corrupção se espalhar para outras tabelas ou de sobrescrever dados que ainda seriam recuperáveis. Faça uma cópia bruta dos arquivos de dados do MySQL (diretório data/, geralmente em /var/lib/mysql no Linux ou C:\ProgramData\MySQL\MySQL Server X.X\Data no Windows) antes de tentar qualquer reparo — essa cópia é sua rede de segurança caso o reparo piore a situação.
Identificando o motor de armazenamento das tabelas afetadas
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'MuOnline';
O procedimento de recuperação muda conforme o motor:
| Motor | Vulnerabilidade a corrupção | Ferramenta de reparo principal |
|---|---|---|
| MyISAM | Alta (sem journaling, sensível a queda abrupta) | myisamchk, REPAIR TABLE |
| InnoDB | Baixa (redo log recupera automaticamente na maioria dos casos) | innodb_force_recovery, dump e reimportação |
| Aria (MariaDB) | Média | aria_chk, REPAIR TABLE |
Reparando tabelas MyISAM corrompidas
Com o MySQL parado, use myisamchk diretamente nos arquivos:
sudo systemctl stop mysql
cd /var/lib/mysql/MuOnline
myisamchk -r Character.MYI
myisamchk -r Warehouse.MYI
sudo systemctl start mysql
A flag -r (recover) tenta reconstruir o índice e recuperar o máximo de linhas possível. Se myisamchk reportar que não conseguiu recuperar completamente, tente a flag mais agressiva -o (safe recover), que é mais lenta mas mais cautelosa na reconstrução.
Alternativamente, com o MySQL rodando, você pode usar o comando SQL equivalente:
CHECK TABLE Character;
REPAIR TABLE Character;
Recuperando InnoDB com force_recovery
Se o InnoDB não sobe normalmente após uma corrupção, adicione a diretiva de recuperação forçada no my.cnf/my.ini, começando pelo nível mais brando:
[mysqld]
innodb_force_recovery = 1
Suba o serviço, faça um dump completo do banco (mysqldump) enquanto ainda está no modo de recuperação, e restaure esse dump em uma instância nova e limpa do MySQL. Nunca opere em produção com innodb_force_recovery ativo por muito tempo — esse modo desativa proteções internas e existe apenas para permitir a extração segura dos dados antes de recriar o banco do zero.
mysqldump -u root -p --single-transaction MuOnline > recovery_dump.sql
# Depois, em uma instância nova/limpa:
mysql -u root -p MuOnline < recovery_dump.sql
Se o nível 1 não for suficiente para o dump completar, aumente gradualmente até o nível 4 ou 6 (os níveis mais altos são mais destrutivos e devem ser o último recurso, pois ignoram verificações de integridade cada vez mais fundamentais).
Restaurando a partir de backup quando o reparo falha
Se o reparo direto não recuperar os dados de forma confiável, a restauração do último backup válido é o caminho mais seguro:
# Restaurar backup completo
mysql -u root -p MuOnline < backup_2026-07-28.sql
Antes de restaurar, compare o timestamp do backup com o momento estimado da corrupção — se o backup for de várias horas ou dias antes do incidente, avalie se vale a pena tentar recuperar manualmente as diferenças (registros de criação de personagem, drops recentes) a partir de logs do GameServer, se seu emulador mantiver esse tipo de log de auditoria.
Verificando integridade após a recuperação
Depois de reparar ou restaurar, rode verificações básicas antes de liberar o servidor para os jogadores:
CHECK TABLE Character, Warehouse, AccountCharacter, Guild;
SELECT COUNT(*) FROM Character;
SELECT COUNT(*) FROM Warehouse;
Compare as contagens com o que você esperaria com base no número de jogadores ativos — uma queda abrupta e inexplicável no número de linhas é sinal de que a recuperação não foi completa.
Investigando a causa raiz
Corrigir a corrupção sem entender a causa é resolver o sintoma, não o problema. As causas mais comuns são: queda de energia ou desligamento abrupto da máquina, kill -9 no processo do MySQL em vez de um encerramento gracioso, disco com setores defeituosos, e falta de espaço em disco durante uma escrita. Verifique os logs do sistema operacional e do MySQL (mysqld.log) no horário aproximado da corrupção para identificar qual desses cenários ocorreu.
# Verificar saúde do disco (Linux)
sudo smartctl -a /dev/sda
# Verificar espaço em disco disponível
df -h
Implementando rotina de backup para prevenir recorrência
| Tipo de backup | Frequência recomendada | Retenção |
|---|---|---|
Dump lógico completo (mysqldump) | Diário | 7 a 14 dias |
| Backup físico (cópia do diretório de dados, serviço parado) | Semanal | 4 semanas |
| Backup incremental (binlog) | Contínuo | Até o próximo dump completo |
Automatize o dump diário com um cron job (Linux) ou Agendador de Tarefas (Windows), gravando os arquivos em um local fora da própria máquina do servidor (outro disco, outro servidor, ou armazenamento em nuvem), para que um problema de hardware não destrua simultaneamente o banco e os backups.
# Exemplo de cron job diário às 4h da manhã
0 4 * * * mysqldump -u root -psenha MuOnline | gzip > /backup/mu_$(date +\%F).sql.gz
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| GameServer não inicia, erro de tabela crashed | Tabela MyISAM corrompida | Rode myisamchk -r ou REPAIR TABLE com o serviço parado |
| InnoDB não sobe de jeito nenhum | Corrupção no tablespace ou redo log | Use innodb_force_recovery incremental e faça dump para reinstalar limpo |
| Personagens/itens sumiram após a corrupção | Reparo incompleto ou dados irrecuperáveis | Restaure do último backup válido e compare contagens de linhas |
| Corrupção volta a acontecer periodicamente | Causa raiz não identificada (disco, energia, processo) | Verifique SMART do disco e forma de encerramento do MySQL |
| Backup mais recente também corrompido | Backup feito durante a corrupção, sem verificação prévia | Valide integridade do dump/backup antes de sobrescrever versões anteriores |
Checklist de recuperação de banco corrompido
- GameServer e demais processos parados antes de qualquer ação.
- Cópia bruta dos arquivos de dados feita antes do reparo.
- Motor de armazenamento identificado (MyISAM, InnoDB, Aria).
- Reparo tentado com a ferramenta apropriada ao motor.
- Restauração de backup realizada caso o reparo não seja suficiente.
- Integridade verificada (contagem de linhas,
CHECK TABLE) antes de liberar o servidor. - Causa raiz investigada (disco, energia, encerramento abrupto).
- Rotina de backup automatizada e armazenada fora da máquina principal.
Com o banco recuperado e uma rotina de backup implementada, vale revisar toda a infraestrutura do servidor para reduzir outros pontos de falha antes que se tornem incidentes. Consulte o tutorial de criação de servidor de MU Online para revisar os fundamentos completos da configuração do seu ambiente.
Perguntas frequentes
É possível recuperar 100% dos dados de uma tabela corrompida sem backup?
Na maioria das vezes não. Ferramentas como myisamchk/mysqlcheck conseguem recuperar parte significativa dos dados em tabelas MyISAM corrompidas, mas registros no meio de blocos danificados costumam ser perdidos permanentemente. Backup regular é a única garantia real contra perda total.
InnoDB corrompe com a mesma frequência que MyISAM?
Não. InnoDB tem journaling (redo log) que protege contra a maioria das corrupções causadas por quedas de energia ou encerramento abrupto do processo, recuperando automaticamente na inicialização. MyISAM não tem esse mecanismo, sendo mais vulnerável a corrupção nesses cenários — por isso muitos emuladores de MU migraram tabelas críticas para InnoDB.
Como sei se a corrupção foi causada por hardware (disco) ou por encerramento indevido do MySQL?
Rode um teste de saúde do disco (SMART, smartctl no Linux ou utilitário do fabricante no Windows) logo após identificar a corrupção. Se o disco reportar setores defeituosos ou erros de leitura, o problema é de hardware e a corrupção tende a se repetir até o disco ser substituído. Se o disco estiver saudável, o mais provável é encerramento abrupto do MySQL (queda de energia, kill do processo, falta de espaço em disco).
Posso simplesmente restaurar o backup mais recente sem investigar a causa?
Pode resolver o sintoma imediato, mas sem identificar a causa (disco com problema, falta de espaço, encerramento incorreto do serviço) a corrupção tende a se repetir. Sempre investigue a causa raiz em paralelo à restauração, para não ficar em um ciclo de corrupção recorrente.
Rodar CHECK TABLE regularmente previne corrupção?
Não previne, mas detecta problemas cedo, antes que se tornem graves o suficiente para derrubar o GameServer ou causar perda visível de progresso de jogadores. Vale rodar CHECK TABLE periodicamente como parte da rotina de manutenção, junto com backups regulares.