¿Cómo puedo rastrear consultas MySQL en mi servidor Linux a medida que ocurren?
Por ejemplo, me encantaría configurar algún tipo de escucha, luego solicitar una página web y ver todas las consultas que ejecutó el motor, o simplemente ver todas las consultas que se ejecutan en un servidor de producción. ¿Cómo puedo hacer esto?
mysql
monitoring
barfoon
fuente
fuente
Respuestas:
Puedes ejecutar el comando MySQL
SHOW FULL PROCESSLIST;
para ver qué consultas se están procesando en un momento dado, pero eso probablemente no logrará lo que espera.El mejor método para obtener un historial sin tener que modificar todas las aplicaciones que utilizan el servidor es probablemente a través de disparadores. Puede configurar desencadenantes para que cada consulta ejecute resultados en la consulta que se inserta en algún tipo de tabla de historial, y luego cree una página separada para acceder a esta información.
Tenga en cuenta que esto probablemente ralentizará considerablemente todo en el servidor, con la adición de un extra
INSERT
en cada consulta.Editar: otra alternativa es el Registro de consultas generales , pero tenerlo escrito en un archivo plano eliminaría muchas posibilidades de flexibilidad de visualización, especialmente en tiempo real. Sin embargo, si solo desea una forma simple y fácil de implementar para ver lo que está sucediendo, habilitar el GQL y luego usar la ejecución
tail -f
en el archivo de registro sería el truco.fuente
Puede registrar cada consulta en un archivo de registro con mucha facilidad:
Haga sus consultas (en cualquier base de datos). Grep o examinar de otra manera
/var/run/mysqld/mysqld.log
Entonces no olvides
¡o el rendimiento caerá en picado y su disco se llenará!
fuente
tail -f -n300 /var/run/mysqld/mysqld.log
para realizar un seguimiento en vivo de su archivo de registroSELECT name FROM person where id=?
pero no sé quéid
es.SHOW VARIABLES
no funciono para mi Sin embargoSELECT @@GLOBAL.general_log_file;
funciona bien. (MariaDB 10.1.9)SHOW VARIABLES LIKE "log_output%"
. Si se establece entable
, los registros se guardarán en la base de datos en sí, la tablamysql.general_log
no en el sistema de archivos. Puede cambiarlo afile
conSET GLOBAL log_output = 'file';
Aunque ya se ha aceptado una respuesta, me gustaría presentar lo que podría ser la opción más simple:
Esto imprimirá las consultas actuales en su pantalla cada segundo.
-u
El usuario mysql al que desea ejecutar el comando como-p
Solicite su contraseña (para que no tenga que guardarla en un archivo o que el comando aparezca en su historial de comandos)i
El intervalo en segundos.--verbose
bandera para mostrar la lista completa de procesos, mostrando la consulta completa para cada proceso. (Gracias, nmat )Existe un posible inconveniente: las consultas rápidas pueden no aparecer si se ejecutan entre el intervalo que configuró. IE: Mi intervalo se establece en un segundo y si hay una consulta que tarda unos
.02
segundos en ejecutarse y se ejecuta entre intervalos, no la verá.Utilice esta opción preferentemente cuando desee comprobar rápidamente la ejecución de consultas sin tener que configurar un oyente ni nada más.
fuente
--verbose
para ver las consultas completasEjecute esta conveniente consulta SQL para ver cómo se ejecutan consultas MySQL. Se puede ejecutar desde cualquier entorno que desee, cuando lo desee, sin ningún cambio de código o gastos generales. Puede requerir alguna configuración de permisos de MySQL, pero para mí simplemente se ejecuta sin ninguna configuración especial.
El único inconveniente es que a menudo se pierden consultas que se ejecutan muy rápidamente, por lo que es más útil para consultas de ejecución más larga o cuando el servidor MySQL tiene consultas que se están respaldando; en mi experiencia, este es exactamente el momento en que quiero ver " en vivo "consultas.
También puede agregar condiciones para hacerlo más específico en cualquier consulta SQL.
Por ejemplo, muestra todas las consultas que se ejecutan durante 5 segundos o más:
Por ejemplo, Mostrar todas las ACTUALIZACIONES en ejecución:
Para más detalles, consulte: http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html
fuente
Estoy en una situación particular en la que no tengo permisos para activar el inicio de sesión y no tendría permisos para ver los registros si estuvieran activados. No pude agregar un disparador, pero tenía permisos para llamar a show processlist. Entonces, hice un gran esfuerzo y se me ocurrió esto:
Cree un script bash llamado "showsqlprocesslist":
Ejecute el script:
Cola la salida:
Bingo bango. A pesar de que no está estrangulado, solo tomó 2-4% de CPU en las cajas en las que lo ejecuté. Espero que esto ayude a alguien.
fuente
strace
La forma más rápida de ver consultas MySQL / MariaDB en vivo es usar el depurador. En Linux puedes usar
strace
, por ejemplo:Puesto que hay gran cantidad de caracteres de escape, es posible formato de salida de strace por tuberías (sólo tiene que añadir
|
entre estos dos de una sola línea) anterior en el siguiente orden:Por lo tanto, debería ver consultas SQL bastante limpias sin tiempo, sin tocar los archivos de configuración.
Obviamente, esto no reemplazará la forma estándar de habilitar registros, que se describe a continuación (que implica volver a cargar el servidor SQL).
dtrace
Use las sondas MySQL para ver las consultas MySQL en vivo sin tocar el servidor. Script de ejemplo:
Guarde el script anterior en un archivo (como
watch.d
) y ejecute:Obtenga más información: Introducción a DTracing MySQL
Catalejo MySQL de Gibbs
Mira esta respuesta .
Registros
Estos son los pasos útiles para el desarrollo que propone.
Agregue estas líneas en su
~/.my.cnf
o globalmy.cnf
:Rutas:
/var/log/mysqld.log
o/usr/local/var/log/mysqld.log
también puede funcionar dependiendo de los permisos de su archivo.luego reinicie su MySQL / MariaDB por (prefijo con
sudo
si es necesario):Luego revise sus registros:
Después de terminar, cambiar
general_log
a0
(para que pueda utilizarlo en el futuro), a continuación, quitar el archivo y el servidor SQL reinicio de nuevo:killall -HUP mysqld
.fuente
general_log
desde una consulta MySQL. Comenzará a escribir en el archivo al quegeneral_log_file
apunta.Esta es la configuración más fácil en una máquina Linux Ubuntu que he encontrado. Loco por ver todas las consultas en vivo.
Encuentre y abra su archivo de configuración MySQL, generalmente /etc/mysql/my.cnf en Ubuntu. Busque la sección que dice "Registro y replicación"
Simplemente elimine el comentario de la variable "log" para activar el registro. Reinicie MySQL con este comando:
Ahora estamos listos para comenzar a monitorear las consultas a medida que entran. Abra una nueva terminal y ejecute este comando para desplazar el archivo de registro, ajustando la ruta si es necesario.
Ahora ejecuta tu aplicación. Verá que las consultas de la base de datos comienzan a volar en la ventana de su terminal. (asegúrese de tener el desplazamiento y el historial habilitados en la terminal)
DE http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
fuente
Desde una línea de comando puedes ejecutar:
Reemplace los valores [x] con sus valores.
O mejor:
fuente
Echa un vistazo a mtop .
fuente
mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete.
mtop.sourceforge.net A veces es bastante útil.He estado buscando hacer lo mismo, y he creado una solución de varias publicaciones, además de haber creado una pequeña aplicación de consola para generar el texto de la consulta en vivo tal como está escrito en el archivo de registro. Esto fue importante en mi caso, ya que estoy usando Entity Framework con MySQL y necesito poder inspeccionar el SQL generado.
Pasos para crear el archivo de registro (alguna duplicación de otras publicaciones, todo aquí por simplicidad):
Edite el archivo ubicado en:
Agregue "log = development.log" al final del archivo. (Tenga en cuenta que guardar este archivo requirió que ejecutara mi editor de texto como administrador).
Use MySql workbench para abrir una línea de comando, ingrese la contraseña.
Ejecute lo siguiente para activar el registro general que registrará todas las consultas ejecutadas:
Esto hará que las consultas en ejecución se escriban en un archivo de texto en la siguiente ubicación.
Cree / ejecute una aplicación de consola que generará la información de registro en tiempo real:
Fuente disponible para descargar aquí
Fuente:
fuente
Además de las respuestas anteriores que describen cómo habilitar el registro general, tuve que modificar una variable adicional en mi instalación Vanilla MySql 5.6 antes de escribir cualquier SQL en el registro:
La configuración predeterminada era 'NINGUNO'.
fuente
Catalejo MySQL de Gibbs
AgilData lanzó recientemente el Asesor de escalabilidad MySQL de Gibbs (una herramienta de autoservicio gratuita) que permite a los usuarios capturar una transmisión en vivo de consultas para cargarlas en Gibbs. Spyglass (que es de código abierto) observará las interacciones entre sus servidores MySQL y las aplicaciones cliente. No se necesita reconfigurar o reiniciar el servidor de base de datos MySQL (cliente o aplicación).
GitHub: AgilData / gibbs-mysql-spyglass
Más información: captura de paquetes MySQL con Rust
Instalar comando:
fuente