Como capturar as consultas executadas no servidor MySQL?

14

Estamos tentando fazer uma depuração do desempenho do servidor e gostaria de capturar um instantâneo das consultas que estão sendo executadas em nosso servidor MySQL por um período de alguns minutos.

Eu estou familiarizado com o MySQL SHOW FULL PROCESSLIST, no entanto, gostaria de poder executar isso através da linha de comando para que eu possa despejá-lo em um arquivo e processá-lo posteriormente.

Existe uma maneira de gerar essa consulta em um arquivo e executá-la a cada segundo?

Existe uma maneira melhor de capturar todas as consultas que estão sendo executadas?

Observe que não estou interessado apenas nas consultas lentas (estou familiarizado com o log de consultas lentas).

hafichuk
fonte
Qual sistema operacional você está executando? Isso é extremamente fácil de fazer no Linux, então acho que o Windows?
1011 Patrick
@ Patrick Feliz em saber que é fácil no linux! Dispare ...
hafichuk
1
A maioria das consultas é executada e finalizada em menos de um segundo e nunca é exibida na sua lista.
Joel Coel
consultas adicionalmente mais longas aparecerão muitas vezes uma vez para cada loop, mas com certeza, se você quiser, pode apenas echo show full processlist | mysqlou melhor fazer SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"um loop no bash. Adicione algumas linhas e você obterá a mesma funcionalidade de consulta que innotopou pt-kill
theist

Respostas:

10

Eu usaria o log de consulta lenta. Ele captura todas as consultas, não apenas as lentas, se você definir long_query_time = 0.

Ele também captura TODAS as consultas, o que não se aplica às técnicas de detecção de TCP mencionadas aqui; esses não capturam consultas executadas por um soquete. O mesmo vale para assistir a SHOW PROCESSLIST; você perderá consultas de execução rápida.

Se você deseja capturar consultas através da lista de processos ou do tráfego TCP, sugiro usar o pt-query-digest do Percona Toolkit. Ele pode pesquisar a lista de processos para você (e fazer sentido com os resultados, o que é muito difícil de fazer se você estiver capturando várias amostras dela) e pode interpretar o protocolo TCP do MySQL, para que você possa pegar alguns TCP. trafique e analise-o. Claro, também é o melhor agregador / gerador de perfil / repórter de consultas já escrito, mas você não disse o que deseja fazer com as consultas depois de capturá-las.

Barão Schwartz
fonte
13

A maneira mais robusta seria usar o "log de consultas gerais", que capturará todas as consultas: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Você não especifica a versão do servidor MySQL, mas se você possui o 5.1.12 ou posterior, é possível ativar e desativar isso com uma variável global por meio do SQL; Veja a documentação para detalhes.

Daniel Pittman
fonte
Obrigado @Daniel. Ativamos isso, no entanto, não há informações de registro de data e hora no log. Alguma idéia de como obter um timestamp lá?
10132 hafichuk
Desculpe, não, nada além de apontar você para o manual.
Daniel Pittman
2
O log de consulta lento com long_query_time = 0 é uma opção melhor; ainda capturará todas as consultas.
Baron Schwartz
+1 para o barão: o log de consultas gerais não inclui as métricas de desempenho necessárias. Há também scripts perl incluídos no servidor MySQL para analisar o log de consultas lento (que remove valores literais dos predicados). Mas observe que as versões mais antigas do MySQL não suportam um long_query_time de menos de 1 segundo - se esse for o caso para você atualizar - há muito mais aprimoramentos de desempenho nas versões recentes.
21412 sycbean
5

Tente este comando como root (ou use sudo):

tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'

Encontrado http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/

Rui Pedro Bernardino
fonte
4

Certo:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

Felicidades

HTTP500
fonte
Ah ... mysqladmin. Perfeito, obrigado @ HTTP500
hafichuk
1
Na verdade, isso executa o comando processlist a cada 1 segundo. Algumas consultas muito rápidas ainda podem escapar da captura; se o carregamento for composto de poucas consultas grandes, ele funcionará; se for composto de muitas consultas pequenas, talvez não.
LSerni
@Isemi, o OP pediu "cada segundo mais ou menos".
HTTP500
4

Este pode ser um local para o Proxy Mysql . Basicamente, você pode capturar (e manipular) as consultas enviadas. Uma configuração básica para interceptar é bastante fácil. Em seguida, basta alterar a configuração do cliente para apontar para o proxy para capturar todas as solicitações.

Zoredache
fonte
4

O programa Wireshark baseado em terminal tshark pode ajudar:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharklhe dará o tshark no Amazon Linux e sudo apt-get install tsharko tshark no Ubuntu 14+

SoMoSparky
fonte
3

Usei a solução de 'Rui Pedro Bernardino. Funciona muito bem, exceto que eu mudei algumas coisas na primeira linha, conforme detalhado abaixo ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'
user1038090
fonte
0

Eu estava pesquisando e pesquisando e finalmente cheguei ao MONyog para monitorar todas as consultas em tempo real que são executadas no servidor mysql. A única coisa a ser observada é a tabela "Performance_schema" e "declarações_digest" que deve ser ativada e o Performance_schema é disponível com o MySQL 5.6.14 e superior.

Mathew
fonte