Ich muss einen Index für eine MySQL-Tabelle mit ~ 5 Millionen Zeilen erstellen. Es ist eine Produktionstabelle, und ich fürchte einen vollständigen Block von allem, wenn ich eine CREATE INDEX-Anweisung ausführe ...
Gibt es eine Möglichkeit, diesen Index zu erstellen, ohne Einfügungen und Auswahlen zu blockieren?
Ich frage mich nur, dass ich nicht anhalten, einen Index erstellen und mein System neu starten muss!
mysql
indexing
production
alter-table
table-locking
n0cturnal
quelle
quelle
Antworten:
[2017] Update: MySQL 5.6 unterstützt Online-Index-Updates
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] Das Aktualisieren der Tabelle zeigt Blockschreibvorgänge in MySQL 5.5 an
Aus der obigen Antwort:
Dies ist **** FALSE **** (zumindest für MyISAM / InnoDB-Tabellen, was 99,999% der Leute da draußen verwenden. Clustered Edition ist anders.)
Wenn Sie UPDATE-Operationen für eine Tabelle ausführen, wird BLOCKIERT, während der Index erstellt wird. MySQL ist wirklich sehr, sehr dumm (und ein paar andere Dinge).
Testskript:
Mein Server (InnoDB):
Ausgabe (beachten Sie, wie die 6. Operation für die ~ 400 ms blockiert, die zum Abschluss der Indexaktualisierung erforderlich sind):
Vs Leseoperationen, die nicht blockieren (tauschen Sie den Zeilenkommentar im Skript aus):
Aktualisieren des MySQL-Schemas ohne Ausfallzeiten
Bisher gibt es nur eine mir bekannte Methode, um ein MySQL-Schema zu aktualisieren und keinen Verfügbarkeitsausfall zu erleiden. Rundschreiben Meister:
Eine einfache Möglichkeit, das Schema zu aktualisieren, ist dies nicht. In einer seriösen Produktionsumgebung funktionsfähig; Ja, so ist es. Bitte, bitte, bitte, wenn es eine einfachere Möglichkeit gibt, einer MySQL-Tabelle einen Index hinzuzufügen, ohne Schreibvorgänge zu blockieren, lassen Sie es mich wissen.
Googeln führte mich zu diesem Artikel, der eine ähnliche Technik beschreibt. Noch besser ist, dass sie empfehlen, an derselben Stelle im Verfahren zu trinken (Beachten Sie, dass ich meine Antwort geschrieben habe, bevor ich den Artikel gelesen habe)!
Perconas pt-online-Schema-Änderung
Der Artikel, den ich oben verlinkt habe, handelt von einem Tool, pt-online-schema-change , das wie folgt funktioniert:
Ich habe das Tool noch nie selbst ausprobiert. YMMV
RDS
Ich verwende derzeit MySQL über Amazon RDS . Es ist ein wirklich raffinierter Dienst, der MySQL einschließt und verwaltet, sodass Sie mit einer einzigen Schaltfläche neue Lesereplikate hinzufügen und die Datenbank über Hardware-SKUs hinweg transparent aktualisieren können. Es ist wirklich praktisch. Sie erhalten keinen SUPER-Zugriff auf die Datenbank, sodass Sie nicht direkt mit der Replikation schrauben können (ist dies ein Segen oder ein Fluch?). Sie können jedoch die Read Replica Promotion verwenden , um Ihre Schemaänderungen an einem schreibgeschützten Slave vorzunehmen, und diesen Slave dann zu Ihrem neuen Master heraufstufen. Genau der gleiche Trick wie oben beschrieben, nur viel einfacher auszuführen. Sie tun immer noch nicht viel, um Ihnen bei der Umstellung zu helfen. Sie müssen Ihre App neu konfigurieren und neu starten.
quelle
Wie in diesem Blogbeitrag beschrieben , wurde der InnoDB-
ALTER TABLE
Mechanismus für MySQL 5.6 komplett neu gestaltet.(Für einen exklusiven Überblick über dieses Thema bietet die MySQL-Dokumentation einen lesenswerten Nachmittag.)
Um einer Tabelle einen Index hinzuzufügen, ohne dass eine Sperre für
UPDATE
/ resultiertINSERT
, kann das folgende Anweisungsformat verwendet werden:quelle
MySQL 5.6-Update (Februar 2013): Sie können jetzt Lese- und Schreibvorgänge ausführen, während ein Index erstellt wird, auch mit InnoDB-Tabellen - http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
und:
von http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
quelle
pt-online-schema-change ist der richtige Weg, wenn Sie wirklich sicherstellen möchten, dass die Migration die Site nicht zum Erliegen bringt.
Wie ich im obigen Kommentar geschrieben habe, habe ich mehrere Erfahrungen mit pt-online-schema-change in der Produktion. Wir haben unsere Haupttabelle mit mehr als 20 Millionen Datensätzen und einen Master -> 2 schreibgeschützte Replikations-Slaves. Ich habe mindestens Dutzende von Migrationen mit pt-online-schema-change durchgeführt, vom Hinzufügen einer neuen Spalte, Ändern des Zeichensatzes bis zum Hinzufügen mehrerer Indizes. Wir bedienen auch während der Migrationszeit Tonnen von Verkehr und hatten keinen Schluckauf. Natürlich müssten Sie alle Skripte sehr gründlich testen, bevor Sie mit der Produktion beginnen.
Ich habe versucht, die Änderungen in einem Skript zusammenzufassen, sodass pt-online-schema-change die Daten nur einmal kopieren muss. Und seien Sie sehr vorsichtig beim Ändern des Spaltennamens, da Sie Ihre Daten verlieren. Das Hinzufügen eines Index sollte jedoch in Ordnung sein.
quelle
pt-online-schema-change
. Es ist großartig, aber in vielen Situationen, in denen die Online-DDL-Funktionen von MySQL 5.6 + bereits einwandfrei funktionieren, übertrieben. Es hat auch Einschränkungen (z. B. nicht gut mit Triggern zu spielen) und verdoppelt den Schreibaufwand pro Einfügung in die ursprüngliche Tabelle, während eine Schemaänderung ausgeführt wird. Es belastet Ihre Festplatte erheblich mehr als eine gewöhnliche Änderung des Online-Schemas und hat daher das Potenzial, Ihre Site unter Umständen "herunterzufahren", unter denen das einfache Ausführen der Schemaänderung auf einfache Weise gut funktioniert hätte.pt-online-schema-change
ein nützliches Tool ist, aber es gibt sehr viele Situationen, in denen gewöhnliches Online-DDL genauso gut ist und eine Handvoll, in denen es besser ist. Daher sollte jede Empfehlung sorgfältig und nicht universell abgewehrt werden.