Come faccio i registri di uscita MySQL per syslog?
Domanda
voglio usare syslog per l'accesso MySQL (5.1.41) su Ubuntu (10.04 LTS). Ho trovato informazioni che log degli errori di output a syslog.
[mysqld_safe]
syslog
Ma io voglio usare syslog per accedere i registri generali e log delle query lente. Si prega di avvisare me come scrivere file di configurazione?
Non riuscivo a trovare il modo di farlo nel manuale di riferimento.
http://dev.mysql.com/doc/refman/5.1/en /log-destinations.html
Soluzione
Questo è molto più semplicemente fatto in questo modo:
cd alle cartelle mysql:
mkfifo mysql-general.log
in my.cnf dire che:
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
Quindi, configurare il syslog / syslog-ng per leggere il tubo FIFO e fare con essa, come lo farà ..
Nel mio caso, ho pipe attraverso rete ad un server centralizzato con solo i log di errore ei log delle query lente però.
In situazioni in cui si desidera conservare anche copia locale, basta impostarlo su uscita a tavola e file come descritto in precedenza.
Altri suggerimenti
Questo meccanismo è completamente diverso dal syslog OS.
Impostazione log-uscita può essere impostata sia a tavola, FILE (default), o NONE
se si utilizza questo
[mysqld]
log-output=TABLE
Questo farà sì che la registrazione per il registro generale e / o lento log di andare in un file CSV. È possibile convertire che CSV per MyISAM come segue:
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;
Si può quindi lasciare che questo file crescere enormemente e si dovrà eliminare la tabella di tanto in tanto. Ecco come eliminare la tabella general_log e mantenere gli ultimi 3 giorni:
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;
Che cosa circa lo syslog (var / log / messages)? È necessario script che da soli. In primo luogo, si sia bisogno di questo:
[mysqld]
log
log-ouput=TABLE,FILE
general-log-file=/var/log/mysql-general.log
se si desidera raccogliere il registro generale in entrambi i formati o
[mysqld]
log
general-log-file=/var/log/mysql-general.log
solo per il formato di file.
Ora fare uno script per le modifiche raccolte per /var/log/general.log. Lo script dovrebbe apparire un po 'come questo:
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
Esegui questo script ogni minuto. Vi consiglio troncare il registro generale ogni mezzanotte come questo
echo -n > /var/log/mysql-general.log
fare un tentativo !!!
In /etc/my.cnf, impostarlo.
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
Modifica file /etc/rsyslog.conf (RHEL / CentOS), e attivare il modulo imfile per leggere / path / to / mysql / dir / mysql -general.log e poi, inviarlo al server remoto syslog, rispettando un intervallo configurato nel PollingInterval parametro.
Questa sezione dovrebbe essere simile di seguito:
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 linea con WorkDirectory
$WorkDirectory /var/lib/rsyslog # where to place spool files
e configurarlo per inviare tutti i log in remoto
*.* @@remote-ip:514 ## For TCP Connection
o
*.* @remote-ip:514 ## For UDP Connection