¿Cómo mostrar las últimas consultas ejecutadas en MySQL?

471

¿Hay alguna consulta / forma de mostrar las últimas consultas ejecutadas en TODOS los servidores?

FerranB
fuente

Respuestas:

793

Para aquellos bendecidos con MySQL> = 5.1.12, puede controlar esta opción globalmente en tiempo de ejecución:

  1. Ejecutar SET GLOBAL log_output = 'TABLE';
  2. Ejecutar SET GLOBAL general_log = 'ON';
  3. Mira la mesa mysql.general_log

Si prefiere exportar a un archivo en lugar de una tabla:

  1. SET GLOBAL log_output = "FILE"; el valor por defecto .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Prefiero este método para editar archivos .cnf porque:

  1. no está editando el my.cnfarchivo y potencialmente activa permanentemente el registro
  2. no está buscando en el sistema de archivos buscando el registro de consultas, o peor aún, distraído por la necesidad del destino perfecto. /var/log /var/data/log /opt /home/mysql_savior/var
  3. No tiene que reiniciar el servidor e interrumpir las conexiones actuales.
  4. reiniciar el servidor te deja donde comenzaste (el registro está apagado de forma predeterminada)

Para obtener más información, consulte el Manual de referencia de MySQL 5.1 - Variables del sistema del servidor - general_log

FlipMcF
fuente
44
Gran diseño de interfaz de usuario. De todos modos, las tablas de registro de MySQL en realidad están usando el motor CSV para que pueda hacer todo lo que FlipMcF dijo en la respuesta sobre habilitar el inicio de sesión en la tabla general_log, y tener una cola -f de general_log como esta: tail -f / var / lib / mysql / mysql / general_log.CSV
2
maldita sea, el documento de mysql para esto ni siquiera disparó el parámetro de la tabla. muchas gracias.
Abhishek Dujari
66
recuerde limpiar su tabla de registro general cuando haya terminado: "truncar tabla mysql.general_log"
pdwalker
1
Obtuve el resultado de esta manera, pero los parámetros están presentes con un signo de interrogación, por ejemplo, seleccione foo de la barra donde x =? ¿Cómo puedo obtener la consulta completa?
okwap
43

Puede habilitar un registro de consulta general para ese tipo de diagnóstico. En general, no registra todas las consultas SELECT en un servidor de producción, sin embargo, es un asesino de rendimiento.

Edite su configuración de MySQL, por ejemplo /etc/mysql/my.cnf: busque o agregue una línea como esta

[mysqld]
log = /var/log/mysql/mysql.log

Reinicie mysql para recoger ese cambio, ahora puede

tail -f /var/log/mysql/mysql.log

Hola, listo, puedes ver las consultas a medida que entran.

Paul Dixon
fuente
44
general_log_file y general_log en mi my.cnf
Martin Thoma
Esto funciona si quieres saber reiniciar mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar
1
Las versiones más recientes de Mac OS X (al menos en Mac OS X) requieren las opciones general_log_file y general_log en lugar de solo "log =". De lo contrario, obtendrá un error como este: ERROR / usr / local / mysql / bin / mysqld: opción ambigua '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth
@ JaySheth, recibí ese error en Mariadb 10.2, así que no estoy seguro de que solo esté relacionado con Mac OS.
user10089632
16

Puede hacer lo que fluye para monitorear los registros de consultas mysql.

Abra el archivo de configuración mysql my.cnf

sudo nano /etc/mysql/my.cnf

Busque las siguientes líneas debajo de un [mysqld]encabezado y descomente estas líneas para habilitar el registro

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Reinicie su servidor mysql para reflejar los cambios.

sudo service mysql start

Monitoree el registro del servidor mysql con el siguiente comando en la terminal

tail -f /var/log/mysql/mysql.log
Rokibul Hasan
fuente
15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;
zloctb
fuente
9

1) Si el registro general de mysql está habilitado, entonces podemos verificar las consultas en el archivo de registro o en la tabla en función de lo que hemos mencionado en la configuración. Compruebe lo que está habilitado con el siguiente comando

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Si necesitamos el historial de consultas en la tabla, entonces

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Echa un vistazo a la tabla mysql.general_log

Si prefiere exportar a un archivo:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) También podemos verificar las consultas en el archivo .mysql_history cat ~ / .mysql_history

minhas23
fuente
4

Si mysql binlog está habilitado, puede verificar los comandos ejecutados por el usuario ejecutando el siguiente comando en la consola de Linux navegando al directorio binq de mysql

mysqlbinlog binlog.000001 >  /tmp/statements.sql

permitiendo

[mysqld]
log = /var/log/mysql/mysql.log

o el registro general tendrá un efecto en el rendimiento de mysql

Avinash Singh
fuente
posible, pero doloroso. más útil si está buscando ver qué sucedió en el pasado.
pdwalker
2

Si no desea cambiar su configuración de MySQL, puede utilizar un generador de perfiles SQL como "Neor Profile SQL" http://www.profilesql.com .

Bitclaw
fuente
2

Después de leer la respuesta de Paul, seguí cavando para obtener más información en https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Encontré un código realmente útil por una persona. Aquí está el resumen del contexto.

(Nota: el siguiente código no es mío)

Este script es un ejemplo para mantener limpia la tabla que lo ayudará a reducir el tamaño de su tabla. Como después de un día, habrá aproximadamente 180k consultas de registro. (en un archivo, sería 30 MB por día)

Debe agregar una columna adicional (event_unix) y luego puede usar este script para mantener el registro limpio ... actualizará la marca de tiempo en una marca de tiempo Unix, eliminará los registros anteriores a 1 día y luego actualizará event_time en Timestamp from event_unix ... suena un poco confuso, pero está funcionando muy bien.

Comandos para la nueva columna:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Script de limpieza:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

El crédito va para Sebastian Kaiser (Escritor original del código).

Espero que alguien lo encuentre útil como lo hice.

Dev Aggarwal
fuente
Interesante. Perdería consultas durante la limpieza a menos que bloqueara todos los db primero. Hay otros problemas que pueden surgir aquí. Si estamos en este punto de registro 'continuo', usaría el registro de archivos o el registro de contenedor y un rotador de registro listo para usar.
FlipMcF
1

Puedes mirar lo siguiente en Linux

cd /root

ls -al

vi .mysql_history Puede ayudar

Avinash Singh
fuente
66
Parece que solo funcionaría para el cliente mysql oficial de línea de comandos, y solo para consultas ejecutadas por el usuario root
Golimar
La pregunta dice "todo el servidor", lo que hace que esta respuesta sea incorrecta. Esto mostraría todas las consultas ejecutadas por un solo cliente.
FlipMcF
Si mysql binlog está habilitado, puede verificar los comandos ejecutados por el usuario ejecutando el siguiente comando en la consola de Linux navegando al directorio mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql habilitando [mysqld] log = / var / log / mysql / mysql.log o genral log tendrá un efecto en el rendimiento de mysql
Avinash Singh
Algunas entradas en esto se suprimen de forma predeterminada de todos modos, cadenas que contienen "contraseña" por ejemplo.
mckenzm