Question

Est-il possible de faire des journaux lents MySQL de démarrer un nouveau fichier journal tous les jours? À l'heure actuelle est juste un gros fichier unique, et doivent grep lignes pour chaque jour. Il serait beaucoup plus pratique d'avoir des fichiers séparés pour tous les jours de journaux lents.

Dois-je configurer un my.cnf ou une fonction linux?

Était-ce utile?

La solution

Tout le monde est utilisé pour celui-ci, le fichier texte bon vieux.

Il suffit de lancer ce qui suit pour vider un journal tous les jours lent

STEP 01) Désactiver le journal de requêtes lentes

SET GLOBAL slow_query_log = 'OFF';

STEP 02) Copiez le fichier texte

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

STEP 03) tronquer le fichier à zéro octets

echo -n > slow-query.log 

STEP 04) Allumez le journal des requêtes lentes

SET GLOBAL slow_query_log = 'ON';

Vous pourriez passer à log-output=TABLE et traiter comme une table à la requête.

STEP 01) de mysql.slow_log Convertir de CSV à MyISAM

ALTER TABLE mysql.slow_log ENGINE = MyISAM;

STEP 02) Index de la table

ALTER TABLE mysql.slow_log ADD INDEX (start_time);

STEP 03) Activer le format de journal pour être TABLE

[mysqld]
log-output=TABLE

STEP 04) service mysql restart

Une fois que vous démarrage mysqld, les entrées lentes du journal sont enregistrées dans la table MyISAM mysql.slow_log;

Pour faire pivoter les entrées avant minuit, vous pourriez quelque chose comme ceci:

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';

et c'est tout pour les journaux lents ...

Autres conseils

Mise à jour Comme le souligne Aaron sur, il y a la chance la copie et troncature peuvent manquer certaines entrées. Ainsi, la méthode plus sûre consiste à déplacer et FLUSH.

Original

Cet article a le principe de base à la rotation du journal des requêtes lentes que j'utilise. Fondamentalement, vous devez copier le journal lent à un nouveau fichier, puis tronquer le contenu du slow.log:

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

Si vous déplacez simplement le journal lent à un nouveau fichier et la création d'un nouveau « slow.log », il ne fonctionnera pas parce que le fichier converti a toujours le même inode et MySQL a encore ouvert. Je suppose que déplacer le fichier, puis émettre une commande FLUSH SLOW LOGS fonctionnerait, comme qui clôt le dossier et rouvre, mais je trouve la copie et troncature d'être tout aussi efficace et ne nécessite la connexion à MySQL.

Son article mentionne en utilisant logrotate sous Linux, mais je fait une tâche cron pour courir une fois par jour à minuit pour le faire pour moi.

En outre, d'aborder la question de la réplication sur FLUSH LOGS:

FLUSH LOGS, MASTER FLUSH, FLUSH SLAVE, et FLUSH TABLES AVEC BLOCAGE READ (avec ou sans une liste de table) ne sont pas écrites dans le journal binaire dans tous les cas car ils provoqueraient des problèmes si répliquées à un esclave. [src]

Donc non, étant donné que ces déclarations ne sont pas écrites dans le journal binaire, il ne sera pas interférer avec la réplication. Pour vos besoins, je préciserais FLUSH SLOW LOGS seulement fermer / ouvrir le journal des requêtes lentes.

utiliser Logrotate.d effectuer une rotation quotidienne des fichiers et de garder autant de jours que vous le souhaitez ou les déplacer hors ... puis émettre un journaux-chasse du même script pour obtenir MySQL pour démarrer un nouveau fichier .... ayant que, dans rotate journal, mis à jour devrait vous obtenir ce que vous voulez ..

J'espère qu'un jour, ils mettent en œuvre quelque chose de semblable à « expire_log_days » pour le débogage des journaux comme Genlog et log lent

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top