Pregunta

¿Hay que hacer que MySQL arroje su registro a un servidor remoto MySQL?

Me gustaría auditar las conexiones MySQL, pero no quiero que el servidor almacene toda la información local en su propio hardware.

¿Fue útil?

Solución

Tengo buenas y malas noticias sobre este.

BUENAS NOTICIAS

Puede usar el registro general como una tabla que puede consultar

Paso 01) Agregue esto a /etc/my.cnf

[mysqld] 
log
log-output=TABLE 

Paso 02) service mysql restart

Ok mysqld no graba todas las consultas en la mesa mysql.general_log. Problema: mire el diseño inicial de mysql.general_log:

mysql> show create table mysql.general_log\G 
*************************** 1. row *************************** 
       Table: general_log 
Create Table: CREATE TABLE `general_log` ( 
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
  `user_host` mediumtext NOT NULL, 
  `thread_id` int(11) 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' 
1 row in set (0.09 sec) 

¿De qué sirve un registro general como tabla CSV?

Paso 03) Hacer mysql.general_log una tabla de myisam e indexarla

 SET @old_log_state = @@global.general_log; 
 SET GLOBAL general_log = 'OFF'; 
 ALTER TABLE mysql.general_log ENGINE = MyISAM; 
 ALTER TABLE mysql.general_log ADD INDEX (event_time); 
 SET GLOBAL general_log = @old_log_state; 

Ahora se ve así:

mysql> show create table general_log\G
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL,
  KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)

mysql>

Los valores de usuario y host se agregan juntos en los campos user_host.

¿Cómo se gira el registro general?

Aquí hay un ejemplo de cómo en blanco mysql.general_log:

SET @old_log_state = @@global.general_log; 
SET GLOBAL general_log = 'OFF'; 
CREATE TABLE mysql.general_log_new LIKE mysql.general_log; 
DROP TABLE mysql.general_log; 
ALTER TABLE mysql.general_log_new RENAME mysql.general_log; 
SET GLOBAL general_log = @old_log_state; 

Aquí hay un ejemplo de cómo mantener los últimos 3 días de entradas:

SET @old_log_state = @@global.general_log; 
SET GLOBAL general_log = 'OFF'; 
CREATE TABLE mysql.general_log_new LIKE mysql.general_log; 
INSERT INTO mysql.general_log_new 
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY; 
DROP TABLE mysql.general_log; 
ALTER TABLE mysql.general_log_new RENAME mysql.general_log; 
SET GLOBAL general_log = @old_log_state; 

MALAS NOTICIAS

Cualquier cosa que haya recopilado en la versión de archivo de texto del registro general no vendrá para el viaje. Puede recolectar nuevas entradas en el futuro.

Otros consejos

Puede configurar un montaje NFS en su servidor de destino y simplemente apunte la ruta de registro general a ese soporte.

En lugar de reiniciar mysql, puedes hacer esto:

SET GLOBAL log_output = 'TABLE';

El servidor comenzará inmediatamente a iniciar sesión para `mysql`.`general_log`.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top