O Que Fazer Se o MariaDB Continua Falhando
Todas as versões do MariaDB são testadas em muitas plataformas antes de serem distribuídas. Isto não significa que não existe nenhum erro no MySQL, mas significa que se houver erros, eles são poucos e podem ser difíceis de encontrar. Se você tiver u problema, sempre ajudará se você tentar encontrar exatamente o que falhou em seu sistema e assim você terá uma chance muito maior de tê-lo corrigido rapidamente.
Primeiro, você deve tentar descobrir o problema é que o daemon do mysqld
morre ou se o seu problema é relativo ao seu cliente. Você pode verificar o quanto tempo o seu servidor mysqld
está em execução utilizando o mysqladmin version
. Se o mysqld
morrer, você pode encontrar a causa disto no arquivo mysql-data-directory/`nome_maquina`.err
. Leia "O Log de Erros".
Em alguns sistemas você pode encontrar neste arquivo um stack trace de onde o mysqld
finalizou e assim você pode resolver com resolve_back_stack
. Leia Seção E.1.4, "Usando Stack Trace". Note qte os valores da variável escrita no arquivo .err
não podem sempre estar 100% corretas.
Muitas falhas do MariaDB são causadas por arquivos de índices/dados corrompidos. O MariaDB atualizará os dados em disco, com a chamada de sistema write()
, depois de todas as intruções SQL e antes do ser notificado sobre o resultado. (Isto não é verdade se você estiver executando com delay_key_write
, caso no qual apenas o dado é escrito.) Insto significa que o dado é salvo mesmo se o mysqld
falhar, já que o SO se certificará de que o dado não descarregado esta escrito em disco. Você pode forçar o MariaDB a sincronizar tudo para o disco depois de todo comando SQL inicando o mysqld
com --flush
.
O exposto acimo significa que normalmente você não deve ter tabelas corrompidas a menos que:
- Alguém/algo finalize o
mysqld
ou a máquina no meio de uma atualização. - Você encontrou um bug no
mysqld
que faça com que ele finalize no meio de uma atualização. - Alguém está manipulando os arquivos de dados/índices de fora do mysqld sem o bloqueio de tabela apropriado.
- Se você estiver executando muitos servidores
mysqld
no mesmo dado em um sistema que não suporta bons bloqueios de sistema de arquivos (normalmente tartando o daemonlockd
) ou se você está executando multiplos servidores com--skip-external-locking
- Você tem um arquivo de dados/índices que contem muitos dados errados que deixam o
mysqld
confuso. - Você encontrou um bug no código de armazenamento do dado. Isto não é desejável mas é possível. Neste caso você ode tentar alterar o tipo de arquivo para outro mecanismo de armazenamento usando
ALTER TABLE
em uma cópia corrigida da tabela!
Por ser muito difícil saber o motivo das falhas, tente primeiro verificar se o que está funcionando para outros está falhando com você. Por favor, tente o seguinte:
Finalize o daemon mysqld
com mysqladmin shutdown
, execute myisamchk --silent --force */*.MYI
em todas as tabelas e reinicie o daemon mysqld
. Isto irá assegurar que você está executando de um estado limpo
. Leia Administração do Bancos de Dados MySQL.
- Use
mysqld --log
e tente determinar a partir da informação no log se alguma consulta específica finalizou o servidor. Aproximadamente 95% de todos os erros são relacionados com um consulta em particular! Normalmente ela é uma das últimas consultas no arquivo de log antes do MariaDB reiniciar Leia "O Log de Consultas". Se você puder finalizar o MariaDB repetidamente com uma das consultas, mesmo quando você tiver verificado todas as tabelas logo antes de realizá-la, então você estará apto a localizar o bug e deve fazer um relatório de bug para isto! Leia "Como relatar erros ou problemas". - Tente fazer um caso de teste que possamos utilizar para reproduzir o problema. Leia Seção E.1.6, "Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela".
- Tente executar o teste incluso mysql-test e o benchmark do MariaDB. Leia "Pacotes de Teste do MariaDB". Eles devem testar o MariaDB bem. Você também pode adicionar ao benchmark um código que simule a sua aplicação! O benchmark pode ser encontrado no diretório
bench
na distribuição fonte ou, em uma distribuição binária, no diretóriosql-bench
sob o diretório de instalação do seu MySQL. - Experimente
fork_test.pl
efork2_test.pl
. - Se você configurar o MariaDB para depuração, será muito mais fácil para obter informações sobre possíveis erros se alguma coisa der errado. Reconfigure o MariaDB com a opção
--with-debug
ou--with-debug=full
noconfigure
e então recompile-o. Leia Seção E.1, "Depurando um Servidor MySQL". - Configurar o MariaDB para depuração faz com que um alocador de memória seja incluído para que se possa encontrar alguns erros. Ele também fornece muita informação sobre o que está acontecendo.
- Você aplicou todas as últimas correções para o seu sistema operacional?
- Use a opção
--skip-external-locking
com omysqld
. Em alguns sistemas, o gerenciador de bloqueioslockd
não funciona de forma apropriada; a opção--skip-external-locking
faz com quemysqld
não utilize bloqueio externo. (Isto significa que você não pode executar 2 servidoresmysqld
sobre o memo dado e que você deve ser cuidadoso ao utilizarmyisamchk
, mas pode ser instrutivo tentar a opção como teste). - Você tentou
mysqladmin -u root processlist
quando omysqld
parecia estar rodando mas não respondia? Algumas vezes omysqld
não está <<comatose>> mesmo quando você acha que não. O problema pode ser que todas as conexões estão em uso, o pode haver algum problema interno de bloqueio.mysqladmin processlist
normalmente estará apto a fazer uma conexão mesmo nestes casos e pode fornecer informação útil sobre o número conexões atuais e os seus estados. - Execute o comando
mysqladmin -i 5 status
oumysqladmin -i 5 -r status
ou em uma janela separada para produzir estatísticas enquanto você executa outras consultas. - Experimente o seguinte:
- Inicie o
mysqld
a partir dogdb
(ou em outro depurador). Leia Seção E.1.3, "Depurando o mysqld no gdb". - Execute o seu script de testes.
- Imprima o <<backtrace>> e as varáveis locais nos 3 níveis mais baixos. No gdb você pode fazê-lo com o seguinte comando quando o
mysqld
falhar dentro do gdb:backtrace info local up info local up info local
Com gdb você também pode examinar quais threads existem com
info threads
e troca para uma thread específica comthread #
, onde#
é a ID da thread.
- Inicie o
- Tente simular a sua aplicação com um script Perl para forçar o MariaDB a falhar o mudar o seu comportamento.
- Envie um relatório de bug normal. Leia "Como relatar erros ou problemas". Seja mais detalhista que o normal. Como o MariaDB funciona para muitas pessoas, pode ser que as falhas resultem de algo que exista apenas em seu computador (por exemplo, um erro que é relacionado a suas bibliotecas de sistemas em particular).
- Se você tiver um problema em tabelas com registros do tamanho dinâmico e você não está usando colunas
BLOB/TEXT
(mas apenas colunasVARCHAR
, você pode tentar alterar todas as colunasVARCHAR
paraCHAR
comALTER TABLE
. Isto forçara o MariaDB a usar linhas de tamanho fixo. Linhas de tamanho fixo utilizam um pouco mais de espaço extra, mas são muito mais tolerante a corrompimento.O código de registro dinâmico atual foi usado pela MariaDB Foundation por pelo menos 3 anos em qualquer problema, mas por natureza os registro de tamanho dinâmico são mais propensos a erros, assim pode ser uma boa idéia tentar o exposto acima para ver se ajuda.