Hinzufügen eines Index sehr langsam ... gibt es eine MySQL-Cmd, um eine ETA zu erhalten oder Fortschritte zu zeigen?

13

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.

Atai Voltaire
quelle
4
MyISAM? InnoDB? Ist bei InnoDB die Option "Datei pro Tabelle" aktiviert?
Charles
Eine gute Frage - das Beste, was mir sofort einfällt, ist, anhand der Größe der temporären und tatsächlichen Rohdateien eine grobe Schätzung vorzunehmen - wird jedoch weitere Nachforschungen anstellen
Bitte tragen Sie sich SHOW CREATE TABLE tblname\Gin die Tabelle ein und teilen Sie uns den Index mit, den Sie erstellen möchten.
RolandoMySQLDBA

Antworten:

3

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
Leider konnte ich keine tmp-Tabelle finden. Ich verwende innoDB, wobei innodb_file_per_table auf OFF gesetzt ist.
2

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

  • MySQL-Instanz mit / var / lib / mysql als Datenverzeichnis
  • InnoDB-Tabelle db.lotsofdatamit 20 Millionen Namen aufgerufen :

Die Tabelle sieht folgendermaßen aus:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Angenommen, Sie möchten einen Namensindex erstellen. Du kannst das:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Während das INSERT ausgeführt wird, rufen Sie das Betriebssystem auf und führen Folgendes aus:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Dadurch erhalten Sie eine Auflistung der aktuellen Größe von lotsofdata_new.ibd. Wenn es größer wird als lotsofdata.ibd, dann wissen Sie, dass Sie kurz vor dem Abschluss stehen.

BTW MariaDB hat einen intern implementierten Fortschrittsstatus .

RolandoMySQLDBA
quelle
danke für eure rückmeldungen. Im Moment habe ich beschlossen, die Abfrage abzubrechen und es nach dem Upgrade auf die letzte MySQL-Version erneut zu versuchen. hoffentlich läuft es so reibungsloser.
Atai Voltaire
1

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.

  • Welche Version von MySQL verwenden Sie?

Percona Server (vor 5.5) hat das InnoDB Plugin standardmäßig aktiviert.

Aaron Brown
quelle
0

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

Haluk
quelle