web-dev-qa-db-fra.com

Comment activer MySQL Query Log?

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

223
Feng-Chun Ting

Premièrement, 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 de requête, mettez ceci dans /etc/my.cnf dans la section [mysqld]

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

Aussi, pour l'activer depuis 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'option log est obsolète. Pour spécifier le fichier journal et activer la journalisation, utilisez ceci dans my.cnf dans la section [mysqld]:

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

Sinon, pour activer la journalisation à partir de la console MySQL (vous devez également spécifier l'emplacement du fichier journal 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. 

266
Gryphius

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

Enregistrer toutes les requêtes dans mysql


Voici un résumé:

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

  • Créez vos tables de journal (voir answer )

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

SET global general_log = 1;
SET global log_output = 'table';
  • Voir 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;
157
Alexandre Marcondes

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

Se connecter à une table  

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

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

Je peux alors faire quelque chose de similaire à tail -f sur le fichier 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 facilite la visualisation de 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.

51
Layke

Cela figurait déjà dans un commentaire, mais mérite sa propre réponse: Sans éditer les fichiers de configuration:

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

N'oubliez pas de l'éteindre après.

42
commonpike

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

SET GLOBAL general_log = 1 # (or 0 to disable)
13
Jon

Je voulais aussi activer le fichier journal MySQL pour voir les requêtes et j'ai résolu ce problème en suivant les instructions

  1. Aller au /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/ et consultez les journaux
6
shrikant

Il y a un bogue dans la version 5.6 de MySQL . 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 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

Fichier de contrôle: "C:\ProgramData\MySQL\MySQL Server 5.6\my.ini"

J'espère que ça aidera quelqu'un.

3
croonx

Sur Windows, vous pouvez simplement aller à 

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

Insérer 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
...
...
...
...
2
HimalayanCoder

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

Résumé de l'histoire, ne mettez pas general_log=1 dans le fichier .cnf. Utilisez plutôt set global general_log =1 pendant une brève durée, juste pour vous connecter suffisamment pour savoir ce que vous essayez de trouver, puis désactivez-le. 

1
Allen King

Pour activer le journal de requête dans la machine MAC:

Ouvrez le fichier suivant:

vi /private/etc/my.cnf

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

[mysqld]

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

Peu de machines n'enregistrent pas correctement la requête, vous pouvez donc l'activer depuis la console MySQL

mysql> SET global general_log = 1;
1
Kumanan

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
1
lptn

J'ai dû laisser tomber et recréer le journal général à un moment donné. Pendant la récréation, les jeux de caractères se sont égarés et j'ai finalement eu 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 de "vérifier que la journalisation est activée" ne fonctionne pas pour vous, assurez-vous que vos champs ont le bon jeu de caractères.

0
William Neely

Dans phpMyAdmin 4.0, vous allez dans Status> Monitor. Vous pouvez y activer le journal de requête lent et le journal général, afficher un moniteur en direct, sélectionner une partie du graphique, voir les requêtes associées et les analyser.

0
Marc Delisle
// 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; 
0