Ich habe eine große Tabelle mit einer VARCHAR (20) -Spalte und muss diese ändern, um eine VARCHAR (50) -Spalte zu werden. Normalerweise dauert das Ausführen einer ALTER TABLE (Hinzufügen eines TINYINT) für diese bestimmte Tabelle etwa 90 bis 120 Minuten. Das kann ich also nur am Samstag- oder Sonntagabend tun, um die Benutzer der Datenbank nicht zu beeinträchtigen. Wenn möglich, möchte ich diese Änderung vorher vornehmen.
Die Spalte ist auch indiziert, was die ALTER TABLE vermutlich verlangsamt, da der Index nach dem Ändern der Spaltenlänge neu erstellt werden muss.
Die Web-App wird in einer MySQL-Replikationsumgebung eingerichtet (26 Slaves und ein Master). Ich erinnere mich, dass ich einmal irgendwo gelesen habe, dass eine Methode darin besteht, zuerst die ALTER TABLE auf jedem Slave auszuführen (um die Auswirkungen auf die Benutzer zu minimieren) und dies dann auf dem Master zu tun, aber versucht das dann nicht, den ALTER TABLE-Befehl auf die Slaves zu replizieren?
Meine Frage lautet also: Wie kann ich diese Tabelle am besten ändern, ohne meine Benutzer zu stören?
Edit: Die Tabelle ist InnoDB.
quelle
Antworten:
Wenn Sie ein wenig abenteuerlustig sind, können Sie die Dinge selbst in die Hand nehmen, indem Sie die ALTER-TABELLE in sichtbaren Schritten ausführen. Angenommen, die zu ändernde Tabelle heißt WorkingTable. Sie können die Änderungen in folgenden Schritten durchführen:
Dies können Sie an allen Slaves durchführen. Was ist mit dem Meister ??? Wie verhindern Sie, dass dies auf die Slaves repliziert wird? Einfach: Senden Sie die SQL nicht in die Binärprotokolle des Masters. Beenden Sie einfach die Binärprotokollierung in der Sitzung, bevor Sie die ALTER TABLE-Aufgaben ausführen:
Aber warte !!! Was ist mit neuen Daten, die während der Verarbeitung dieser Befehle eingehen? Das Umbenennen der Tabelle zu Beginn der Operation sollte ausreichen. Ändern Sie diesen Code ein wenig, um zu verhindern, dass diesbezüglich neue Daten eingegeben werden:
Versuche es !!!
quelle
Aus der Dokumentation gehe ich davon aus, dass das bloße Erhöhen der Längenbeschränkung für a
varchar
nicht den gleichen Aufwand verursacht wie das Hinzufügen einer Spalte:Dies scheint jedoch in den Kommentaren zu dieser SO- Frage zu widersprechen .
BEARBEITEN
Zumindest in Version 5.0 kann ich bestätigen, dass für das Erhöhen der Länge tatsächlich eine temporäre Tabelle (oder eine andere, ebenfalls teure Operation) erforderlich ist:
Prüfstand:
Ergebnis:
quelle
Ich dachte, ich würde das seit dem erwähnen
ENGINE=INNODB
Wenn Sie Fremdschlüsseleinschränkungen haben, können Sie diese nicht ändern und umbenennen, ohne dass Ihre Einschränkungen auf die alte Tabelle (jetzt umbenannt) verweisen. Sie müssen danach die Bedingungen ändern oder für die Dauer löschen.
quelle