Heim  >  Artikel  >  Datenbank  >  Wie kann ich „Warten auf Tabellenmetadatensperre“ in MySQL identifizieren und beheben?

Wie kann ich „Warten auf Tabellenmetadatensperre“ in MySQL identifizieren und beheben?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 12:54:30707Durchsuche

How to Identify and Resolve

Fehlerbehebung für den Status „Warten auf Tabellenmetadatensperre“ in MySQL

Das Ausführen von DDL-Vorgängen für eine Tabelle kann gelegentlich zu einem „Warten auf Tabelle“ führen Meldung „Metadatensperre“ beim Überprüfen der SHOW PROCESSLIST. Dies zeigt an, dass eine andere Transaktion noch nicht geschlossen wurde und eine Sperre für die Tabelle hält, wodurch die Änderung verhindert wird.

Identifizieren der blockierenden Transaktion

Um festzustellen, welche Transaktion verursacht wird In diesem Zustand können die folgenden Methoden eingesetzt werden:

1. SHOW ENGINE INNODB STATUS

(Für MySQL-Versionen <5.7.3)

Führen Sie SHOW ENGINE INNODB STATUS G aus, um detaillierte Informationen zu InnoDB-Interna anzuzeigen, einschließlich des Abschnitts TRANSAKTIONEN. Dadurch werden aktive Transaktionen und deren Status aufgelistet.

2. INFORMATION_SCHEMA-Tabellen

Die Tabelle INNODB_LOCK_WAITS im INFORMATION_SCHEMA enthält Informationen zu Transaktionen, die auf Sperren warten. Um alle derartigen Transaktionen zu überprüfen, verwenden Sie:

<code class="sql">SELECT * FROM INNODB_LOCK_WAITS;</code>

Um blockierende Transaktionen zu identifizieren, führen Sie Folgendes aus:

<code class="sql">SELECT * FROM INNODB_LOCKS WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);</code>

Alternativ:

<code class="sql">SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);</code>

Um Sperren für eine bestimmte zu überprüfen Tabelle:

<code class="sql">SELECT * FROM INNODB_LOCKS WHERE LOCK_TABLE = db_name.table_name;</code>

Um Transaktionen aufzulisten, die auf Sperren warten:

<code class="sql">SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';</code>

Zusätzliche Ressourcen

Siehe MySQL-Fehlerbehebungshandbuch, Kapitel 6 , Seite 96, für weitere Einblicke in die Lösung dieses Problems.

Das obige ist der detaillierte Inhalt vonWie kann ich „Warten auf Tabellenmetadatensperre“ in MySQL identifizieren und beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn