Comment afficher les dernières requêtes exécutées sur MySQL?


471

Existe-t-il une requête / un moyen d'afficher les dernières requêtes exécutées sur TOUS les serveurs?

Réponses:


793

Pour ceux bénis avec MySQL> = 5.1.12, vous pouvez contrôler cette option globalement au moment de l'exécution:

  1. Exécuter SET GLOBAL log_output = 'TABLE';
  2. Exécuter SET GLOBAL general_log = 'ON';
  3. Jetez un oeil à la table mysql.general_log

Si vous préférez exporter vers un fichier au lieu d'une table:

  1. SET GLOBAL log_output = "FILE"; la valeur par défaut .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Je préfère cette méthode à l'édition de fichiers .cnf car:

  1. vous n'éditez pas le my.cnffichier et n'activez pas de façon permanente la journalisation
  2. vous ne pêchez pas autour du système de fichiers à la recherche du journal des requêtes - ou pire encore, distrait par le besoin de la destination parfaite. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Vous n'avez pas besoin de redémarrer le serveur et d'interrompre toutes les connexions actuelles avec celui-ci.
  4. le redémarrage du serveur vous laisse là où vous avez commencé (le journal est par défaut toujours désactivé)

Pour plus d'informations, consultez le manuel de référence MySQL 5.1 - Variables système du serveur - general_log


4
Grande conception d'interface utilisateur. Quoi qu'il en soit, les tables de journalisation MySQL utilisent en fait le moteur CSV, vous pouvez donc faire tout ce que FlipMcF a dit dans la réponse sur l'activation de la connexion à la table general_log, et avoir tail -f de general_log comme ceci: tail -f / var / lib / mysql / mysql / general_log.CSV

2
bon sang, le doc mysql pour cela ne tire même pas le paramètre table. Merci beaucoup.
Abhishek Dujari


6
n'oubliez pas d'effacer votre table de journal générale lorsque vous avez terminé: "truncate table mysql.general_log"
pdwalker

1
J'ai obtenu le résultat de cette façon, mais les paramètres sont présents par un point d'interrogation, par exemple, sélectionnez foo dans la barre où x = ?. Comment puis-je obtenir la requête complète?
okwap

43

Vous pouvez activer un journal de requête général pour ce type de diagnostic. En général, cependant, vous ne consignez pas toutes les requêtes SELECT sur un serveur de production, c'est un tueur de performances.

Modifiez votre configuration MySQL, par exemple /etc/mysql/my.cnf - recherchez ou ajoutez une ligne comme celle-ci

[mysqld]
log = /var/log/mysql/mysql.log

Redémarrez mysql pour reprendre ce changement, maintenant vous pouvez

tail -f /var/log/mysql/mysql.log

Hé hop, vous pouvez regarder les requêtes au fur et à mesure qu'elles arrivent.


4
general_log_file et general_log dans mon my.cnf
Martin Thoma

Cela fonctionne si vous voulez savoir redémarrer mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar

1
Les versions plus récentes de Mac OS X (au moins sur Mac OS X) nécessitent les options general_log_file et general_log au lieu de simplement "log =". Sinon, vous obtenez une erreur comme celle-ci: ERREUR / usr / local / mysql / bin / mysqld: option ambiguë '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth

@JaySheth, j'ai eu cette erreur sur Mariadb 10.2, donc je ne suis pas sûr que ce soit uniquement lié à Mac OS.
user10089632

16

Vous pouvez faire la chose fluide pour surveiller les journaux de requêtes mysql.

Ouvrez le fichier de configuration mysql my.cnf

sudo nano /etc/mysql/my.cnf

Recherchez les lignes suivantes sous un en- [mysqld]tête et décommentez ces lignes pour activer le journal

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Redémarrez votre serveur mysql pour refléter les changements

sudo service mysql start

Surveillez le journal du serveur mysql avec la commande suivante dans le terminal

tail -f /var/log/mysql/mysql.log

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1) Si la journalisation mysql générale est activée, nous pouvons vérifier les requêtes dans le fichier journal ou la table en fonction de ce que nous avons mentionné dans la configuration. Vérifiez ce qui est activé avec la commande suivante

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Si nous avons besoin de l'historique des requêtes dans le tableau,

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Jetez un œil à la table mysql.general_log

Si vous préférez exporter vers un fichier:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) On peut aussi vérifier les requêtes dans le fichier .mysql_history cat ~ / .mysql_history



4

Si mysql binlog est activé, vous pouvez vérifier les commandes exécutées par l'utilisateur en exécutant la commande suivante dans la console linux en parcourant le répertoire mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

habilitant

[mysqld]
log = /var/log/mysql/mysql.log

ou le journal général aura un effet sur les performances de mysql


possible, mais douloureux. plus utile si vous cherchez à voir ce qui s'est passé dans le passé.
pdwalker


2

Après avoir lu la réponse de Paul, j'ai continué à creuser pour plus d'informations sur https://dev.mysql.com/doc/refman/5.7/en/query-log.html

J'ai trouvé un code vraiment utile par une personne. Voici le résumé du contexte.

(Remarque: le code suivant n'est pas le mien)

Ce script est un exemple pour garder la table propre, ce qui vous aidera à réduire la taille de votre table. Comme après une journée, il y aura environ 180 000 requêtes de journal. (dans un fichier, ce serait 30 Mo par jour)

Vous devez ajouter une colonne supplémentaire (event_unix), puis vous pouvez utiliser ce script pour garder le journal propre ... il mettra à jour l'horodatage dans un horodatage Unix, supprimera les journaux antérieurs à 1 jour, puis mettra à jour l'événement_heure dans l'horodatage from event_unix ... semble un peu déroutant, mais ça marche très bien.

Commandes pour la nouvelle colonne:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Script de nettoyage:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Le mérite revient à Sebastian Kaiser (auteur original du code).

J'espère que quelqu'un le trouvera utile comme moi.


Intéressant. Vous manqueriez des requêtes pendant le nettoyage, sauf si vous avez verrouillé tous les db en premier. D'autres problèmes peuvent survenir ici. Si nous en sommes à ce stade de la journalisation `` continue '', j'utiliserais la journalisation des fichiers ou le journal du bac et un rotateur de journaux standard.
FlipMcF

1

Vous pouvez regarder ce qui suit dans linux

cd /root

ls -al

vi .mysql_history Cela peut aider


6
Il semble que cela ne fonctionnerait que pour le client officiel mysql en ligne de commande, et uniquement pour les requêtes exécutées par l'utilisateur root
golimar

La question dit «tout le serveur», ce qui rend cette réponse incorrecte. Cela afficherait toutes les requêtes exécutées par un seul client.
FlipMcF

Si mysql binlog est activé, vous pouvez vérifier les commandes exécutées par l'utilisateur en exécutant la commande suivante dans la console linux en accédant au répertoire mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql activer [mysqld] log = / var / log / mysql / mysql.log ou genral log aura un effet sur les performances de mysql
Avinash Singh

Certaines entrées sont supprimées par défaut de toute façon, les chaînes contenant "mot de passe" par exemple.
mckenzm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.