Pregunta

¿Hay alguna forma de hacer registros lentos de MySQL para iniciar un nuevo archivo de registro todos los días? Por el momento, es solo un archivo grande y tiene que tener líneas para cada día. Sería mucho más conveniente tener archivos separados para cada día de registros lentos.

¿Tengo que configurar una función my.cnf o alguna función de Linux?

¿Fue útil?

Solución

Todos están acostumbrados a este, el viejo archivo de texto.

Simplemente ejecute lo siguiente para descargar un registro lento todos los días

Paso 01) Apague el registro de consulta lenta

SET GLOBAL slow_query_log = 'OFF';

Paso 02) Copie el archivo de texto

cat slow-query.log | gzip > /logs/slow-query-`date +"%Y%m%d-%H%M"`.log.gz

Paso 03) truncar el archivo a cero bytes

echo -n > slow-query.log 

Paso 04) Encienda el registro de consulta lenta

SET GLOBAL slow_query_log = 'ON';

Podrías cambiar a log-output=TABLE y lidiar con él como una mesa para consultar.

Paso 01) Convierta mysql.slow_log de csv a myisam

ALTER TABLE mysql.slow_log ENGINE = MyISAM;

Paso 02) indexe la tabla

ALTER TABLE mysql.slow_log ADD INDEX (start_time);

Paso 03) Active el formato de registro para ser la tabla

[mysqld]
log-output=TABLE

Paso 04) service mysql restart

Una vez que inicia MySQLD, las entradas de registro lento se registran en la tabla Myisam mysql.slow_log;

Para rotar las entradas antes de la medianoche, podrías algo como esto:

SET GLOBAL slow_query_log = 'OFF';
SET @dt = NOW();
SET @dtstamp = DATE_FORMAT(@dt,'%Y%m%d_%H%i%S');
SET @midnight = DATE(@dt) + INTERVAL 0 SECOND;
ALTER TABLE mysql.slow_log RENAME mysql.slow_log_old;
CREATE TABLE mysql.slow_log LIKE mysql.slow_log_old;
INSERT INTO mysql.slow_log SELECT * FROM mysql.slow_log_old WHERE start_time >= @midnight;
DELETE FROM mysql.slow_log_old WHERE start_time >= @midnight;
SET @sql = CONCAT('ALTER TABLE mysql.slow_log_old RENAME mysql.slow_log_',@dtstamp);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 
SET GLOBAL slow_query_log = 'ON';

Y eso es todo para registros lentos ...

Otros consejos

ActualizarComo señala Aaron, existe la posibilidad de que la copia y truncada pueda perderse algunas entradas. Entonces, el método más seguro es moverse y FLUSH.

Original

Este artículo Tiene el principio básico para rotar el registro de consulta lenta que uso. Básicamente, debe copiar el registro lento a un nuevo archivo, luego truncar el contenido de Slow.log:

cp log/slow.log log/slow.log.`date +%M`; > log/slow.log

Si solo mueve el registro lento a un nuevo archivo y crea un nuevo 'Slow.log', no funcionará porque el archivo movido todavía tiene el mismo inodeo, y MySQL todavía lo tiene abierto. Supongo que mover el archivo y luego emitir un FLUSH SLOW LOGS El comando funcionaría, ya que eso cierra el archivo y vuelve a abrir, pero creo que la copia y truncada es igual de efectiva y no requiere iniciar sesión en MySQL.

Su artículo menciona el uso de Logrotate en Linux, pero acabo de hacer un Cronjob para correr una vez al día a la medianoche para hacer esto por mí.

Además, para abordar el problema de la replicación en FLUSH LOGS:

Los registros de descarga, el maestro de descarga, el esclavo de descarga y las tablas de descarga con bloqueo de lectura (con o sin lista de tabla) no se escriben en el registro binario en ningún caso porque causarían problemas si se replican a un esclavo. SRC

Entonces, no, dado que esas declaraciones no se escriben en el registro binario, no interferirá con la replicación. Para sus propósitos, especificaría FLUSH SLOW LOGS Para cerrar/abrir solo el registro de consulta lenta.

Use LoGrotate.d para rotar diariamente los archivos y mantenga tantos días como desee o muévalos ... luego emita un registro de descarga del mismo script para que MySQL inicie un nuevo archivo ... tenerlo en LOG Gire, configurado diariamente debería conseguirle lo que quiere.

Espero que algún día implementen algo similar a 'expire_log_days' para depurar registros como Genlog y Llog Log

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