¿Cómo los registros de MySQL salida I a syslog?
Pregunta
Quiero usar syslog para el registro de MySQL (5.1.41) en Ubuntu (10.04 LTS). He encontrado que la información de registro de errores de salida a syslog.
[mysqld_safe]
syslog
Pero quiero usar syslog para registrar los registros generales y registros de consultas lentas. Espero su consejo cómo escribir archivo de configuración?
No pudo encontrar la manera de hacer eso en el manual de referencia.
http://dev.mysql.com/doc/refman/5.1/en /log-destinations.html
Solución
Esto es mucho más simple hecho de esta manera:
cd a las carpetas de MySQL:
mkfifo mysql-general.log
en my.cnf dicen que:
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
A continuación, configure su syslog / syslog-ng a leer la tubería FIFO y hacer con ella lo que lo hará ..
En mi caso, la tubería al otro lado de la red a un servidor centralizado con sólo los registros de errores y registros de consultas lento sin embargo.
En situaciones en las que desea mantener también copia local, acaba de establecer en la salida a la tabla y el archivo como se describe anteriormente.
Otros consejos
Ese mecanismo es completamente diferente de registro del sistema operativo.
Si se utiliza este
[mysqld]
log-output=TABLE
Esto hará que el registro para el registro general y / o registro lento para ir a un archivo CSV. Puede convertir CSV a que MyISAM de la siguiente manera:
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;
A continuación, puede dejar este archivo crece enormemente y que tendrá que purgar la tabla de vez en cuando. Aquí es cómo purgar la tabla general_log y mantener los 3 últimos días:
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;
¿Qué hay de registro del sistema (var / log / messages)? Debe script que usted mismo. En primer lugar, que sea necesario lo siguiente:
[mysqld]
log
log-ouput=TABLE,FILE
general-log-file=/var/log/mysql-general.log
Si desea recopilar el registro general en ambos formatos o
[mysqld]
log
general-log-file=/var/log/mysql-general.log
por sólo el formato de archivo.
Ahora hacer un script para cobrar a los cambios /var/log/general.log. El guión debe parecerse mucho a esto:
NEWCOUNT=`wc -l < /var/log/mysql-general.log`
if [ -f /tmp/general-log-lines.txt ]
then
OLDCOUNT=`cat /tmp/general-log-lines.txt`
if [ ${OLDCOUNT} -lt ${NEWCOUNT} ]
then
DIFF=`echo ${NEWCOUNT}-${OLDCOUNT}|bc`
tail -${DIFF} < /var/log/mysql-general.log >> /var/log/messages
echo ${NEWCOUNT} > /tmp/general-log-lines.txt
fi
fi
Ejecutar este script cada minuto. Recomiendo truncar el registro general de cada medianoche como esto
echo -n > /var/log/mysql-general.log
darle una oportunidad !!!
En /etc/my.cnf, la puso.
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
Editar archivo /etc/rsyslog.conf (RHEL / CentOS), y activar el módulo imfile para leer / ruta / a / mysql / dir / MySQL -general.log y, a continuación, enviarlo al servidor de registro del sistema remoto, respetando un intervalo configurado en el parámetro PollingInterval.
Esta sección debe tener este aspecto a continuación:
module(load="imfile" PollingInterval="1")
input(type="imfile"
File="/path/to/mysql/dir/mysql-general.log"
stateFile="statefile-mysql-general"
Tag="mysql-general"
Severity="warning"
Facility="local1")
Uncoment la línea con WorkDirectory
$WorkDirectory /var/lib/rsyslog # where to place spool files
y configurarlo para enviar todos los registros de forma remota ??p>
*.* @@remote-ip:514 ## For TCP Connection
o
*.* @remote-ip:514 ## For UDP Connection