it-swarm.com.de

Sperrt ALTER TABLE - ADD COLUMN die Tabelle?

Ich habe eine Frage zur ALTER TABLE ... ADD COLUMN DDL-Anweisung .

Auf einer Amazon RDS-Instanz mit MariaDB 10.2 habe ich festgestellt, dass INSERT -Anweisungen vollständig sind und die Zeilen vor einem ALTER TABLE ... ADD COLUMN auf dem Tisch endet.

Sollte keine DML-Anweisung, die einen Schreibvorgang ausführt, in die Warteschlange gestellt werden, bis die Operation ALTER TABLE Abgeschlossen ist?

Ich poste diese Frage, weil ich gebeten wurde, einen Test durchzuführen, um zu überprüfen, ob es möglich ist, ALTER TABLE ... ADD COLUMN In einer Live-Produktionsdatenbank während der Geschäftszeiten, in einer stark genutzten Datenbank und in Tabellen mit mehreren auszuführen Millionen Zeilen - was ich sehr schlecht beraten finde. Selbst wenn ALTER TABLE Die Tabelle nicht sperrt, muss gewartet werden, bis eine Verbindung die Tabelle nicht mehr verwendet (aufgrund der Verbindung, die eine Metadatensperre platziert) passieren viel viel später.
EDIT: Anscheinend war diese Bewertung zu pessimistisch. Ich habe mehrere Tests mit mysqlslap durchgeführt, die schwere Operationen an der Tabelle ausführen (INSERT, UPDATE, DELETE Anweisungen und SELECT Anweisungen mit LIKE, um die Verwendung von Indizes zu vermeiden) für 150 simulierte gleichzeitige Verbindungen, während ALTER TABLE ... ADD COLUMN ausgeführt wird; Die Profilerstellung zeigt Metadatensperren, jedoch mit kurzen Wartezeiten (jeweils 1 Sekunde), und die Tabellenänderung wird in etwa 30 Minuten abgeschlossen, verglichen mit 10 Minuten, in denen keine SQL-Anweisungen ausgeführt werden. Obwohl dies zufriedenstellend ist, möchte ich andererseits wissen, ob es sicher ist anzunehmen, dass DDL-Anweisungen nicht blockierend sind.

(Es ist wahrscheinlich erwähnenswert, dass es in InnoDB eine Instant ADD COLUMN -Funktion gibt, die das sofortige Hinzufügen einer Spalte zur Tabelle ermöglicht (unter bestimmten Einschränkungen), aber vorher nicht verfügbar ist v10.3.2.)

6
dr_

Ja, es sperrt den Tisch. Aus den Dokumenten zu MySQL 8,

Die zuvor erwähnte Ausnahme besteht darin, dass ALTER TABLE Lesevorgänge (nicht nur Schreibvorgänge) an dem Punkt blockiert, an dem veraltete Tabellenstrukturen aus den Tabellen- und Tabellendefinitionscaches gelöscht werden können. Zu diesem Zeitpunkt muss eine exklusive Sperre erworben werden. Dazu wartet es, bis die aktuellen Leser fertig sind, und blockiert neue Lese- und Schreibvorgänge.

Und aus dem Dokumente, die Sie verlinkt haben ist es ziemlich explizit

Mit sofortigem ADD COLUMN Können Sie alle Vorteile des strukturierten Speichers nutzen, ohne den Nachteil, dass Sie die Tabelle neu erstellen müssen.

Wie Sie gesagt haben, sind Sie auf 10.2. Es sieht also so aus, als müsste beim Hinzufügen einer Spalte die gesamte Tabelle neu erstellt werden.

Was passiert, wenn Sie keine Sperre erhalten können?

Ich habe festgestellt, dass INSERT -Anweisungen vollständig sind und die Zeilen korrekt in die Tabelle eingefügt werden (wie über SELECT überprüft), bevor ein ALTER TABLE ... ADD COLUMN In der Tabelle beendet wird.

Ja, das passiert im Allgemeinen während einer Sperre, aber beachten Sie, dass dies nicht immer passiert. Manchmal geben Kontoauszüge und Transaktionen das Warten auf. Manchmal ernten Backends und Pools, wenn sie warten müssen. Es ist immer sicherer, dies während Ausfallzeiten zu tun, Zeitüberschreitungen zu haben und Fehler aus Bibliotheken abzufangen, wenn die Zeitüberschreitungen ablaufen. Solange Sie Transaktionen verwenden, werden die Dinge zurückgesetzt, wenn etwas ausgelöst wird und es vor dem Timeout nicht gesperrt werden kann - alles wird koscher sein.

3
Evan Carroll

es hängt tatsächlich von der spezifischen Änderungstabelle ab, aber auf jeden Fall würde ich vorschlagen, sich mit Online-Schemaänderungstools wie Ghost (von GitHub) oder pt-online-schema-change (von percona) zu befassen.

Beide Tools nehmen die Änderung auf einem separaten Tisch vor und wechseln am Ende mit dem Original - Sie können sogar das alte für einen schnellen Rollback behalten.

Dies ist eine viel sicherere Route, insbesondere für stark beladene Tische

2
cohenjo