Vue MySQL exécutant SQL
Préface
Lors de l'installation de MySQL, plusieurs bases de données nécessaires au fonctionnement de MySQL seront initialisées par défaut : mysql, sys, information_schema, performance_schema. Ces bibliothèques stockent les informations de configuration et les informations de fonctionnement de MySQL pendant le fonctionnement, la configuration des paramètres, les informations de base de données, la table informations, etc... Aujourd'hui, les deux bibliothèques principalement utilisées pour afficher le SQL en cours d'exécution sont information_schema et performance_schema.
processlist
La table processlist est située dans la bibliothèque information_schema, stockant principalement des informations de base sur les threads MySQL. Nous utilisons
desc information_schema.processlist pour afficher la structure de la table :
ID : l'identifiant du thread
USER : à quel utilisateur appartient le thread
HOST : les informations d'hôte du client : nom d'hôte + port
DB : dans quelle base de données se trouve le thread
COMMAND : quelle commande le thread exécute et l'état du thread inactif est sleep
TIME : le thread est déjà en cours d'exécution, en secondes
STATE : ce que fait le thread : l'état, le comportement ou l'événement actuel
INFO : l'instruction que le thread exécute, mais ce n'est pas très précis, nous devons donc utiliser d'autres moyens d'atteindre notre objectif.
Utilisez show processlist ou sélectionnez * from information_schema.processlist pour afficher la table processlist
Les threads
sont situés dans la bibliothèque performance_schema et chaque ligne enregistre un thread de serveur. Lorsque performance_schema est initialisé, il remplit la table des threads en fonction des threads existants à ce moment-là, puis chaque fois que le serveur crée un thread, une nouvelle donnée est ajoutée. Lorsque le thread se termine, ces données seront également supprimées de la table des threads. Utilisez desc performance_schema.threads pour afficher la structure de la table :
THREAD_ID : identifiant unique du thread
NAME : nom associé au code de surveillance du thread dans le serveur
TYPE : type de thread. Divisé en premier plan et arrière-plan. Les threads connectés par l'utilisateur sont des threads de premier plan et les threads liés à l'activité interne du serveur sont des threads principaux. Par exemple, les threads internes InnoDB.
PROCESSLIST_ID : id de la liste de processus supérieure
PROCESSLIST_USER : utilisateur de la liste de processus supérieure
PROCESSLIST_HOST : hôte de la liste de processus supérieure
PROCESSLIST_DB : DB de la liste de processus supérieure
PROCESSLIST_COMMAND : COMMANDE de la liste de processus supérieure PROCESSLIST_TIME : HEURE PROCESSLIST
de
la liste de processus supérieure ci-dessus
: INFO PARENT_THREAD_ID du processlist ci-dessus
: la valeur id du thread dérivé
ROLE : non utilisé
INSTRUMENTED : si l'événement exécuté par le thread est instrumenté, (YES ou ON)
HISTORY : s'il faut enregistrer les événements historiques pour le thread
CONNECTION_TYPE : le protocole utilisé pour établir la connexion, ou NULL pour les threads d'arrière-plan.
THREAD_OS_ID : le thread MySQL correspond à l'ID de thread du système d'exploitation
events_statements_current
events_statements_current est situé dans la bibliothèque performance_schema, qui stocke les événements de déclaration actuels, et la table stocke une ligne pour chaque thread, indiquant l'état actuel des événements de déclaration que frère Xianchen a récemment surveillés. Utilisez desc performance_schema.events_statements_current pour afficher la structure du tableau :
THREAD_ID : l'identifiant du thread associé à l'événement, qui correspond à l'identifiant des threads ci-dessus
EVENT_ID : le numéro d'événement actuel du thread lorsque l'événement démarre
THREAD_ID et EVENT_ID marquent ensemble une ligne unique, aucune ligne n'a la même paire clé-valeur
END_EVENT_ID : Définissez null au début de l'événement et mettez-le à jour avec le numéro d'événement actuel du thread à la fin de l'événement
EVENT_NAME : Le nom de l'événement
SOURCE : Le nom du fichier source contenant le code de surveillance qui génère l'événement et le numéro de ligne du fichier où se produit la surveillance
TIMER_START, TIMER_END, TIMER_WAIT : Informations sur l'heure de l'événement, l'heure de début, l'heure de fin, la durée d'exécution de l'événement, l'unité est la picoseconde (dix millième de seconde).
LOCK_TIME : le temps passé à attendre les verrous de la table. En microsecondes
SQL_TEXT : Le texte de l'instruction SQL, ou null pour les commandes sans instruction SQL associée
DIGEST : 32 caractères pour MD5
DIGEST_TEXT : Texte de résumé d'instruction normalisé.
CURRENT_SCHEMA : La base de données par défaut pour l'instruction
OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME : Pour les instructions imbriquées, ces colonnes contiennent des informations sur l'instruction parent
OBJECT_INSTANCE_BEGIN : L'adresse d'objet de l'instruction en mémoire
MYSQL_ERRNO : Le numéro d'
erreur de l'instruction Si une erreur s'est produite. WARNINGS : nombre d'avertissements ROWS_AFFECTED : nombre de lignes affectées par l'instruction ROWS_SENT : nombre de lignes renvoyées par l'instruction ROWS_EXAMINED : nombre de lignes examinées par la couche serveur CREATED_TMP_DISK_TABLES
CREATED_TMP_TABLES
SELECT_FULL_JOIN
SELECT_FULL_RANGE_JOIN
SELECT_RANGE
SELECT_RANGE_CHECK
SELECT_SCAN
SORT_MERGE_PASSES
SORT_RANGE
SORT_ROWS
SORT_SCAN
NO_INDEX_USED
NO_GOOD_INDEX_USED
NESTING_EVENT_ID
NESTING_EVENT_TYPE
NESTING_EVENT_LEVEL
Comment afficher le SQL en cours d'exécution
1. La table processlist enregistre les informations de thread que MySQL exécute, et chaque thread a un identifiant unique d'un thread utile dans la table des threads >>> thread_id. La table events_statements_current enregistre l'ID de thread unique et l'instruction SQL sql_text correspondant au thread.
2. Nous pouvons donc d'abord obtenir l'id correspondant à la processlist dans la processlist
3. Grâce à l'analyse de champ de la table des threads, nous avons une correspondance biunivoque entre processlist_id et thread_id, nous pouvons donc obtenir thread_id via processlist_id dans la table des threads
4. La dernière étape est la clé. Nous obtenons sql_text dans la table events_statements_current via thread_id, qui est l'instruction sql que nous devons obtenir.
Obtenez le processlist_id qui est en cours d'exécution,
sélectionnez l'identifiant dans information_schema.processlist
Obtenez le thread_id correspondant à processlist_id
select thread_id from performance_schema.threads where processlist_id in (la liste processlist_id obtenue à l'étape précédente)
Obtenez l'instruction SQL en cours d'exécution
sélectionnez thread_id, sql_text de performance_schema.events_statements_current où thread_id dans (liste thread_id obtenue à l'étape précédente)
完整SQL
SELECT a.*, c.thread_id, c.sql_text from information_schema.processlist a
LEFT JOIN performance_schema.threads b on a.id = b.PROCESSLIST_ID
LEFT JOIN performance_schema.events_statements_current c on c.THREAD_ID = b.THREAD_ID;