¿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.
¿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.
Respuestas:
Inicie mysql con la opción --log:
mysqld --log=log_file_name
o coloque lo siguiente en su my.cnf
archivo:
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-queries
opció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_time
el número de segundos que debe demorar una consulta para ejecutarse antes de iniciar sesión.
( 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:
mysql
base 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'
SET global general_log = 1;
SET global log_output = 'table';
select * from mysql.general_log
SET global general_log = 0;
CREATE TABLE
comandos deberían (si las tablas no existen) ejecutarse en la mysql
base de datos, no en ninguna base de datos creada por el usuario. Quizás las declaraciones SQL podrían actualizarse para reflejar eso.
SELECT * FROM mysql.general_log order by (event_time) desc
será mejor. solo digo. :-)
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;
GRANT SUPER ON *.* TO user1@localhost
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.
phpMyAdmin
?
general_log_file=filename.log
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
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
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
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 :))
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
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.