Todas as versões do MySQL 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
.
See Secção 4.10.1, “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
.
See Secçã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 MySQL são causadas por arquivos de
índices/dados corrompidos. O MySQL 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 MySQL 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 daemon lockd
) 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''. See
Capítulo 4, 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
MySQL reiniciar See Secção 4.10.2, “O Log de Consultas”. Se você
puder finalizar o MySQL 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! See
Secção 1.7.1.3, “Como relatar erros ou problemas”.
Tente fazer um caso de teste que possamos utilizar para reproduzir o problema. See Secçã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
MySQL. See Secção 14.1.2, “Pacotes de Teste do MySQL”. Eles devem
testar o MySQL 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ório
sql-bench
sob o diretório de
instalação do seu MySQL.
Experimente fork_test.pl
e
fork2_test.pl
.
Se você configurar o MySQL para depuração, será muito
mais fácil para obter informações sobre possíveis erros
se alguma coisa der errado. Reconfigure o MySQL com a
opção --with-debug
ou
--with-debug=full
no
configure
e então recompile-o. See
Secção E.1, “Depurando um Servidor MySQL”.
Configurar o MySQL 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 o
mysqld
. Em alguns sistemas, o gerenciador
de bloqueios lockd
não funciona de forma
apropriada; a opção
--skip-external-locking
faz com que
mysqld
não utilize bloqueio externo.
(Isto significa que você não pode executar 2 servidores
mysqld
sobre o memo dado e que você deve
ser cuidadoso ao utilizar myisamchk
, mas
pode ser instrutivo tentar a opção como teste).
Você tentou mysqladmin -u root
processlist
quando o mysqld
parecia estar rodando mas não respondia? Algumas vezes o
mysqld
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
ou mysqladmin -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 do
gdb
(ou em outro depurador). See
Secçã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 com thread #
,
onde #
é a ID da thread.
Tente simular a sua aplicação com um script Perl para forçar o MySQL a falhar o mudar o seu comportamento.
Envie um relatório de bug normal. See Secção 1.7.1.3, “Como relatar erros ou problemas”. Seja mais detalhista que o normal. Como o MySQL 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 colunas
VARCHAR
, você pode tentar alterar todas
as colunas VARCHAR
para
CHAR
com ALTER TABLE
.
Isto forçara o MySQL 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 MySQL AB 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.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.