Nous essayons de faire un débogage des performances du serveur et je voudrais capturer un instantané des requêtes en cours d'exécution sur notre serveur MySQL sur une période de quelques minutes.
Je connais MySQL SHOW FULL PROCESSLIST
, mais j'aimerais pouvoir l'exécuter via la ligne de commande afin de pouvoir le vider dans un fichier et le post-traiter.
Existe-t-il un moyen de générer cette requête dans un fichier et de l'exécuter toutes les secondes environ?
Existe-t-il un meilleur moyen de capturer toutes les requêtes en cours d'exécution?
Notez que je ne m'intéresse pas uniquement aux requêtes lentes (je connais bien le journal des requêtes lentes).
echo show full processlist | mysql
ou mieuxSELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"
dans une boucle dans bash. Ajoutez quelques lignes et vous obtiendrez la même fonctionnalité de requête queinnotop
oupt-kill
Réponses:
J'utiliserais le journal des requêtes lentes. Il capture toutes les requêtes, pas seulement celles qui sont lentes, si vous définissez long_query_time = 0.
Il capture également TOUTES les requêtes, ce qui n'est pas le cas des techniques de détection de TCP mentionnées ici; ceux-ci ne captureront pas les requêtes exécutées via un socket. Idem pour regarder SHOW PROCESSLIST; vous manquerez des requêtes rapides.
Si vous souhaitez capturer des requêtes via la liste de processus ou via le trafic TCP, je vous suggère d'utiliser pt-query-digest de Percona Toolkit. Il peut interroger la liste de processus pour vous (et donner un sens aux résultats, ce qui est très difficile à faire si vous en capturez vous-même un certain nombre d'échantillons), et il peut interpréter le protocole TCP de MySQL, vous pouvez donc saisir du TCP trafic et l'analyser. Bien sûr, c'est aussi le meilleur agrégateur / profileur / reporter de requêtes jamais écrit, mais vous n'avez pas dit ce que vous vouliez faire avec les requêtes après les avoir capturées.
la source
Le moyen le plus robuste serait d'utiliser le "journal général des requêtes", qui capturera toutes les requêtes: http://dev.mysql.com/doc/refman/5.1/en/query-log.html
Vous ne spécifiez pas la version du serveur MySQL, mais si vous disposez de la version 5.1.12 ou ultérieure, vous pouvez l'activer et la désactiver avec une variable globale via SQL; voir la documentation pour plus de détails.
la source
Essayez cette commande en tant que root (ou utilisez
sudo
):Trouvé http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/
la source
Sûr:
À votre santé
la source
Cela pourrait être un endroit pour le proxy Mysql . Il vous permet essentiellement de capturer (et de manipuler) les requêtes envoyées. Une configuration de base pour intercepter est assez simple. Ensuite, modifiez simplement la configuration de votre client pour pointer vers le proxy afin de pouvoir capturer toutes les demandes.
la source
Le programme basé sur terminal Wireshark tshark peut aider:
sudo yum install wireshark
vous donnera tshark sur Amazon Linux etsudo apt-get install tshark
vous donnera tshark sur Ubuntu 14+la source
J'ai utilisé la solution de 'Rui Pedro Bernardino. Fonctionne très bien sauf que j'ai changé quelques choses dans la première ligne comme détaillé ci-dessous ...
la source
Capturez les sessions mysql tcp en utilisant tcpdump, à la fois des requêtes et des réponses. Vous pouvez analyser un vidage par exemple à l'aide des outils maatkit:
http://www.maatkit.org/doc/mk-tcp-model.html
http://www.maatkit.org/doc/mk-query-digest.html
la source
Je cherchais et cherchais et finalement j'ai atterri à MONyog pour surveiller toutes les requêtes en temps réel qui sont exécutées sur le serveur mysql. La seule chose à noter est la table "Performance_schema" et "déclarations_digest" doit être activée et Performance_schema est disponible avec MySQL 5.6.14 et supérieur.
la source