Methode: 1. Verwenden Sie den Befehl „show OPEN TABLES where In_use > 0;“, um den Status der gesperrten Tabelle zu überprüfen. 2. Verwenden Sie den Befehl „SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS“, um die gesperrte Tabelle abzufragen.
Die Betriebsumgebung dieses Tutorials: Windows10-System, MySQL8.0.22-Version, Dell G3-Computer.
So fragen Sie die gesperrte Tabelle in MySQL ab
1. Überprüfen Sie, ob die Tabelle gesperrt ist:
(1) Direkt ausführen: show engine innodb statusG in der MySQL-Befehlszeile.
(2) Überprüfen Sie die SQL-Anweisung, die den Deadlock verursacht hat, analysieren Sie die Indexsituation und optimieren Sie dann die SQL.
(3) Zeigen Sie dann die Prozessliste an, um die SQL-Anweisungen zu überprüfen, die dazu führen, dass der Deadlock lange dauert.
(4)Status wie „%lock%“ anzeigen.
2. Überprüfen Sie den Tabellensperrstatus und beenden Sie den Deadlock:
(1) Überprüfen Sie den Tabellensperrstatus: show OPEN TABLES where In_use >
(2) Prozess abfragen: Prozesslisten-Abfragetabelle für gesperrten Prozess anzeigen; entsprechende Prozess-Killid abfragen.
(3) Analysieren Sie die SQL zum Sperren der Tabelle: Analysieren Sie die entsprechende SQL, fügen Sie Indizes zur Tabelle hinzu, fügen Sie Indizes zu allgemeinen Feldern hinzu und fügen Sie Indizes zu tabellenbezogenen Feldern hinzu.
(4) Sehen Sie, was gesperrt wird: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS.
(5) Dinge anzeigen, die auf Sperren warten: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS.
Erweiterte Informationen
Befehl zum Anzeigen des MySQL-Sperrstatus:
Tabelle prüfen: Überprüfen der Datentabelle (dies erfolgt automatisch).
Tabellen schließen: Die geänderten Daten in der Tabelle werden auf die Festplatte geschrieben und die aufgebrauchten Tabellen werden geschlossen. Dies ist ein schneller Vorgang. Sollte dies jedoch nicht der Fall sein, sollten Sie überprüfen, ob der Speicherplatz voll ist oder die Festplatte stark ausgelastet ist.
Ausgehende Verbindung: Der Replikations-Slave-Server stellt eine Verbindung zum Master-Server her.
Kopieren in die tmp-Tabelle auf der Festplatte: Da der temporäre Ergebnissatz größer als tmp_table_size ist, wird die temporäre Tabelle vom Speicher in den Festplattenspeicher konvertiert, um Speicherplatz zu sparen.
Tmp-Tabelle erstellen: Eine temporäre Tabelle wird erstellt, um einige Abfrageergebnisse zu speichern.
Löschen aus der Haupttabelle: Der Server führt den ersten Teil einer Löschung mehrerer Tabellen durch und hat gerade die erste Tabelle gelöscht.
Löschen aus Referenztabellen: Der Server führt den zweiten Teil des Löschens mehrerer Tabellen durch und löscht Datensätze aus anderen Tabellen.
Tabellen leeren: FLUSH TABLES wird ausgeführt und wartet darauf, dass andere Threads die Datentabelle schließen.
Getötet: Wenn eine Kill-Anfrage an einen Thread gesendet wird, überprüft der Thread das Kill-Flag und gibt die nächste Kill-Anfrage auf. MySQL überprüft das Kill-Flag in jeder Hauptschleife, aber in einigen Fällen kann der Thread nach kurzer Zeit absterben. Wenn der Thread von einem anderen Thread gesperrt wird, wird die Kill-Anforderung sofort wirksam, wenn die Sperre aufgehoben wird.
Gesperrt: Durch andere Abfragen gesperrt.
Daten senden: Die Datensätze der SELECT-Abfrage werden verarbeitet und die Ergebnisse an den Client gesendet.
Sortieren nach Gruppe: Sortieren nach GROUP BY.
Sortieren nach Reihenfolge: Sortieren nach ORDER BY.
Eröffnung von Tischen: Dieser Vorgang sollte schnell erfolgen, sofern er nicht durch andere Faktoren beeinträchtigt wird. Beispielsweise kann die Datentabelle erst dann von anderen Threads geöffnet werden, wenn die Anweisung ALTER TABLE oder LOCK TABLE ausgeführt wird. Ich versuche, einen Tisch zu öffnen.
Duplikate entfernen: Eine SELECT DISTINCT-Abfrage wird ausgeführt, aber MySQL kann diese doppelten Datensätze in der vorherigen Phase nicht optimieren. Daher muss MySQL doppelte Datensätze erneut entfernen, bevor die Ergebnisse an den Client gesendet werden.
Tabelle erneut öffnen: Erhalten Sie eine Sperre für eine Tabelle, aber die Sperre muss erhalten werden, nachdem die Tabellenstruktur geändert wurde. Die Sperre wurde aufgehoben, die Datentabelle wurde geschlossen und es wird versucht, die Datentabelle erneut zu öffnen.
Reparieren durch Sortieren: Die Reparaturanweisung sortiert, um einen Index zu erstellen.
Reparatur mit Schlüsselcache: Die Reparaturanweisung nutzt den Indexcache, um nacheinander neue Indizes zu erstellen. Dies ist langsamer als „Reparieren durch Sortieren“.
Zeilen zur Aktualisierung durchsuchen: Suche nach Datensätzen, die die Bedingungen für die Aktualisierung erfüllen. Es muss abgeschlossen sein, bevor UPDATE die zugehörigen Datensätze ändern soll.
Schlafend: Warten darauf, dass der Kunde eine neue Anfrage sendet.
Systemsperre: Warten auf den Erhalt einer externen Systemsperre. Wenn Sie derzeit nicht mehrere mysqld-Server ausführen, die gleichzeitig dieselbe Tabelle anfordern, können Sie externe Systemsperren deaktivieren, indem Sie den Parameter --skip-external-locking hinzufügen.
Sperre wird aktualisiert: INSERT DELAYED versucht, eine Sperrtabelle zum Einfügen neuer Datensätze zu erhalten.
Aktualisieren: Nach passenden Datensätzen suchen und diese ändern. Benutzersperre: Warten auf GET_LOCK().
Warten auf Tabellen: Der Thread wird benachrichtigt, dass die Datentabellenstruktur geändert wurde und die Datentabelle erneut geöffnet werden muss, um die neue Struktur zu erhalten. Um die Datentabelle erneut zu öffnen, müssen Sie warten, bis alle anderen Threads die Tabelle schließen.
Warten auf Handler-Einfügung: INSERT DELAYED hat alle ausstehenden Einfügevorgänge verarbeitet und wartet auf neue Anforderungen.
Empfohlenes Lernen: MySQL-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSo fragen Sie eine gesperrte Tabelle in MySQL ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!