Werden einer Tabelle im laufenden Betrieb Spalten oder Indizes hinzugefügt, kann ein einziger, nur kurz benötigter Lock alle Anfragen auf diese Tabelle warten lassen.
Warum Ein Hotfix fügt einer Tabelle im laufenden Betrieb Spalten oder Indizes hinzu → Folge Die Schemaänderung wartet auf eine zuvor geöffnete lange Transaktion, alle nachfolgenden Anfragen warten auf die Schemaänderung → Auf dem Bildschirm Funktionen, die diese Tabelle nutzen (Inventar, Post usw.), stehen komplett still und laufen in Timeouts
Hotfixes mit Schemaänderungen zeitlich mit der DB-Infrastruktur abstimmen, zuerst Code ausrollen, der auch ohne die neue Spalte funktioniert.
Aufgaben Infrastrukturteam
Kurzes Lock-Wait-Timeout setzen und bei Fehlschlag wiederholen, nur ausführen, wenn keine langen Transaktionen offen sind, Online-Schema-Change-Tools nutzen, große Tabellen im Wartungsfenster ändern.
Im Graphen
Stufe ab einem bestimmten Zeitpunkt · Auf Locks wartende Sessions, Query-Latenz der betroffenen Tabelle
Wo nachsehen
MySQL: Sessions mit State Waiting for table metadata lock in SHOW PROCESSLIST zählen und mit sys.schema_table_lock_waits die blockierende Session (blocking_pid) finden. PostgreSQL: Anfragen mit granted = false und AccessExclusiveLock in pg_locks prüfen und mit pg_blocking_pids() die blockierende Session finden
Spricht dafür
Ab dem Start der Schemaänderung stauen sich alle Queries auf diese Tabelle im Lock-Warten, ganz vorn steht eine nicht beendete Transaktion oder die Anweisung der Schemaänderung
Spricht dagegen
Wartevorgänge nur bei bestimmten Zeilen, andere Zeilen derselben Tabelle laufen normal: Hot Row (db-hot-row)
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
MySQL hält bei Schemaänderungen kurz einen Metadata Lock, PostgreSQL den stärksten Tabellen-Lock. Auch wenn die Änderung selbst sofort erledigt ist: Steht eine nicht beendete Transaktion davor, warten dahinter alle Anfragen.
Quellen
Online DDL Performance and ConcurrencyMySQL Auch Online-DDL braucht zum Abschluss kurz einen exklusiven Metadata Lock; bei langen Transaktionen wartet es, und die wartende Lock-Anfrage blockiert alle nachfolgenden Transaktionen
Server System VariablesMySQL lock_wait_timeout: Wartelimit für Metadata Locks, Standard 31.536.000 s (1 Jahr)