Registrar todas las consultas en mysql


279

¿Es posible para mí activar el registro de auditoría en mi base de datos mysql?

Básicamente quiero monitorear todas las consultas durante una hora y volcar el registro en un archivo.


8
TMS

Para beneficio de los lectores: no se pierdan de leer la pregunta en el comentario anterior.
garras

Puede consultar mi respuesta existente publicada aquí dba.stackexchange.com/a/62477/6037
Peter Venderberghe

Respuestas:


166

Inicie mysql con la opción --log:

mysqld --log=log_file_name

o coloque lo siguiente en su my.cnfarchivo:

log = log_file_name

Cualquiera de los dos registrará todas las consultas en log_file_name.

También puede registrar solo consultas lentas utilizando la --log-slow-queriesopción en lugar de --log. De manera predeterminada, las consultas que demoran 10 segundos o más se consideran lentas, puede cambiar esto configurando long_query_timeel número de segundos que debe demorar una consulta para ejecutarse antes de iniciar sesión.


61
No hay que decirlo, pero dejar esto activado en una caja de producción termina siendo poco entretenido muy rápidamente. g
ceejayoz el

66
Si tiene problemas para habilitar el registro de esta manera, verifique que el usuario de mysql pueda escribir en la ubicación de archivo adecuada.
Jon Topper el

3
¿Es posible registrar consultas sobre 1 particuarl db / table solamente?
Temujin

2
@Temujin phpmyadmin ahora tiene una opción de 'seguimiento' para las tablas donde especifique un registro ('versión') y mantendrá un registro de las consultas que lo afectan con información sobre el tiempo y toda la consulta.
gadget00

3
Esta respuesta aceptada debe eliminarse o editarse para reflejar el hecho de que no funciona con MySQL 5.6. +.
itoctopus

233

( Nota : para mysql-5.6 + esto no funcionará. Hay una solución que se aplica a mysql-5.6 + si se desplaza hacia abajo o hace clic aquí ).

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

  • Crea tus tablas de registro en la mysqlbase de datos
  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `command_type` varchar(64) NOT NULL,
   `argument` mediumtext NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
  • Habilite el registro de consultas en la base de datos
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;

14
No estoy seguro de si esto es cierto para todas las versiones de MySQL (estoy en 5.5), pero no tuve que crear las tablas. Seguí el mismo consejo menos crear las tablas, que se menciona aquí: stackoverflow.com/a/678310/135101
Tyler Collier el

Tal vez ya fue creado por una u otra razón, @TylerCollier
Alexandre Marcondes

3
Cabe señalar que los CREATE TABLEcomandos deberían (si las tablas no existen) ejecutarse en la mysqlbase de datos, no en ninguna base de datos creada por el usuario. Quizás las declaraciones SQL podrían actualizarse para reflejar eso.
Robert Rossmann

2
Para ver el registro SELECT * FROM mysql.general_log order by (event_time) descserá mejor. solo digo. :-)
vinrav

No esté de acuerdo con la nota : con la versión del servidor 5.6.37 funciona completamente correctamente. Gracias.
Dmitriy Olhovsky

215

Además de lo que encontré aquí, ejecutar lo siguiente fue la forma más sencilla de volcar consultas a un archivo de registro sin reiniciar

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

se puede apagar con

SET global general_log = 0;

66
Absolutamente me encanta esto, funciona para conexiones existentes y nuevas en el DB
Carlton

1
Hubo algunas entradas de Estadísticas, no estoy seguro de cuáles son, pero, de lo contrario, funciona muy bien.
Snowcrash

Para que esto funcione, su usuario debe tener el privilegio SUPER, que es un privilegio de base de datos global y, por lo tanto, no puede limitarse a esquemas o tablas específicos:GRANT SUPER ON *.* TO user1@localhost
RobM

Votaría que más de una vez si pudiera, tengo un marcador apuntando aquí :) ¡Muchas gracias!
resi

125

La respuesta superior no funciona en mysql 5.6+. Use esto en su lugar:

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

en su archivo my.cnf / my.ini

Ubuntu / Debian : /etc/mysql/my.cnf
Windows : c: \ ProgramData \ MySQL \ MySQL Server 5.x
wamp : c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c: \ xampp \ mysql \ bin \ my.ini.


1
Si lo ha usado, ¿puede decirme el impacto en el rendimiento de lo anterior, y sería conveniente habilitar el registro de esta manera?
Ramesh Pareek

1
El impacto en el rendimiento de Ramesh parece estar alrededor del 5-15% de disminución en el rendimiento. Más información aquí percona.com/blog/2009/02/10/…
Firze

1
No entiendo por qué Mysql 5.6 no permite que el archivo de registro se establezca a partir de consultas. ¿Cómo registrar todas las consultas en MySQL 5.6 y posteriores cuando no tiene acceso al árbol de directorios del servidor pero solo phpMyAdmin?
Vicky Dev

reinicie el servicio mysql desde el panel de control xampp después de estos cambios.
Paramjeet

Esto funcionó para mí en mi entorno local de Xampp Apache, pero aún tenía que activar el inicio de sesión a través de phpMyAdmin. Además, no pudo ubicar el archivo en la carpeta / usr / log, ni lo creó, pero funcionó bien comogeneral_log_file=filename.log
JoeP

36

Habilite el registro para la tabla

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

Ver registro por consulta seleccionada

select * from mysql.general_log

¿hay un comodín para registrar todas las tablas? (hay bastantes: C)
RicardoE

Gracias, esta configuración fue muy útil para mí ya que no pude eliminar el servidor mysql. También quiero que el registro aparezca en la tabla de registro
Gunnar Sigfusson

14

Forma rápida de habilitar MySQL General Query Log sin reiniciar.

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

He instalado mysql a través de homebrew, versión de mysql: mysql Ver 14.14 Distrib 5.7.15, para osx10.11 (x86_64) usando el envoltorio EditLine


6

Para el registro, general_log y slow_log se introdujeron en 5.1.6:

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

5.2.1. Selección de destinos de salida de registro de consulta general y consulta lenta

A partir de MySQL 5.1.6, MySQL Server proporciona un control flexible sobre el destino de la salida al registro de consultas generales y el registro de consultas lentas, si esos registros están habilitados. Los posibles destinos para las entradas de registro son los archivos de registro o las tablas general_log y slow_log en la base de datos mysql


5

Debe tener en cuenta que el inicio de sesión en mysql realmente afecta el rendimiento, pero puede ser algo inteligente.

Normalmente lo dejo en el servidor de desarrollo (excepto cuando nos vuelve locos :))


2

Versión de OS / mysql:

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

Agregar registro (ejemplo, no creo que /var/log/...sea ​​la mejor ruta en Mac OS, pero funcionó:

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

Mysql reiniciado

Resultado:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

1

En caso de usar AWS RDS MYSQL, guía paso a paso aquí.

Cuando se configura como salida 'archivo', puede ver el registro directamente desde la consola de "registro" de AWS RDS.

AWS RDS MYSQL Logging

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.