¿Cómo habilitar MySQL Query Log?

252

¿Cómo habilito la función MySQL que registra cada declaración de consulta SQL recibida de los clientes y el momento en que se envió esa declaración de consulta? ¿Puedo hacer eso en phpmyadmin o NaviCat? ¿Cómo analizo el registro?

Ting Feng-Chun
fuente

Respuestas:

302

Primero, recuerde que este archivo de registro puede crecer mucho en un servidor ocupado.

Para mysql <5.1.29:

Para habilitar el registro de consultas, colóquelo /etc/my.cnfen la [mysqld]sección

log   = /path/to/query.log  #works for mysql < 5.1.29

Además, para habilitarlo desde la consola MySQL

SET general_log = 1;

Ver http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Para mysql 5.1.29+

Con mysql 5.1.29+, la logopción está en desuso. Para especificar el archivo de registro y habilitar el registro, use esto en my.cnf en la [mysqld]sección:

general_log_file = /path/to/query.log
general_log      = 1

Alternativamente, para activar el registro desde la consola de MySQL (también debe especificar la ubicación del archivo de registro de alguna manera, o encontrar la ubicación predeterminada):

SET global general_log = 1;

También tenga en cuenta que hay opciones adicionales para registrar solo consultas lentas, o aquellas que no usan índices.

Grifo
fuente
1
Esto no funciona en MySQL 5.6.19. ¿Lo cambiaron de nuevo?
Alex R
55
general_log = en general_log_file = / path / to / query.log funcionó para mí
Kiren Siva
27
Esto funcionó para mí (MySQL 5.6.12 en Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youen
Asegúrese de que los permisos de acceso de usuario mysql para el archivo de registro, o devolverá un error 'no encontrado' al configurar el parámetro general_log en la consola MySQL
Will R.
Para 5.6.22 @youen lo hizo exactamente bien. ¡Gracias! Lo único que debe asegurarse es que el directorio y el archivo en el que se está escribiendo existe y que mysql lo puede escribir.
NightOwlPrgmr
189

Eche un vistazo a esta respuesta a otra pregunta relacionada. Muestra cómo habilitar, deshabilitar y ver los registros en servidores en vivo sin reiniciar.

Registrar todas las consultas en mysql


Aquí hay un resumen:

Si no desea o no puede reiniciar el servidor MySQL, puede proceder así en su servidor en ejecución:

  • Crea tus tablas de registro (ver respuesta )

  • Habilite el registro de consultas en la base de datos (tenga en cuenta que la cadena 'tabla' debe escribirse literalmente y no sustituirse por ningún nombre de tabla. Gracias Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Ver el registro
select * from mysql.general_log;
  • Deshabilitar el registro de consultas en la base de datos
SET global general_log = 0;
Alexandre Marcondes
fuente
19
Debe tenerse en cuenta que 'tabla' debe ingresarse literalmente y no reemplazarse con un nombre de tabla en su base de datos.
Nicholas Pickering
1
En Mac OS X, el instalador del software MySQL parece haber creado automáticamente la tabla general_log, con el tipo CSV. Esto significa que también puedo seguir el archivo CSV correspondiente: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth
Después de SET global log_output = 'table'; ¿La consulta lenta se escribirá en un archivo? Creo que después de SET global general_log = 0; debe establecer el valor anterior 'log_output', probablemente sea 'FILE'
user2602807
59

Utilizo este método para iniciar sesión cuando quiero optimizar rápidamente diferentes cargas de página. Es un pequeño consejo ...

Iniciar sesión en una TABLA

SET global general_log = 1;
SET global log_output = 'table';

Luego puede seleccionar de mi mysql.general_logtabla para recuperar consultas recientes.

Entonces puedo hacer algo similar tail -fen mysql.log, pero con más mejoras ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Esto facilita ver mis consultas que puedo tratar de recortar. Utilizo un intervalo de 8 segundos para buscar solo consultas ejecutadas en los últimos 8 segundos.

Layke
fuente
57

Esto ya estaba en un comentario, pero merece su propia respuesta: sin editar los archivos de configuración: en mysql, como root, do

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

No olvide apagarlo después:

SET global general_log = off;
Pico común
fuente
1
Descubrí que en Linux systemd, si intentas iniciar sesión en un archivo /tmp/, puede terminar en algún lugar como/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley
15

Puede deshabilitar o habilitar el registro de consultas generales (que registra todas las consultas) con

SET GLOBAL general_log = 1 # (or 0 to disable)
Jon
fuente
En mi caso, el registro de consultas generales no se puede habilitar en servidores de alojamiento compartido. Solo puedo habilitar el registro lento de consultas, y los administradores del sistema pueden proporcionar las entradas relacionadas con mi cuenta a pedido.
Feng-Chun Ting
9

También quería habilitar el archivo de registro de MySQL para ver las consultas y lo resolví con las instrucciones a continuación.

  1. Ir /etc/mysql/mysql.conf.d
  2. abra el mysqld.cnf

y habilite las siguientes líneas

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. reinicie MySQL con este comando /etc/init.d/mysql restart
  2. ve /var/log/mysql/y revisa los registros
shrikant
fuente
Está bien guardar esa configuración en el archivo conf para que se aplique cada vez que se inicia MySQL, pero no es necesario reiniciar MySQL para aplicar esta configuración. Puede configurarlo usando 'SET global' como dijeron otros.
Angel
6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 
Sameer Kumar Choudhary
fuente
3

En Windows simplemente puedes ir a

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Inserte esta línea en my.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

El archivo my.ini finalmente se ve así

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...
HimalayaCoder
fuente
3

Hay un error en la versión MySQL 5.6. Incluso mysqld se muestra como:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Realmente la configuración se lee en el siguiente orden:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Verifique el archivo: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Espero que ayude a alguien.

croonx
fuente
¿Hay algún informe de error en alguna parte para este error?
mwfearnley
1

para mysql> = 5.5 solo para consultas lentas (1 segundo y más) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
lptn
fuente
1
Esto es incorrecto, eso habilita el registro de consulta lento, no el registro de consulta.
Sam Dufel
Creo que tienes que usar guiones.
AFA Med
1

Para habilitar el registro de consultas en la máquina MAC:

Abre el siguiente archivo:

vi /private/etc/my.cnf

Establezca la URL de registro de consulta en la sección 'mysqld' de la siguiente manera:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Pocas máquinas no están registrando la consulta correctamente, por lo que puede habilitarla desde la consola MySQL

mysql> SET global general_log = 1;
Kumanan
fuente
1

No es exactamente una respuesta a la pregunta porque la pregunta ya tiene excelentes respuestas. Esta es una información lateral. Habilitar general_log realmente afecta el rendimiento de MySQL. Me fui general_log =1accidentalmente a un servidor de producción y pasé horas descubriendo por qué el rendimiento no era comparable a una configuración similar en otros servidores. Luego encontré esto que explica el impacto de habilitar el registro general. http://www.fromdual.com/general_query_log_vs_mysql_performance .

La esencia de la historia, no poner general_log=1en el .cnfarchivo. En su lugar, utilice set global general_log =1durante un breve período de tiempo solo para iniciar sesión lo suficiente como para descubrir lo que está tratando de averiguar y luego apagarlo.

Rey Allen
fuente
0

En phpMyAdmin 4.0, vas a Estado> Monitor. Allí puede habilitar el registro lento de consultas y el registro general, ver un monitor en vivo, seleccionar una parte del gráfico, ver las consultas relacionadas y analizarlas.

Marc Delisle
fuente
0

Tuve que soltar y volver a crear el registro general en un punto. Durante la recreación, los juegos de caracteres se estropearon y terminé teniendo este error en los registros:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Entonces, si la respuesta estándar de "verificar para asegurarse de que el registro está activado" no funciona para usted, verifique que sus campos tengan el conjunto de caracteres correcto.

William Neely
fuente