Wie stellt MySQL eine Verbindung zum entsprechenden Clientprozess her?

Wie stellt MySQL eine Verbindung zum entsprechenden Clientprozess her?

Frage

Wie können wir bei einer bestimmten MySQL-Verbindung wissen, von welchem ​​Client-Prozess sie stammt?

HandshakeAntwort

Wenn der MySQL-Client eine Verbindung zum MySQL-Server herstellt, sendet er nicht nur den Benutzernamen und das Passwort an den Server, sondern auch die aktuelle Prozess-ID, den Betriebssystemnamen, den Hostnamen und andere Informationen an den Server. Dieses Datenpaket wird HandshakeResponse genannt und auf der offiziellen Website finden Sie eine detaillierte Beschreibung seines Formats.

Ich habe selbst einen Verbindungstreiber modifiziert, mit dessen Hilfe ich sehen kann, welche Informationen beim Verbinden gesendet werden.

19.05.2020 15:31:04,976 – mysql-connector-python.mysql.connector.protocol.MySQLProtocol.make_auth – Hauptthread – INFO – conn-attrs {'_pid': '58471', '_platform': 'x86_64', '_source_host': 'NEEKYJIANG-MB1', '_client_name': 'mysql-connector-python', '_client_license': 'GPL-2.0', '_client_version': '8.0.20', '_os': 'macOS-10.15.3'}

Das Byte-Format des HandshakeResponse-Pakets ist wie folgt. Die zu übertragenden Daten stehen am Ende des Pakets.

4 Fähigkeitsflags, CLIENT_PROTOCOL_41 immer gesetzt
4 maximale Paketgröße
1 Zeichensatz
string[23] reserviert (alle [0])
Zeichenfolge[NUL] Benutzername
 wenn Fähigkeiten & CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA {
lenenc-int Länge der Authentifizierungsantwort
Zeichenfolge[n] Authentifizierungsantwort
 } sonst wenn Fähigkeiten & CLIENT_SECURE_CONNECTION {
1 Länge der Authentifizierungsantwort
Zeichenfolge[n] Authentifizierungsantwort
 } anders {
Zeichenfolge [NUL] Authentifizierungsantwort
 }
 wenn Fähigkeiten & CLIENT_CONNECT_WITH_DB {
Zeichenfolge[NUL] Datenbank
 }
 wenn Fähigkeiten & CLIENT_PLUGIN_AUTH {
string[NUL] Name des Authentifizierungs-Plugins
 }
 wenn Fähigkeiten & CLIENT_CONNECT_ATTRS {
lenenc-int Länge aller Schlüsselwerte
lenenc-str-Schlüssel
lenenc-str-Wert
  wenn mehr Daten in der Länge aller Schlüssel-Werte, mehr Schlüssel-Wert-Paare
 }

Lösung

Aus dem vorherigen Inhalt können wir ersehen, dass der MySQL-Client die aktuelle Prozess-ID an den MySQL-Server sendet, was die grundlegendste Möglichkeit zur Lösung des Problems bietet. Wenn der Server diese Informationen empfängt, speichert er sie in performance_schema.session_connect_attrs.

Der erste Schritt besteht darin, information_schema.processlist nach der betreffenden Verbindung, der zugehörigen IP-Adresse und ihrer processlist_id abzufragen.

mysql> wähle * aus information_schema.prozessliste;
+----+---------+--------------------+--------------------+---------+------+-----------+----------------------------------------------+
| ID | BENUTZER | HOST | DB | BEFEHL | ZEIT | STATUS | INFO |
+----+---------+--------------------+--------------------+---------+------+-----------+----------------------------------------------+
| 8 | root | 127.0.0.1:57760 | performance_schema | Abfrage | 0 | wird ausgeführt | select * from information_schema.processlist |
| 7 | appuser | 172.16.192.1:50198 | NULL | Ruhezustand | 2682 | | NULL |
+----+---------+--------------------+--------------------+---------+------+-----------+----------------------------------------------+
2 Zeilen im Satz (0,01 Sek.)

Der zweite Schritt besteht darin, die Prozess-ID der Verbindung über performance_schema.session_connect_attrs abzufragen

mysql> wähle * aus session_connect_attrs, wobei processlist_id = 7;               
+----------------+-----------------+------------------------+------------------+
| PROZESSLIST_ID | ATTR_NAME | ATTR_VALUE | ORDINAL_POSITION |
+----------------+-----------------+------------------------+------------------+
| 7 | _pid | 58471 | 0 |
| 7 | _Plattform | x86_64 | 1 |
| 7 | _Quellhost | NEEKYJIANG-MB1 | 2 |
| 7 | _Clientname | MySQL-Connector-Python | 3 |
| 7 | _Client-Lizenz | GPL-2.0 | 4 |
| 7 | _Clientversion | 8.0.20 | 5 |
| 7 | _os | macOS-10.15.3 | 6 |
+----------------+-----------------+------------------------+------------------+
7 Zeilen im Satz (0,00 Sek.)

Wir können sehen, dass die Verbindung mit processlist_id = 7 vom Prozess 58471 von 172.16.192.1 initiiert wird.

prüfen

Ich habe gerade ipython verwendet, um eine Verbindung zur Datenbank herzustellen, und das Ergebnis, das ich von ps gesehen habe, war genau 58471, was mit dem Abfrageergebnis übereinstimmt.

 ps -ef | grep 58471
 501 58471 57741 0 15:24 Uhr ttys001 0:03.67 /Library/Frameworks/Python.framework/Versions/3.8/Resources/Python.app/Contents/MacOS/Python /Library/Frameworks/Python.framework/Versions/3.8/bin/ipython

Oben sind die Details, wie MySQL eine Verbindung zum entsprechenden Client-Prozess herstellt. Weitere Informationen zum entsprechenden Client-Prozess der MySQL-Verbindung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Einführung in die Verwendung des MySQL mysqladmin-Clients
  • Lösen Sie das Problem, dass der MySql-Client in Sekunden beendet wird (my.ini nicht gefunden).
  • Beispiel für die asynchrone MySQL-Client-Implementierung von PHP Swoole
  • Lösen Sie das Problem, dass der Node.js MySQL-Client das Authentifizierungsprotokoll nicht unterstützt
  • Lösung für das Problem, dass sich der mysql8.0.11-Client nicht anmelden kann
  • Detaillierte Erklärung der MySQL/Java-Server-Unterstützung für Emoji und Problemlösung
  • Erste Schritte mit der NodeJS-Serverentwicklung (Express+MySQL)
  • MySQL-Verbindungspool für App-Server (unterstützt hohe Parallelität)
  • Interpretieren von MySQL-Client- und Serverprotokollen

<<:  So löschen Sie die Validierungsaufforderung bei der Elementformularvalidierung

>>:  Eine kurze Diskussion zum Thema Ziehen und Sortieren von Elementen in Tabellen

Artikel empfehlen

Analyse des MySQL-Client-Installationsprozesses auf dem Mac

Versuchen Sie die Installation über Pip in einer ...

XHTML-Einführungstutorial: Webseitenkopf und DTD

Obwohl Kopf und DTD nicht auf der Seite angezeigt...

Wie man mit React elegant CSS schreibt

Inhaltsverzeichnis 1. Inline-Stile 2. Importmetho...

js implementiert eine Formularvalidierungsfunktion

In diesem Artikelbeispiel wird der spezifische Co...

So verwenden Sie Vue zum Implementieren von CSS-Übergängen und Animationen

Inhaltsverzeichnis 1. Der Unterschied zwischen Üb...

Memcached-Methode zum Erstellen eines Cache-Servers

Vorwort Viele Webanwendungen speichern Daten in e...

JavaScript Factory Pattern erklärt

Inhaltsverzeichnis Einfache Fabrik Fabrikmethode ...

Erläuterung des TypeScript-Namespace

Inhaltsverzeichnis 1. Definition und Verwendung 1...

Wie funktionieren die dynamischen Komponenten von Vue3?

Inhaltsverzeichnis 1. Komponentenregistrierung 1....

MySQL-Datenbanktabellendesign mit Baumstruktur

Inhaltsverzeichnis Vorwort 1. Basisdaten 2. Verer...

Implementierung eines geplanten MySQL-Sicherungsskripts unter Windows

Wenn Sie auf einem Windows-Server regelmäßig Date...

Was ist dies in einer Punkt-für-Punkt-Reihe von JavaScript?

Verstehe das Vielleicht haben Sie this in anderen...

Detaillierte Schritte zum Speichern von Emoji-Ausdrücken in MySQL

Verursacht durch: java.sql.SQLException: Falscher...

Installieren Sie Docker für Windows unter Windows 10 Home Edition

0. Hintergrund Hardware: Xiaomi Notebook Air 13/I...

vue + tp5 realisiert eine einfache Anmeldefunktion

In diesem Artikelbeispiel wird der spezifische Co...