Como capturar as consultas executadas no servidor MySQL?

14

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

Estou familiarizado com o SHOW FULL PROCESSLIST do MySQL, no entanto, gostaria de poder executá-lo por meio da linha de comando para que eu possa despejá-lo em um arquivo e pós-processá-lo.

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

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

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

    
por hafichuk 10.02.2012 / 23:26

9 respostas

10

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

Ele também captura TODAS as consultas, o que não é verdade para as técnicas de detecção de TCP mencionadas aqui; aqueles que não capturam consultas executadas por meio de um soquete. Idem para assistir SHOW PROCESSLIST; você vai sentir falta de consultas rápidas.

Se você deseja capturar consultas por meio da lista de processos ou por meio do tráfego TCP, sugiro usar o resumo de consulta de pt do Percona Toolkit. Ele pode pesquisar a lista de processos para você (e fazer sentido para os resultados, o que é muito difícil de fazer se você estiver capturando um monte de amostras dela), e pode interpretar o protocolo TCP do MySQL, assim você pode pegar alguns TCP tráfego e analisá-lo. É claro que também é o melhor agregador / profiler / reporter de consulta já escrito, mas você não disse o que deseja fazer com as consultas depois de capturá-las.

    
por 14.02.2012 / 17:52
13

A maneira mais robusta seria usar o "log de consulta geral", que irá capturar todas as consultas: link

Você não especifica a versão do servidor MySQL, mas se você tiver 5.1.12 ou posterior, você pode habilitar e desabilitar isso com uma variável global através do SQL; veja a documentação para detalhes.

    
por 10.02.2012 / 23:41
4

Claro:

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

Felicidades

    
por 10.02.2012 / 23:32
4

Experimente 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 link

    
por 14.06.2013 / 00:31
3

Isso pode ser um lugar para o proxy do Mysql . Basicamente, permite capturar (e manipular) as consultas enviadas. Uma configuração básica para interceptar é bem fácil. Em seguida, basta alterar a configuração do seu cliente para apontar para o proxy para poder capturar todas as solicitações.

    
por 10.02.2012 / 23:40
3

O programa Wireshark, baseado no terminal tshark , pode ajudar:

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

sudo yum install wireshark vai te dar tshark no Amazon Linux e sudo apt-get install tshark vai te dar tshark no Ubuntu 14+

    
por 10.02.2012 / 23:45
2

Eu 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.=" $_";
  }
}'
    
por 29.01.2016 / 20:37
1

Capture as sessões tcp do mysql usando o tcpdump, ambas as consultas e respostas. Você pode analisar um despejo, por exemplo, usando ferramentas do maatkit:

link

link

    
por 13.02.2012 / 14:02
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 notada é que a tabela "Performance_schema" e "statements_digest" deve ser ativada e Performance_schema está disponível com o MySQL 5.6.14 e acima.

    
por 09.10.2015 / 12:49

Tags