Allgemeine MySQL-Anweisungen zum Anzeigen von Transaktionen und Sperren

Allgemeine MySQL-Anweisungen zum Anzeigen von Transaktionen und Sperren

Einige allgemeine Anweisungen zum Anzeigen von Transaktionen und Sperren in der Datenbank

Wartestatus der Transaktion prüfen:

WÄHLEN
   r.trx_id warte_trx_id,
   r.trx_mysql_thread_id wartender_Thread,
   r.trx_query warte_abfrage,
   b.trx_id blockierende_trx_id,
   b.trx_mysql_thread_id blockierender Thread,
   b.trx_query blockierende_Abfrage
AUS
   information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;

Zeigen Sie den genaueren Wartestatus für Transaktionen an:

WÄHLEN
   b.trx_state,
   Anwesen,
   e.Zeit,
   d.state ALS block_state,
   d.time AS block_time,
   eine anfordernde_trx_id,
   a.angeforderte_Sperr-ID,
   b.trx_query,
   b.trx_mysql_thread_id,
   eine.blocking_trx_id,
   eine.Blockierungssperre-ID,
   c.trx_query AS block_trx_query,
   c.trx_mysql_thread_id AS block_trx_mysql_tread_id
AUS
   information_schema.INNODB_LOCK_WAITS a
LEFT JOIN information_schema.INNODB_TRX b ON a.requesting_trx_id = b.trx_id
LEFT JOIN information_schema.INNODB_TRX c ON a.blocking_trx_id = c.trx_id
LINKS JOIN information_schema.PROZESSLIST d ON c.trx_mysql_thread_id = d.id
LINKS JOIN information_schema.PROZESSLIST e ON b.trx_mysql_thread_id = e.id
BESTELLEN BIS
   eine.anfordernde_trx_id;

Nicht abgeschlossene Transaktionen anzeigen:

–MySQL 5.6

WÄHLEN
   eine.trx_id,
   ein.trx_state,
   a.trx_started,
   eine.trx_query,
   Gebot,
   b.BENUTZER,
   b.DB,
   b.BEFEHL,
   b.ZEIT,
   b.STAAT,
   b.INFO,
   c.PROCESSLIST_USER,
   c.PROCESSLIST_HOST,
   c.PROCESSLIST_DB,
   d.SQL_TEXT
AUS
   information_schema.INNODB_TRX a
LINKS JOIN information_schema.PROCESSLIST b ON a.trx_mysql_thread_id = b.id
UND b.COMMAND = 'Schlaf'
LINKS JOIN PERFORMANCE_SCHEMA.threads c ON b.id = c.PROCESSLIST_ID
LINKS JOIN PERFORMANCE_SCHEMA.events_statements_current d ON d.THREAD_ID = c.THREAD_ID;

–MySQL 5.5

WÄHLEN
   eine.trx_id,
   ein.trx_state,
   a.trx_started,
   eine.trx_query,
   Gebot,
   b. NUTZER,
   b. Gastgeber,
   b.DB,
   b.BEFEHL,
   b.ZEIT,
   b.STAAT,
   b.INFO
AUS
   information_schema.INNODB_TRX a
LINKS JOIN information_schema.PROCESSLIST b ON a.trx_mysql_thread_id = b.id
WO
   b.COMMAND = 'Schlafen';

Zeigen Sie Transaktionen an, die über einen bestimmten Zeitraum nicht abgeschlossen wurden:

WÄHLEN
    trx_id,
    trx_started,
    trx_mysql_thread_id
AUS
    INFORMATION_SCHEMA.INNODB_TRX
WO
    trx_started < date_sub(jetzt(), INTERVALL 1 MINUTE)
UND trx_operation_state IST NULL
UND trx_query IST NULL;

Ergänzung: MySQL-Befehl zur Anzeige des Sperrstatus

1 Prozessliste anzeigen;

SHOW PROCESSLIST zeigt an, welche Threads ausgeführt werden. Sie können diese Informationen auch mit der mysqladmin-Prozessliste-Anweisung abrufen. Wenn Sie über das SUPER-Privileg verfügen, können Sie alle Threads sehen. Andernfalls können Sie nur Ihre eigenen Threads sehen (d. h. Threads, die mit dem von Ihnen verwendeten MySQL-Konto verknüpft sind). Wenn ein Thread eine Tabelle aktualisiert oder einfügt, lautet der Status des Prozesses „Aktualisieren oder Senden von Daten“.

Diese Anweisung ist nützlich, wenn Sie die Fehlermeldung „zu viele Verbindungen“ erhalten und verstehen möchten, was passiert. MySQL reserviert eine zusätzliche Verbindung für die Verwendung durch Konten mit dem SUPER-Privileg, um sicherzustellen, dass Administratoren immer eine Verbindung zum System herstellen und es untersuchen können (vorausgesetzt, Sie erteilen dieses Privileg nicht allen Benutzern).

Status

Bedeutung

Prüftabelle

Überprüfen der Datentabellen (dies erfolgt automatisch).

Tabellen schließen

Die geänderten Daten in der Tabelle werden auf die Festplatte geschrieben und die verwendete Tabelle wird geschlossen. Dieser Vorgang geht sehr schnell, ist dies jedoch nicht der Fall, sollten Sie prüfen, ob die Festplatte voll ist oder ob sie stark ausgelastet ist.

Aus verbinden

Der Replikations-Slave-Server stellt eine Verbindung zum Master-Server her.

Kopieren in die temporäre Tabelle auf der Festplatte

Da der temporäre Ergebnisset größer als tmp_table_size ist, wird die temporäre Tabelle aus Speichergründen vom Arbeitsspeicher in den Festplattenspeicher konvertiert.

Tmp-Tabelle erstellen

Erstellen einer temporären Tabelle zum Speichern teilweiser Abfrageergebnisse.

Löschen aus der Haupttabelle

Der Server führt den ersten Teil einer Löschung mehrerer Tabellen aus und hat gerade die erste Tabelle gelöscht.

Löschen aus Referenztabellen

Der Server führt den zweiten Teil einer Mehrfachtabellenlöschung aus und löscht Datensätze aus anderen Tabellen.

Spültische

FLUSH TABLES wird ausgeführt und wartet darauf, dass andere Threads die Datentabelle schließen.

Getötet

Wenn eine Kill-Anforderung an einen Thread gesendet wird, überprüft der Thread das Kill-Flag und bricht die nächste Kill-Anforderung ab. MySQL überprüft das Kill-Flag in jeder Hauptschleife, aber in einigen Fällen kann es eine Weile dauern, bis der Thread beendet wird. Wenn der Thread durch andere Threads gesperrt ist, wird die Kill-Anforderung sofort wirksam, wenn die Sperre aufgehoben wird.

Gesperrt

Durch eine andere Abfrage gesperrt.

Senden von Daten

Die Datensätze der SELECT-Abfrage werden verarbeitet und die Ergebnisse werden an den Client gesendet.

Sortierung nach Gruppe

Sortieren nach GROUP BY.

Sortieren nach Bestellung

Sortierung für ORDER BY.

Tische öffnen

Dieser Vorgang sollte schnell ablaufen, sofern er nicht durch andere Faktoren gestört wird. Beispielsweise kann die Tabelle nicht von anderen Threads geöffnet werden, bis die Anweisung ALTER TABLE oder LOCK TABLE abgeschlossen ist. Ich versuche, einen Tisch zu öffnen.

Duplikate entfernen

Es wird eine SELECT DISTINCT-Abfrage ausgeführt, aber MySQL konnte im vorherigen Schritt doppelte Datensätze nicht durch Optimierung beseitigen. Daher muss MySQL doppelte Datensätze erneut entfernen und dann die Ergebnisse an den Client senden.

Tabelle erneut öffnen

Es wird eine Sperre für eine Tabelle eingerichtet, dies kann jedoch erst nach einer Änderung der Tabellenstruktur erfolgen. Die Sperre wurde aufgehoben, die Tabelle wurde geschlossen und es wird versucht, die Tabelle erneut zu öffnen.

Reparatur durch Sortieren

Korrigieren Sie die Anweisungen zum Sortieren, um einen Index zu erstellen.

Reparatur mit Keycache

Die Reparaturanweisung besteht darin, unter Verwendung des Index-Cache nacheinander neue Indizes zu erstellen. Dies ist langsamer als die Reparatur durch Sortieren.

Durchsuche Zeilen für Updates

Zur Aktualisierung werden die Datensätze gesucht, die die Bedingungen erfüllen. Dies muss erfolgen, bevor das UPDATE zugehörige Datensätze ändern kann.

Schlafen

Warte auf eine neue Anfrage vom Client.

Systemsperre

Wartet auf den Erwerb einer externen Systemsperre. Wenn Sie 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.

Schloss aufrüsten

INSERT DELAYED versucht, eine Tabellensperre zu erwerben, um einen neuen Datensatz einzufügen.

Aktualisierung

Nach passenden Datensätzen suchen und diese ändern.

Benutzersperre

Wartet auf GET_LOCK().

Warten auf Tische

Der Thread wird benachrichtigt, dass die Datentabellenstruktur geändert wurde und erneut geöffnet werden muss, um die neue Struktur zu erhalten. Um die Datentabelle dann erneut zu öffnen, müssen Sie warten, bis alle anderen Threads die Tabelle schließen. Diese Benachrichtigung wird in den folgenden Situationen generiert: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE oder OPTIMIZE TABLE.

Warten auf Handler-Einfügen

INSERT DELAYED hat alle ausstehenden Einfügevorgänge verarbeitet und wartet auf neue Anforderungen.

Die meisten Zustände entsprechen sehr schnellen Vorgängen. Wenn ein Thread mehrere Sekunden lang im gleichen Zustand bleibt, liegt möglicherweise ein Problem vor und muss überprüft werden. Es gibt noch weitere Status, die oben nicht aufgeführt sind, die meisten davon sind jedoch nur nützlich, um festzustellen, ob Fehler beim Server vorliegen.

2 vollständige Prozessliste anzeigen;

Prozessliste anzeigen; es werden nur die ersten 100 Elemente aufgelistet. Wenn Sie alle Elemente auflisten möchten, verwenden Sie bitte „Vollständige Prozessliste anzeigen“.

3 offene Tische anzeigen;

Mit diesem Befehl kann überprüft werden, welche Tabellen aktuell geöffnet sind. Die Spalte „In_use“ gibt an, wie viele Threads eine Tabelle verwenden, und „Name_locked“ gibt an, ob der Tabellenname gesperrt ist, was normalerweise der Fall ist, wenn der Befehl „Drop“ oder „Rename“ auf diese Tabelle angewendet wird. Daher kann dieser Befehl unsere allgemeinen Fragen nicht beantworten: ob eine bestimmte Tabelle derzeit gesperrt ist, wem die Sperre für die Tabelle gehört usw.

offene Tabellen aus der Datenbank anzeigen;

4 Status wie „%lock%“ anzeigen

Überprüfen Sie den Serverstatus.

5 zeige Engine-InnoDB-Status\G;

Der Befehl vor MySQL 5.1 lautete: show innodbstatus\G;. In MySQL 5.5 können Sie den obigen Befehl verwenden, um die Laufzeitinformationen der InnoDB-Engine anzuzeigen.

6 zeigen Variablen wie „%timeout%“ an;

Serverkonfigurationsparameter anzeigen.

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Implementierungsprinzips der Transaktionsisolationsstufe in MySQL
  • Detaillierte Erklärung der Syntax und des Prozesses der Ausführung von MySQL-Transaktionen
  • Beschreibung der Standardtransaktionsisolationsebene von MySQL und Oracle
  • Automatischer Commit-Vorgang für MySQL-Transaktionen
  • MySQL Master-Slave-Synchronisation, Implementierungsprinzip des Transaktions-Rollbacks
  • Detaillierte Analyse von MySQL-Datenbanktransaktionen und -Sperren
  • Wird die Tabelle durch ein Update in einer MySQL-Transaktion gesperrt?
  • Tiefgreifendes Verständnis von verteilten PHP+MySQL-Transaktionen und -Lösungen
  • Wie implementiert MySQL ACID-Transaktionen?
  • Warum MySQL große Transaktionen vermeiden sollte und wie man sie löst
  • Detaillierte Erläuterung des Persistenzimplementierungsprinzips von Transaktionen in MySQL

<<:  HTML-Tabellen-Markup-Tutorial (40): Dunkles Rahmenfarbattribut der Kopfzeile BORDERCOLORDARK

>>:  Beispiel für die Implementierung des Skelettbildschirms des WeChat-Applets

Artikel empfehlen

Designtheorie: Die Grundlagen der Schriftgestaltung

<br />Worte sind das unvermeidliche Produkt ...

Docker generiert Bilder über Container und übermittelt DockerCommit im Detail

Inhaltsverzeichnis Nachdem Sie einen Container lo...

Beispiele für JavaScript-Operationselemente

Weitere Informationen zu Bedienelementen finden S...

Erläuterung des React+TypeScript-Projektaufbaufalls

Das Erstellen eines React-Projekts kann sehr einf...

Vue-CLI3.x stellt Projekte automatisch auf dem Server bereit

Inhaltsverzeichnis Vorwort 1. Installieren Sie sc...

Verwenden von js zur Realisierung eines dynamischen Hintergrunds

In diesem Artikelbeispiel wird der spezifische Co...

So stellen Sie DoNetCore mit Nginx in der Alibaba Cloud bereit

Grundlegende Umgebungskonfiguration Bitte kaufen ...

So verwenden Sie „union all“ in MySQL, um die Union-Sortierung zu erhalten

Manchmal kommt es in einem Projekt aus irreversib...

Einführung in die allgemeine API-Verwendung von Vue3

Inhaltsverzeichnis Veränderungen im Lebenszyklus ...

Diagramm der Installationszusammenfassung für MySQL 8.0.11

Installationsumgebung: CAT /etc/os-release Zeigt ...