Comment activer le journal des requêtes MySQL?

252

Comment activer la fonction MySQL qui enregistre chaque instruction de requête SQL reçue des clients et l'heure à laquelle cette instruction de requête a été soumise? Puis-je le faire dans phpmyadmin ou NaviCat? Comment analyser le journal?

Feng-Chun Ting
la source

Réponses:

302

Tout d'abord, n'oubliez pas que ce fichier journal peut devenir très volumineux sur un serveur occupé.

Pour mysql <5.1.29:

Pour activer le journal des requêtes, placez-le /etc/my.cnfdans la [mysqld]section

log   = /path/to/query.log  #works for mysql < 5.1.29

Aussi, pour l'activer à partir de la console MySQL

SET general_log = 1;

Voir http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Pour mysql 5.1.29+

Avec mysql 5.1.29+, l' logoption est déconseillée. Pour spécifier le fichier journal et activer la journalisation, utilisez ceci dans my.cnf dans la [mysqld]section:

general_log_file = /path/to/query.log
general_log      = 1

Alternativement, pour activer la journalisation à partir de la console MySQL (vous devez également spécifier l'emplacement du fichier journal d'une manière ou d'une autre, ou trouver l'emplacement par défaut):

SET global general_log = 1;

Notez également qu'il existe des options supplémentaires pour consigner uniquement les requêtes lentes ou celles qui n'utilisent pas d'index.

Gryphius
la source
1
Cela ne fonctionne pas dans MySQL 5.6.19. L'ont-ils changé à nouveau?
Alex R
5
general_log = on general_log_file = / path / to / query.log a fonctionné pour moi
Kiren Siva
27
Cela a fonctionné pour moi (MySQL 5.6.12 sur Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youen
Assurez-vous que les autorisations d'accès utilisateur mysql pour le fichier journal, ou il retournera une erreur «introuvable» lors de la définition du paramètre general_log dans la console MySQL
Will R.
Pour 5.6.22, @youen avait parfaitement raison. Merci! La seule chose à vérifier est que le répertoire et le fichier en cours d'écriture existent et sont accessibles en écriture par mysql.
NightOwlPrgmr
189

Jetez un oeil sur cette réponse à une autre question connexe. Il montre comment activer, désactiver et afficher les journaux sur des serveurs en direct sans redémarrer.

Consigner toutes les requêtes dans mysql


En voici un résumé:

Si vous ne voulez pas ou ne pouvez pas redémarrer le serveur MySQL, vous pouvez procéder comme ceci sur votre serveur en cours d'exécution:

  • Créez vos tables de log (voir réponse )

  • Activer la journalisation des requêtes sur la base de données (Notez que la chaîne 'table' doit être mise littéralement et ne pas être substituée par un nom de table. Merci Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Afficher le journal
select * from mysql.general_log;
  • Désactiver la journalisation des requêtes sur la base de données
SET global general_log = 0;
Alexandre Marcondes
la source
19
Il convient de noter que «table» est censé être entré littéralement et non remplacé par un nom de table dans votre base de données.
Nicholas Pickering
1
Sur Mac OS X, le programme d'installation du logiciel MySQL semble avoir créé automatiquement la table general_log, avec le type CSV. Cela signifie que je peux également suivre le fichier CSV correspondant: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth
Après avoir défini global log_output = 'table'; est la requête lente va écrire dans un fichier? Je pense qu'après SET global general_log = 0; vous devez définir la valeur précédente de «log_output», elle sera probablement «FILE»
user2602807
59

J'utilise cette méthode pour me connecter lorsque je souhaite optimiser rapidement différents chargements de page. C'est un petit conseil ...

Connexion à une table

SET global general_log = 1;
SET global log_output = 'table';

Vous pouvez ensuite sélectionner parmi mes mysql.general_log table pour récupérer les requêtes récentes.

Je peux alors faire quelque chose de similaire à tail -fsur mysql.log, mais avec plus de raffinements ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Cela permet de voir facilement mes requêtes que je peux essayer de réduire. J'utilise un intervalle de 8 secondes pour récupérer uniquement les requêtes exécutées au cours des 8 dernières secondes.

Layke
la source
57

C'était déjà dans un commentaire, mais mérite sa propre réponse: Sans éditer les fichiers de configuration: dans mysql, en tant que root, faites

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

N'oubliez pas de l'éteindre ensuite:

SET global general_log = off;
pic commun
la source
1
J'ai trouvé que sous Linux systemd, si vous essayez de vous connecter à un fichier /tmp/, il pourrait se retrouver quelque part comme/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley
15

Vous pouvez désactiver ou activer le journal général des requêtes (qui enregistre toutes les requêtes) avec

SET GLOBAL general_log = 1 # (or 0 to disable)
Jon
la source
Dans mon cas, le journal général des requêtes ne peut pas être activé sur les serveurs d'hébergement partagé. Je ne peux activer que le journal des requêtes lentes et les administrateurs système peuvent fournir les entrées liées à mon compte sur demande.
Feng-Chun Ting
9

Je voulais également activer le fichier journal MySQL pour voir les requêtes et j'ai résolu cela avec les instructions ci-dessous

  1. Aller à /etc/mysql/mysql.conf.d
  2. ouvrez le mysqld.cnf

et activer les lignes ci-dessous

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. redémarrez MySQL avec cette commande /etc/init.d/mysql restart
  2. allez /var/log/mysql/voir les journaux
shrikant
la source
Vous pouvez enregistrer ces paramètres dans le fichier conf afin de les appliquer à chaque démarrage de MySQL, mais vous n'avez pas besoin de redémarrer MySQL pour appliquer cette configuration. Vous pouvez le définir en utilisant 'SET global' comme d'autres l'ont dit.
Angel
6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 
Sameer Kumar Choudhary
la source
3

Sous Windows, vous pouvez simplement accéder à

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Insérez cette ligne dans my.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

Le fichier my.ini ressemble enfin à ceci

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...
HimalayanCoder
la source
3

Il y a un bug dans la version MySQL 5.6. Même mysqld se présente comme:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Les paramètres sont vraiment lus dans l'ordre suivant:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Vérifiez le fichier: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

J'espère que cela aidera quelqu'un.

croonx
la source
Y a-t-il un rapport de bogue quelque part pour ce bogue?
mwfearnley
1

pour mysql> = 5.5 uniquement pour les requêtes lentes (1 seconde et plus) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
lptn
la source
1
Ceci est incorrect - cela active le journal des requêtes lentes, pas le journal des requêtes.
Sam Dufel
Je pense que vous devez utiliser des tirets.
AFA Med du
1

Pour activer le journal des requêtes dans MAC Machine:

Ouvrez le fichier suivant:

vi /private/etc/my.cnf

Définissez l'URL du journal des requêtes sous la section 'mysqld' comme suit:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Peu de machines n'enregistrent pas correctement les requêtes, donc dans ce cas, vous pouvez l'activer à partir de la console MySQL

mysql> SET global general_log = 1;
Kumanan
la source
1

Pas exactement une réponse à la question car la question a déjà d'excellentes réponses. Ceci est une info secondaire. L'activation de general_log a vraiment nui aux performances de MySQL. Je suis parti general_log =1accidentellement sur un serveur de production et j'ai passé des heures à découvrir pourquoi les performances n'étaient pas comparables à une configuration similaire sur d'autres serveurs. Ensuite, j'ai trouvé cela qui explique l'impact de l'activation du journal général. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Essentiel de l'histoire, ne mettez pas general_log=1dans le .cnfdossier. Au lieu de cela, utilisez-le set global general_log =1pendant une brève durée juste pour vous connecter suffisamment pour découvrir ce que vous essayez de découvrir, puis désactivez-le.

Allen King
la source
0

Dans phpMyAdmin 4.0, vous accédez à État> Moniteur. Vous pouvez y activer le journal des requêtes lentes et le journal général, voir un moniteur en direct, sélectionner une partie du graphique, voir les requêtes associées et les analyser.

Marc Delisle
la source
0

J'ai dû abandonner et recréer le journal général à un moment donné. Pendant la récréation, les jeux de caractères ont été gâchés et j'ai fini par avoir cette erreur dans les journaux:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Donc, si la réponse standard "vérifier que la connexion est activée" ne fonctionne pas pour vous, vérifiez que vos champs ont le bon jeu de caractères.

William Neely
la source