Die Frage wird hier zitiert: https://www.zhihu.com/question/440231149. In MySQL gibt es 300 Millionen Daten in einer Tabelle, die nicht in Tabellen unterteilt ist. Die Anforderung besteht darin, dieser großen Tabelle eine Datenspalte hinzuzufügen. Die Datenbank kann nicht gestoppt werden und es finden weiterhin Hinzufügungs-, Lösch- und Änderungsvorgänge statt. Wie mache ich das? Die Antwort ist originell In der alten MySQL-Version wurde eine Spalte folgendermaßen hinzugefügt: ALTER TABLE Ihre Tabelle ADD COLUMN neue Spalte char(128); Führt zu einer Tabellensperre. Der einfache Vorgang ist wie folgt:
Bei extrem großen Datenmengen ist die Tabellensperrzeit sehr lang. Während dieser Zeit werden sämtliche Tabellenaktualisierungen blockiert und Online-Geschäfte können nicht normal ausgeführt werden. Bei Versionen vor MySQL 5.6 (nicht enthalten) werden Trigger verwendet, um Aktualisierungen einer Tabelle in einer anderen Tabelle zu wiederholen und Daten zu synchronisieren. Wenn die Datensynchronisierung abgeschlossen ist, ändert das Unternehmen den Tabellennamen in eine neue Tabelle und veröffentlicht diese. Der Geschäftsbetrieb wird nicht eingestellt. Die Trigger-Einrichtung ähnelt: Trigger „person_trigger_update“ NACH DEM UPDATE für jede Zeile der Originaltabelle erstellen beginne mit dem Setzen von @x = "UPDATE auslösen"; In neue Tabelle ersetzen. SELECT * aus Originaltabelle, wobei neue Tabellen-ID = Original-Tabellen-ID; ENDE, WENN; Ende; MySQL 5.6 und spätere Versionen führen die Online-DDL-Funktion ein: Ändern Sie Ihre Tabelle, ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}, LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE } Die Parameter sind: ALGORITHMUS:
SPERREN:
Vergleich der von verschiedenen Versionen unterstützten Online-DDL-Änderungsalgorithmen: Referenzdokumente: MySQL 5.6: https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.htmlMySQL 5.7: https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.htmlMySQL 8.0: https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html Dies kann folgendermaßen erfolgen: ALTER TABLE Ihre Tabelle ADD COLUMN neue Spalte char(128), ALGORITHM=INSTANT, LOCK=NONE; Ähnliche Anweisungen werden verwendet, um Felder online hinzuzufügen. Am besten geben Sie ALGORITHM und LOCK an , damit Sie bei der Ausführung von DDL genau wissen, welchen Einfluss es auf das Online-Geschäft hat . Gleichzeitig läuft die Ausführung von Online-DDL ungefähr wie folgt ab: Es ist ersichtlich, dass in der Anfangsphase eine Metadatensperre erforderlich ist. Die Metadatensperre wurde in MySQL in 5.5 eingeführt. Es gab bereits zuvor ähnliche Mechanismen zum Schutz von Metadaten, aber das Konzept der Metadatensperre wurde nicht klar vorgeschlagen. Allerdings gibt es hinsichtlich des Metadatenschutzes einen erheblichen Unterschied zwischen Versionen vor 5.5 (z. B. 5.1) und Versionen nach 5.5. 5.1 schützt Metadaten auf Anweisungsebene, während 5.5 Metadaten auf Transaktionsebene schützt. Die sogenannte Anweisungsebene bedeutet, dass nach der Ausführung der Anweisung ihre Tabellenstruktur von anderen Sitzungen aktualisiert werden kann, unabhängig davon, ob die Transaktion festgeschrieben oder zurückgesetzt wurde; während die Transaktionsebene bedeutet, dass die Metadatensperre erst nach Beendigung der Transaktion aufgehoben wird. Die Einführung der Metadatensperre löst hauptsächlich zwei Probleme. Das eine ist das Problem der Transaktionsisolierung. Wenn beispielsweise Sitzung A unter der wiederholbaren Isolationsstufe die Tabellenstruktur während zweier Abfragen ändert, sind die beiden Abfrageergebnisse inkonsistent und können die Anforderungen für wiederholbares Lesen nicht erfüllen. Das andere ist das Problem der Datenreplikation. Wenn beispielsweise Sitzung A mehrere Aktualisierungsanweisungen ausführt und eine andere Sitzung B die Tabellenstruktur ändert und diese zuerst festschreibt, führt der Slave zuerst die Änderung und dann die Aktualisierung erneut aus, was zu Replikationsfehlern führt. Wenn derzeit viele Transaktionen ausgeführt werden und einige Transaktionen große Abfragen enthalten, beispielsweise: TRANSAKTION STARTEN; Wählen Sie count(*) aus Ihrer Tabelle Dies führt dazu, dass die Ausführung von Transaktionen lange dauert und diese zudem blockiert werden. Also im Prinzip:
Dies ist das Ende dieses Artikels zum Hinzufügen einer Spalte zu einer großen MySQL-Tabelle. Weitere Informationen zum Hinzufügen einer Spalte zu einer großen MySQL-Tabelle finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Statischer und dynamischer Gültigkeitsbereich von JavaScript anhand von Beispielen erklärt
>>: Implementierung der Navigationsleiste und des Dropdown-Menüs in CSS
Antd+React+Webpack ist häufig die Standardkombina...
Hier ist ein Fall des Ziehens einer modalen Box. ...
Die weltberühmte virtuelle Maschinensoftware VMwa...
1. Warm und sanft Zugehörige Adresse: http://www.w...
Inhaltsverzeichnis Vorwort Gespeicherte Prozedur:...
Inhaltsverzeichnis 1. Veranstaltungsdelegation Er...
Wenn Sie kein Linux-System haben, finden Sie unte...
Die kleinste Planungseinheit in k8s --- pod Im vo...
Im vorherigen Artikel habe ich beschrieben, wie s...
Es ist sehr mühsam, eine virtuelle Maschine einzu...
Das doppelte Absenden von Formularen ist das häuf...
<br />Von der Geburt meiner ersten persönlic...
Wie lässt sich bei einem unbekannten Server oder ...
Kürzlich habe ich auf der B-Station einen Sperrfe...
Inhaltsverzeichnis Vorwort Zusammenfassung des Pr...