Ich führe derzeit eine Änderungsabfrage für meine Tabelle (20 Millionen Einträge) aus, um einen Index hinzuzufügen. es läuft schon länger als 3 tage (auf 'copy to tmp table').
Gibt es eine Möglichkeit, den Fortschritt der Abfrage zu sehen, oder gibt es eine Möglichkeit, die geschätzte Ausführungszeit zu ermitteln?
Vielen Dank.
SHOW CREATE TABLE tblname\G
in die Tabelle ein und teilen Sie uns den Index mit, den Sie erstellen möchten.Antworten:
Wenn mysql eine Tabelle ändert, erstellt es im Wesentlichen eine Kopie davon und tauscht die Kopie dann aus. Wenn Sie auf diese Weise die Aktualisierung in der Mitte abbrechen, befindet sich die Tabelle immer noch in einem stabilen Zustand. Sie können also im mysql-Datenverzeichnis (/ var / lib / mysql /?) Nachsehen, wie groß die neue Datei ist und wie weit sie entfernt ist. Dies ist mit Innodb etwas schwieriger, aber irgendwo wird eine tmp-Tabelle erstellt.
Sie können die Zeit, die ein Index benötigt, erheblich reduzieren, indem Sie die Sortierpuffervariablen (myisam_sort_buffer_size, sort_buffer_size) erhöhen. Machen Sie diese so groß wie möglich mit dem Speicher, den Sie haben. Sie können die Änderungszeit um einige Tage verkürzen oder sie sogar auf einige Stunden reduzieren, je nachdem, wie viel Speicher Sie haben. Ich habe in ca. 3 Stunden eine 150M-Aufzeichnungstabelle erstellt.
quelle
Da innodb_fle_per_table auf OFF gesetzt ist, können Sie die Tabelle nicht sehen und den Fortschritt messen.
Ich habe einen früheren Beitrag darüber verfasst, wie dies für MyISAM gemacht wird . Sie können dies für InnoDB genau dann tun, wenn innodb_file_per_table aktiviert wurde und Sie die InnoDB-Infrastruktur neu strukturieren . Es ist weiterhin erforderlich, im Betriebssystem die Größe der betreffenden Dateien zu überprüfen.
Nachdem Sie die InnoDB-Bereinigung vollständig implementiert und innodb_file_per_table aktiviert haben, können Sie die Indexaktualisierung wie folgt durchführen:
BEISPIEL Sie haben folgendes
db.lotsofdata
mit 20 Millionen Namen aufgerufen :Die Tabelle sieht folgendermaßen aus:
Angenommen, Sie möchten einen Namensindex erstellen. Du kannst das:
Während das INSERT ausgeführt wird, rufen Sie das Betriebssystem auf und führen Folgendes aus:
Dadurch erhalten Sie eine Auflistung der aktuellen Größe von
lotsofdata_new.ibd
. Wenn es größer wird alslotsofdata.ibd
, dann wissen Sie, dass Sie kurz vor dem Abschluss stehen.BTW MariaDB hat einen intern implementierten Fortschrittsstatus .
quelle
Es gibt keine zuverlässige Möglichkeit, den Fortschritt einer Indexerstellung anzuzeigen. Wenn Sie innodb-file-per-table aktiviert haben, können Sie einige Hinweise erhalten, indem Sie die temporäre .ibd-Datei, die im Datenverzeichnis erstellt wird, überprüfen und mit der Größe der aktuellen Datei vergleichen, aber das ist nicht sehr zuverlässig, da Ihre aktuelle Datendatei aufgrund von Löschvorgängen / Fragmentierung aufgebläht werden kann und die neue Datendatei einen zusätzlichen Index hat, den Ihre vorherige nicht hat.
Es hört sich so an, als würden Sie eine Version von MySQL ohne das installierte InnoDB-Plugin verwenden . Das InnoDB-Plugin verfügt über eine schnelle Indexerstellung, die keine vollständige Neuerstellung der Tabelle für das Hinzufügen und Löschen von Indizes erfordert. Das InnoDB-Plugin ist in MySQL 5.5 standardmäßig aktiviert und mit einer Konfigurationseinstellung in 5.1.38 und höher verfügbar.
Percona Server (vor 5.5) hat das InnoDB Plugin standardmäßig aktiviert.
quelle
pt-online-schema-change von Percona zeigt verbleibende Zeitschätzung an. Standardmäßig werden alle 30 Sekunden die geschätzte verbleibende Zeit und der Prozentsatz des Fortschritts gedruckt.
Es hat auch zusätzliche Funktionen im Vergleich zum Ausführen des ALTER-Befehls alleine.
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
quelle