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?
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?
Réponses:
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.cnf
dans 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' log
option 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.
SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
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';
select * from mysql.general_log;
SET global general_log = 0;
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 -f
sur 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.
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;
/tmp/
, il pourrait se retrouver quelque part comme/tmp/systemd-private-...-mariadb.service-.../tmp/
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)
Je voulais également activer le fichier journal MySQL pour voir les requêtes et j'ai résolu cela avec les instructions ci-dessous
/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/
voir les journaux// 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;
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
...
...
...
...
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.
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
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;
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 =1
accidentellement 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=1
dans le .cnf
dossier. Au lieu de cela, utilisez-le set global general_log =1
pendant une brève durée juste pour vous connecter suffisamment pour découvrir ce que vous essayez de découvrir, puis désactivez-le.
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.
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.