Identificando consultas lentas no MySQL (slow-queries)

O MySQL pode geralmente causar grandes problemas num servidor quando existem consultas que abusam do sistema.

Neste artigo ensinaremos a você como identificar corretamente as consultas (queries) que estão causando problemas para o servidor.

O servidor MySQL pode escrever um log contendo as consultas que demoram mais que “X” segundos. Porém, por padrão este recurso vem desabilitado.

Vamos ver como habilitar o recurso:

1. Log no seu servidor como root
2. Abra o arquivo my.cnf:

pico /etc/my.cnf

3. Dentro da seção [mysqld] adicione as seguintes linhas

log-slow-queries = /var/log/mysql-slow.log
long_query_time = 3

Isto é apenas um exemplo. Você pode usar qualquer nome de arquivo para o log. Você também pode estipular o tempo máximo de uma consulta. A partir deste tempo,a consulta será gravada. No nosso exemplo, colocamos 3 segundos.

4. Após as alterações, salve o arquivo.

No pico, faça: CTRL+X e YES

5. Agora nós temos que criar o arquivo de log.

touch /var/log/mysql-slow.log

6. Agora vamos mudar o dono do arquivo, para que o mysql tenha permissão de escrever nele.

chown mysql.root /var/log/mysql-slow.log

7. E então, reiniciamos o mysql

service mysql restart

O serviço deverá reiniciar corretamente. Caso não reinicie, veja se você fez tudo corretamente no arquivo my.cnf.

8. Aguarde alguns minutos e então examine o conteúdo do arquivo de log que foi criado.

Um exemplo de como fazer isto:

cat /var/log/mysql-slow.log
tail /var/log/mysql-slow.log
tail -50 /var/log/mysql-slow.log

Depois de identifica a consulta, otimize ou elimine ela.

Depois que identificar o problema, é recomendado que você remova a entrada referente a slow-queries no my.cnf (ou comente ela). Isto é importante, pois o uso de slow-queries degrada a performance do mysql. Você pode comentar o arquivo my.cnf:

#log-slow-queries = /var/log/mysql-slow.log
#long_query_time = 3

Não se esqueça de reiniciar o MySQL em seguida.

service mysql restart

instalando mytop

O Comando top no linux, mostra os processos que estão sendo executados no servidor, e sem duvida é um dos comandos mais utilizados por administradores linux, porém através do top fica mais dificil saber alguns detalhes importantes do MySQL.

Para este fim temos o MyTop que irá nos permitir mostrar os processos que estão sendo executados, ordenar por uso de memória, uso de cpu, tempo, etc .

Abaixo, vou abordar a instalação do MyTop incluindo dois módulos Perl necessários para que o Mytop funcione, a seguir segue os principais comandos do Mytop.

1 – Instalando os módulos perl

Instalando o TermReadKey:

cd /usr/local/src
wget http://search.cpan.org/CPAN/authors/id/J/JS/JSTOWE/TermReadKey-2.30.tar.gz
tar -zxf TermReadKey-2.30.tar.gz
cd TermRead*
perl Makefile.PL
make test
make
make install
cd ..

Instalando DBI:

wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.48.tar.gz
tar -zxf DBI-1.48.tar.gz
cd DBI*
perl Makefile.PL
make test
make
make install
cd ..

Finalmente, instalando o Mytop

wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.4.tar.gz
tar -zxf mytop-1.4.tar.gz
cd mytop*
perl Makefile.PL
make test
make
make install

Para executar :

mytop

Atalho

* ? Exibe ajuda
– d Exibe as conexoes a uma determinada base de dados
– f Mostra a constra completa de uma específico ID de processo (ativo)
– F Desabilita todos os filtros (host, user, e db).
– h Exibe apenas as consultas de um determinado host
– I Exibe o status do InnoDB
– k “Klila”(mata) um processo
– m Muda o modo de exiição de top para qps (Queries Per Second Mode). Desta forma será exibido na tela a quantidade de querys por segundo.
– o Inverte a ordem default de ordenação
-p Pausa a exibição
– q Sair do mytop
– r Reseta os contadores de “status” do servidor via comando
– s Muda o tempo de atualização dos refreshes (em segundos)
– u Mostra os porcessos de um determinado usuário

Germano P Ferreira
Administrador Linux