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?
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.
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';
select * from mysql.general_log;
SET global general_log = 0;
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.
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.
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)
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
/etc/mysql/mysql.conf.d
et activer les lignes ci-dessous
general_log_file = /var/log/mysql/mysql.log
general_log = 1
/etc/init.d/mysql restart
/var/log/mysql/
et consultez les journauxIl 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.
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
...
...
...
...
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.
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;
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
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.
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.
// 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;