Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ändern großer MySQL InnoDB-Tabellen

Änderung 2016: wir haben kürzlich (August 2016) gh-ost veröffentlicht , ändere meine Antwort, um sie widerzuspiegeln.

Heutzutage gibt es mehrere Tools, mit denen Sie Online-Änderungstabellen für MySQL erstellen können. Diese sind:

Betrachten wir das "normale" `ALTER TABLE`:

Das ALTER einer großen Tabelle wird viel Zeit in Anspruch nehmen . innodb_buffer_pool_size ist wichtig, ebenso wie andere Variablen, aber auf sehr großen Tabellen sind sie alle vernachlässigbar. Es braucht nur Zeit.

Was MySQL mit ALTER macht eine Tabelle soll eine neue Tabelle mit neuem Format erstellen, alle Zeilen kopieren, dann umschalten. Während dieser Zeit ist der Tisch vollständig gesperrt.

Denken Sie über Ihren eigenen Vorschlag nach:

Es wird höchstwahrscheinlich die schlechteste aller Optionen ausführen. Warum ist das so? Da Sie eine InnoDB-Tabelle verwenden, muss INSERT INTO tablename_tmp SELECT * FROM tablename sorgt für eine Transaktion. ein riesiger Transaktion. Es erzeugt noch mehr Last als das normale ALTER TABLE .

Außerdem müssen Sie zu diesem Zeitpunkt Ihre Anwendung herunterfahren, damit sie nicht schreibt (INSERT , DELETE , UPDATE ) zu Ihrem Tisch. Wenn dies der Fall ist, ist Ihre gesamte Transaktion sinnlos.

Was die Online-Tools bieten

Die Tools funktionieren nicht alle gleich. Die Grundlagen werden jedoch geteilt:

  • Sie erstellen eine "Schatten"-Tabelle mit geändertem Schema
  • Sie erstellen und verwenden Trigger, um Änderungen von der Originaltabelle an die Geistertabelle weiterzugeben
  • Sie langsam Kopieren Sie alle Zeilen aus Ihrer Tabelle in die Schattentabelle. Sie tun dies in Blöcken:sagen wir, 1.000 Zeilen auf einmal.
  • Sie tun all dies, während Sie immer noch auf die ursprüngliche Tabelle zugreifen und diese bearbeiten können.
  • Wenn sie zufrieden sind, tauschen sie die beiden mit einem RENAME aus .

Das openark-kit Tool ist jetzt seit 3,5 Jahren im Einsatz. Das Percona-Tool ist ein paar Monate alt, aber möglicherweise getesteter als das erstere. Das Tool von Facebook soll gut für Facebook funktionieren, bietet aber keine allgemeine Lösung für den durchschnittlichen Benutzer. Ich habe es selbst nicht verwendet.

Änderung 2016: gh-ost ist eine triggerlose Lösung, die die Master-Schreiblast auf dem Master erheblich reduziert und die Migrations-Schreiblast von der normalen Last entkoppelt. Es ist auditierbar, kontrollierbar, testbar. Wir haben es intern bei GitHub entwickelt und als Open Source veröffentlicht; Wir führen alle unsere Produktionsmigrationen über gh-ost durch heute. Weitere Informationen finden Sie hier .

Jedes Tool hat seine eigenen Einschränkungen, sehen Sie sich die Dokumentation genau an.

Der konservative Weg

Der konservative Weg ist, eine Aktiv-Passiv-Master-Master-Replikation zu verwenden, führen Sie den ALTER aus auf dem (passiven) Standby-Server, wechseln Sie dann die Rollen und führen Sie den ALTER aus wieder auf dem, was früher der aktive Server war, jetzt passiv geworden. Dies ist ebenfalls eine gute Option, erfordert jedoch einen zusätzlichen Server und tiefere Kenntnisse der Replikation.