¿Cómo capturar las consultas que se ejecutan en el servidor MySQL?

14

Estamos tratando de depurar el rendimiento del servidor y me gustaría capturar una instantánea de las consultas que se ejecutan en nuestro servidor MySQL durante un par de minutos.

Estoy familiarizado con MySQL SHOW FULL PROCESSLIST, sin embargo, me gustaría poder ejecutar esto a través de la línea de comando para poder volcarlo en un archivo y publicarlo.

¿Hay alguna manera de enviar esta consulta a un archivo y hacer que se ejecute cada segundo más o menos?

¿Hay una mejor manera de capturar todas las consultas que se ejecutan?

Tenga en cuenta que no estoy interesado solo en las consultas lentas (estoy familiarizado con el registro de consultas lentas).

Hafichuk
fuente
¿Qué sistema operativo estás ejecutando? Esto es extremadamente fácil de hacer en Linux, ¿así que supongo que Windows?
Patrick
@Patrick Me alegra saber que es fácil en Linux. Disparar ...
hafichuk
1
La mayoría de las consultas se ejecutarán y terminarán en mucho menos de un segundo, y nunca se mostrarán en su lista.
Joel Coel
Además, las consultas más largas aparecerán muchas veces una vez para cada ciclo, pero seguro que si lo desea, puede hacerlo echo show full processlist | mysqlmejor o mejor SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"en un ciclo en bash. Agregue un par de líneas y obtendrá la misma funcionalidad de consulta que innotopo pt-kill
theist

Respuestas:

10

Usaría el registro de consulta lento. Captura todas las consultas, no solo las que son lentas, si configura long_query_time = 0.

También captura TODAS las consultas, lo cual no es cierto para las técnicas de rastreo TCP mencionadas aquí; esos no capturarán consultas ejecutadas a través de un socket. Lo mismo para ver SHOW PROCESSLIST; extrañará consultas rápidas.

Si desea capturar consultas a través de la lista de procesos o el tráfico TCP, sugeriría usar pt-query-digest de Percona Toolkit. Puede sondear la lista de procesos por usted (y dar sentido a los resultados, lo cual es muy difícil de hacer si está capturando un montón de muestras usted mismo), y puede interpretar el protocolo TCP de MySQL, por lo que puede obtener algunos TCP traficar y analizarlo. Por supuesto, también es el mejor agregador de consultas / generador de perfiles / reportero jamás escrito, pero no dijo lo que desea hacer con las consultas después de capturarlas.

Baron Schwartz
fuente
13

La forma más sólida sería utilizar el "registro de consultas generales", que capturará todas las consultas: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

No especifica la versión del servidor MySQL, pero si tiene 5.1.12 o posterior, puede habilitarla y deshabilitarla con una variable global a través de SQL; Vea la documentación para más detalles.

Daniel Pittman
fuente
Gracias @Daniel. Hemos activado esto, sin embargo, no hay información de marca de tiempo en el registro. ¿Alguna idea de cómo poner una marca de tiempo allí?
hafichuk
Lo siento, no, nada más que señalarle el manual.
Daniel Pittman
2
El registro de consulta lento con long_query_time = 0 es una mejor opción; aún capturará todas las consultas.
Barón Schwartz
+1 para el barón: el registro de consultas generales no incluye las métricas de rendimiento que necesita. También hay scripts perl incluidos con el servidor MySQL para analizar el registro lento de consultas (que elimina los valores literales de los predicados). Pero tenga en cuenta que las versiones anteriores de MySQL no admitirán un tiempo de consulta prolongado de menos de 1 segundo; si ese es el caso para usted, actualice, hay muchas más mejoras de rendimiento en las versiones recientes.
symcbean
5

Pruebe este comando como root (o 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
fuente
4

Seguro:

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

Salud

HTTP500
fuente
Ah ... mysqladmin. Perfecto, gracias @ HTTP500
hafichuk
1
Esto realmente ejecuta el comando processlist cada 1 segundo. Algunas consultas muy rápidas aún pueden escapar de la captura; si la carga está compuesta por pocas consultas grandes, funcionará, si está compuesta por muchas consultas pequeñas, podría no funcionar.
LSerni
@Isemi, el OP pidió "cada segundo más o menos".
HTTP500
4

Este podría ser un lugar para el proxy Mysql . Básicamente le permite capturar (y manipular) las consultas que se envían. Una configuración básica para interceptar es bastante fácil. Luego, simplemente cambie la configuración de su cliente para que apunte al proxy para que pueda capturar todas las solicitudes.

Zoredache
fuente
4

El programa tshark de Wireshark basado en terminal puede ayudar a:

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

sudo yum install wiresharkte dará tshark en Amazon Linux y sudo apt-get install tsharkte dará tshark en Ubuntu 14+

SoMoSparky
fuente
3

Usé la solución de 'Rui Pedro Bernardino. Funciona muy bien, excepto que cambié un par de cosas en la primera línea como se detalla a continuación ...

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.=" $_";
  }
}'
usuario1038090
fuente
0

Estaba buscando y buscando y finalmente llegué a MONyog para monitorear todas las consultas en tiempo real que se ejecutan en el servidor mysql. Lo único que se debe tener en cuenta es "Performance_schema" y "declaraciones_digest" para habilitar la tabla y Performance_schema es disponible con MySQL 5.6.14 y superior.

Mateo
fuente