HintergrundIm täglichen Gebrauch kann es vorkommen, dass sich in MySQL von Zeit zu Zeit einzelne oder viele Verbindungen häufen. In diesem Fall ziehen Sie im Allgemeinen in Betracht, diese lang gestapelten Verbindungen mit dem Kill-Befehl zwangsweise zu beenden, um die Anzahl der Verbindungen und die CPU-Ressourcen des Datenbankservers so schnell wie möglich freizugeben. ProblembeschreibungBei der tatsächlichen Verwendung des Kill-Befehls stellen Sie möglicherweise fest, dass die Verbindung nicht sofort beendet wird und noch immer in der Prozessliste angezeigt wird. Anstelle der üblichen Abfrage oder Ausführung wird jedoch „Befehl beendet“ angezeigt. Zum Beispiel: mysql> Prozessliste anzeigen; +----+------+--------------------+--------+---------+------+--------------+--------------------------------+ | ID | Benutzer | Host | db | Befehl | Zeit | Status | Info | +----+------+--------------------+--------+---------+------+--------------+--------------------------------+ | 31 | root | 192.168.1.10:50410 | sbtest | Abfrage | 0 | wird gestartet | Prozessliste anzeigen | | 32 | root | 192.168.1.10:50412 | sbtest | Abfrage | 62 | Benutzer sleep | select sleep(3600) from sbtest1 | | 35 | root | 192.168.1.10:51252 | sbtest | Beendet | 47 | Daten werden gesendet | select sleep(100) from sbtest1 | | 36 | root | 192.168.1.10:51304 | sbtest | Abfrage | 20 | Daten werden gesendet | select sleep(3600) from sbtest1 | +----+------+--------------------+--------+---------+------+--------------+--------------------------------+ UrsachenanalyseIm Zweifelsfall sollten Sie zunächst die offizielle Dokumentation lesen. Hier sind einige Auszüge aus der offiziellen Dokumentation:
Der erste Absatz des offiziellen Dokuments beschreibt klar und deutlich den Kill-Mechanismus: Für den verbundenen Thread wird eine Kill-Markierung auf Thread-Ebene gesetzt, die erst bei der nächsten „Markierungserkennung“ wirksam wird. Dies bedeutet auch, dass, wenn die nächste „Markierungserkennung“ nicht rechtzeitig erfolgt, das im Problem beschriebene Phänomen auftreten kann. In der offiziellen Dokumentation sind eine Reihe von Szenarien aufgeführt. Hier sind einige häufige Problemszenarien basierend auf der offiziellen Beschreibung:
Simulieren Sie esHier verwenden wir einen Parameter innodb_thread_concurrency, um das Szenario der Blockierung der normalen Ausführung von SQL-Anweisungen zu simulieren: Definiert die maximale Anzahl von Threads, die in InnoDB zulässig sind. Ein Wert von 0 (Standard) wird als unendliche Parallelität (keine Begrenzung) interpretiert. Diese Variable ist für die Leistungsoptimierung auf Systemen mit hoher Parallelität vorgesehen. Wenn dieser Parameter auf einen niedrigen Wert eingestellt ist, werden InnoDB-Abfragen, die den Grenzwert überschreiten, gemäß der offiziellen Dokumentation blockiert. Daher wurde dieser Parameter in dieser Simulation auf einen sehr niedrigen Wert eingestellt. mysql> Variablen wie „%innodb_thread_concurrency%“ anzeigen; +-----------------------------------------+----------+ | Variablenname | Wert | +-----------------------------------------+----------+ | innodb_thread_concurrency | 1 | +-----------------------------------------+----------+ 1 Zeile im Satz (0,00 Sek.) Öffnen Sie dann zwei Datenbankverbindungen (Sitzung 1 und Sitzung 2), führen Sie in jeder Sitzung 1: mysql> wähle sleep(3600) aus sbtest.sbtest1; Sitzung 2: mysql> wähle sleep(3600) aus sbtest.sbtest1; FEHLER 2013 (HY000): Verbindung zum MySQL-Server während der Abfrage verloren MySQL> Sitzung 3: mysql> Prozessliste anzeigen; +----+------+--------------------+------+---------+---------+----------+--------------+----------------------------------------+ | ID | Benutzer | Host | db | Befehl | Zeit | Status | Info | +----+------+--------------------+------+---------+---------+----------+--------------+----------------------------------------+ | 44 | root | 172.16.64.10:39290 | NULL | Abfrage | 17 | Benutzer sleep | select sleep(3600) from sbtest.sbtest1 | | 45 | root | 172.16.64.10:39292 | NULL | Abfrage | 0 | wird gestartet | Prozessliste anzeigen | | 46 | root | 172.16.64.10:39294 | NULL | Abfrage | 5 | Daten werden gesendet | select sleep(3600) from sbtest.sbtest1 | +----+------+--------------------+------+---------+---------+----------+--------------+----------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) mysql> töten 46; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> Prozessliste anzeigen; +----+------+--------------------+------+---------+---------+----------+--------------+----------------------------------------+ | ID | Benutzer | Host | db | Befehl | Zeit | Status | Info | +----+------+--------------------+------+---------+---------+----------+--------------+----------------------------------------+ | 44 | root | 172.16.64.10:39290 | NULL | Abfrage | 26 | Benutzer sleep | select sleep(3600) from sbtest.sbtest1 | | 45 | root | 172.16.64.10:39292 | NULL | Abfrage | 0 | wird gestartet | Prozessliste anzeigen | | 46 | root | 172.16.64.10:39294 | NULL | Beendet | 14 | Daten werden gesendet | select sleep(3600) from sbtest.sbtest1 | +----+------+--------------------+------+---------+---------+----------+--------------+----------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) MySQL> Wie Sie sehen, wird die Verbindung von Sitzung 2 nach der Ausführung des Kill-Befehls sofort getrennt, die von Sitzung 2 initiierte Abfrage bleibt jedoch weiterhin in MySQL bestehen. Wenn ähnliche Probleme durch Um zusammenzufassenDer Kill-Vorgang von MySQL beendet die Datenbankverbindung nicht direkt und zwangsweise, wie man sich das vorstellt. Er sendet nur ein Beendigungssignal. Wenn die Ausführungseffizienz von SQL selbst zu langsam ist oder durch andere Faktoren beeinträchtigt wird (hohe Serverlast, Auslösen eines Rollbacks großer Datenmengen), kann dieser Kill-Vorgang diese problematischen Abfragen möglicherweise nicht rechtzeitig beenden. Im Gegenteil, er kann eine erneute Verbindung auslösen, nachdem die programmseitige Verbindung getrennt wurde, was zu ineffizienteren Abfragen führt und die Datenbank weiter belastet. Oben sind die Details, warum MySQL Kill Threads nicht beenden kann. Weitere Informationen zu MySQL Kill Threads finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Webdesign: Skriptmaterialien rekonstruieren das Benutzererlebnis
>>: CSS3-Animation – Erläuterung der Funktion „Steps“
Inhaltsverzeichnis 1. Datenbankbetrieb 1.1 Datenb...
Inhaltsverzeichnis 1. Einführung in MHA 1. Was is...
Vor Kurzem hat das Unternehmen die Anforderung ge...
MySQL 5.7.8 führte das JSON-Feld ein. Dieser Feld...
beschreiben Dieser Artikel stellt eine Methode zu...
Die folgenden drei Methoden werden häufig verwende...
Aus geschäftlichen Gründen kommt es häufig zu Eil...
1: Unterschiede bei Geschwindigkeit und Lademethod...
selinux ( Security-Enhanced Linux) ist ein Linux-...
1. Änderungen in der Standard-Speicher-Engine von...
1. Datenbanktransaktionen verringern die Datenban...
1. Installieren Sie MySQL. Führen Sie den folgend...
Inhaltsverzeichnis 1. Die übergeordnete Komponent...
Inhaltsverzeichnis Tutorial-Reihe 1. Benutzerverw...
Inhaltsverzeichnis 1. Was ist Reflexion? 2. Refle...