Comment puis-je suivre les requêtes MySQL sur mon serveur Linux au fur et à mesure qu'elles se produisent?
Par exemple, j'aimerais configurer une sorte d'écouteur, puis demander une page Web et afficher toutes les requêtes exécutées par le moteur, ou tout simplement afficher toutes les requêtes en cours d'exécution sur un serveur de production. Comment puis-je faire ceci?
mysql
monitoring
barfoon
la source
la source
Réponses:
Vous pouvez exécuter la commande MySQL
SHOW FULL PROCESSLIST;
pour voir quelles requêtes sont traitées à un moment donné, mais cela n'atteindra probablement pas ce que vous espérez.La meilleure méthode pour obtenir un historique sans avoir à modifier chaque application utilisant le serveur est probablement par le biais de déclencheurs. Vous pouvez configurer des déclencheurs de sorte que chaque exécution de requête entraîne l'insertion de la requête dans une sorte de table d'historique, puis créer une page distincte pour accéder à ces informations.
N'oubliez pas que cela ralentira probablement considérablement tout sur le serveur, avec l'ajout d'un supplément
INSERT
au-dessus de chaque requête.Modifier: une autre alternative est le journal général des requêtes , mais le faire écrire dans un fichier plat supprimerait beaucoup de possibilités de flexibilité d'affichage, en particulier en temps réel. Si vous voulez juste un moyen simple et facile à implémenter pour voir ce qui se passe, activer le GQL puis utiliser l'exécution
tail -f
sur le fichier journal ferait l'affaire.la source
Vous pouvez enregistrer chaque requête dans un fichier journal très facilement:
Faites vos requêtes (sur n'importe quel db). Grep ou autrement examiner
/var/run/mysqld/mysqld.log
N'oubliez pas de
ou les performances chuteront et votre disque se remplira!
la source
tail -f -n300 /var/run/mysqld/mysqld.log
pour garder une trace en direct de votre fichier journalSELECT name FROM person where id=?
mais je ne sais pas ce queid
c'est.SHOW VARIABLES
n'a pas fonctionné pour moi. Fonctionne cependant trèsSELECT @@GLOBAL.general_log_file;
bien. (MariaDB 10.1.9)SHOW VARIABLES LIKE "log_output%"
. S'il est défini surtable
, les journaux seront enregistrés dans la base de données elle-même, la tablemysql.general_log
ne se trouvant pas dans le système de fichiers. Vous pouvez le changerfile
avecSET GLOBAL log_output = 'file';
Même si une réponse a déjà été acceptée, je voudrais présenter ce qui pourrait même être l'option la plus simple:
Cela imprimera les requêtes en cours sur votre écran chaque seconde.
-u
L'utilisateur mysql sous lequel vous souhaitez exécuter la commande-p
Demander votre mot de passe (vous n'avez donc pas à l'enregistrer dans un fichier ou à faire apparaître la commande dans l'historique de vos commandes)i
L'intervalle en secondes.--verbose
indicateur pour afficher la liste complète des processus, affichant l'intégralité de la requête pour chaque processus. (Merci, nmat )Il y a un inconvénient possible: les requêtes rapides peuvent ne pas apparaître si elles s'exécutent entre l'intervalle que vous avez configuré. IE: Mon intervalle est défini sur une seconde et s'il y a une requête qui prend
.02
quelques secondes pour s'exécuter et est exécutée entre les intervalles, vous ne la verrez pas.Utilisez cette option de préférence lorsque vous souhaitez vérifier rapidement les requêtes en cours d'exécution sans avoir à configurer d'écouteur ni rien d'autre.
la source
--verbose
pour voir les requêtes complètesExécutez cette requête SQL pratique pour voir l'exécution des requêtes MySQL. Il peut être exécuté à partir de n'importe quel environnement que vous aimez, quand vous le souhaitez, sans aucun changement de code ou surcharge. Il peut nécessiter une configuration des autorisations MySQL, mais pour moi, il fonctionne simplement sans aucune configuration spéciale.
Le seul inconvénient est que vous manquez souvent des requêtes qui s'exécutent très rapidement, il est donc très utile pour les requêtes plus longues ou lorsque le serveur MySQL a des requêtes qui sont en cours de sauvegarde - selon mon expérience, c'est exactement le moment où je veux afficher " requêtes "en direct".
Vous pouvez également ajouter des conditions pour la rendre plus spécifique à n'importe quelle requête SQL.
Par exemple, affiche toutes les requêtes exécutées pendant 5 secondes ou plus:
Par exemple, afficher toutes les mises à jour en cours d'exécution:
Pour plus de détails, voir: http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html
la source
Je suis dans une situation particulière où je n'ai pas l'autorisation d'activer la connexion et je n'aurais pas l'autorisation de voir les journaux s'ils étaient activés. Je n'ai pas pu ajouter de déclencheur, mais j'avais l'autorisation d'appeler show processlist. Donc, j'ai fait de mon mieux et j'ai trouvé ceci:
Créez un script bash appelé "showsqlprocesslist":
Exécutez le script:
Tail la sortie:
Bingo bango. Même s'il n'est pas limité, il n'a pris que 2 à 4% de CPU sur les boîtes sur lesquelles je l'ai exécuté. J'espère que cela peut aider quelqu'un.
la source
strace
Le moyen le plus rapide de voir les requêtes MySQL / MariaDB en direct est d'utiliser le débogueur. Sous Linux, vous pouvez utiliser
strace
, par exemple:Puisqu'il y a beaucoup de caractères d'échappement, vous pouvez formater la sortie de strace par piping (ajoutez simplement
|
entre ces deux lignes simples ) ci-dessus dans la commande suivante:Vous devriez donc voir des requêtes SQL assez propres sans délai, sans toucher aux fichiers de configuration.
Évidemment, cela ne remplacera pas la manière standard d'activer les journaux, qui est décrite ci-dessous (qui implique de recharger le serveur SQL).
dtrace
Utilisez des sondes MySQL pour afficher les requêtes MySQL en direct sans toucher au serveur. Exemple de script:
Enregistrez le script ci-dessus dans un fichier (comme
watch.d
) et exécutez:En savoir plus: Premiers pas avec DTracing MySQL
Gibbs MySQL Spyglass
Voir cette réponse .
Journaux
Voici les étapes utiles au développement proposé.
Ajoutez ces lignes dans votre
~/.my.cnf
ou globalmy.cnf
:Chemins d'accès:
/var/log/mysqld.log
ou/usr/local/var/log/mysqld.log
peuvent également fonctionner en fonction de vos autorisations de fichier.puis redémarrez votre MySQL / MariaDB par (préfixez
sudo
si nécessaire):Vérifiez ensuite vos journaux:
Après la fin, le changement
general_log
à0
(vous pouvez l' utiliser à l' avenir), puis retirez à nouveau le fichier et redémarrez le serveur SQL:killall -HUP mysqld
.la source
general_log
partir d'une requête MySQL. Il commencera à écrire dans le fichier quigeneral_log_file
pointe.C'est la configuration la plus simple sur une machine Linux Ubuntu que j'ai rencontrée. Fou de voir toutes les requêtes en direct.
Recherchez et ouvrez votre fichier de configuration MySQL, généralement /etc/mysql/my.cnf sur Ubuntu. Recherchez la section qui dit «Journalisation et réplication»
Décommentez simplement la variable «log» pour activer la journalisation. Redémarrez MySQL avec cette commande:
Nous sommes maintenant prêts à commencer à surveiller les requêtes au fur et à mesure qu'elles arrivent. Ouvrez un nouveau terminal et exécutez cette commande pour faire défiler le fichier journal, en ajustant le chemin si nécessaire.
Exécutez maintenant votre application. Vous verrez les requêtes de base de données commencer à voler dans votre fenêtre de terminal. (assurez-vous que le défilement et l'historique sont activés sur le terminal)
DE http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
la source
À partir d'une ligne de commande, vous pouvez exécuter:
Remplacez les valeurs [x] par vos valeurs.
Ou encore mieux:
la source
Découvrez mtop .
la source
mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete.
mtop.sourceforge.net C'est parfois très utile.J'ai cherché à faire de même, et j'ai concocté une solution à partir de divers articles, et j'ai créé une petite application de console pour sortir le texte de la requête en direct pendant qu'il est écrit dans le fichier journal. C'était important dans mon cas car j'utilise Entity Framework avec MySQL et je dois pouvoir inspecter le SQL généré.
Étapes pour créer le fichier journal (duplication d'autres articles, tous ici pour plus de simplicité):
Modifiez le fichier situé dans:
Ajoutez "log = development.log" au bas du fichier. (Notez que l'enregistrement de ce fichier m'a obligé à exécuter mon éditeur de texte en tant qu'administrateur).
Utilisez MySql workbench pour ouvrir une ligne de commande, entrez le mot de passe.
Exécutez ce qui suit pour activer la journalisation générale qui enregistrera toutes les requêtes exécutées:
Cela entraînera l'écriture des requêtes en cours d'exécution dans un fichier texte à l'emplacement suivant.
Créez / exécutez une application console qui produira les informations du journal en temps réel:
Source disponible pour téléchargement ici
La source:
la source
En plus des réponses précédentes décrivant comment activer la journalisation générale, j'ai dû modifier une variable supplémentaire dans mon installation vanilla MySql 5.6 avant d'écrire du SQL dans le journal:
Le paramètre par défaut était «AUCUN».
la source
Gibbs MySQL Spyglass
AgilData a récemment lancé Gibbs MySQL Scalability Advisor (un outil libre-service gratuit) qui permet aux utilisateurs de capturer un flux en direct de requêtes à télécharger sur Gibbs. Spyglass (qui est Open Source) surveillera les interactions entre vos serveurs MySQL et les applications clientes. Aucune reconfiguration ou redémarrage du serveur de base de données MySQL n'est nécessaire (client ou application).
GitHub: AgilData / gibbs-mysql-spyglass
Apprendre encore plus: Packet Capture MySQL with Rust
Commande d'installation:
la source