it-swarm-eu.dev

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

Ich führe derzeit eine Änderungsabfrage für meine Tabelle aus (20 Millionen Einträge), um einen Index hinzuzufügen. Es läuft bereits seit mehr als 3 Tagen (bleibt auf "In tmp-Tabelle kopieren").

gibt es eine Möglichkeit, den Fortschritt der Abfrage zu sehen, oder gibt es in einem anderen Wort eine Möglichkeit, eine geschätzte Fertigstellungszeit zu erhalten?

vielen Dank.

15
Atai Voltaire

Wenn MySQL eine Tabelle ändert, erstellt es im Wesentlichen eine Kopie davon und tauscht die Kopie dann aus. Wenn Sie das Update in der Mitte abbrechen, befindet sich die Tabelle auf diese Weise 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 Ihre Sortierpuffervariablen (myisam_sort_buffer_size, sort_buffer_size) erhöhen. Machen Sie diese so groß wie möglich mit Ihrem Speicher. Je nachdem, wie viel Speicher Sie haben, können Sie die Änderungszeit um einige Tage verkürzen und sogar auf einige Stunden reduzieren. Ich habe in ungefähr 3 Stunden eine 150M-Aufzeichnungstabelle erstellt.

3
Brent Baisley

Da innodb_fle_per_table AUS 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 war 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, möchten Sie die Indexaktualisierung möglicherweise wie folgt durchführen:

BEISPIEL Sie haben Folgendes

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

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 Liste 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.

Übrigens hat MariaDB einen intern implementierten Fortschrittsstatus .

2
RolandoMySQLDBA

Es gibt keine zuverlässige Möglichkeit, den Fortschritt einer Indexerstellung zu verfolgen. Wenn Sie innodb-file-per-table aktiviert haben, können Sie sich einen Hinweis geben, indem Sie sich die temporäre .ibd-Datei ansehen, die im Datenverzeichnis erstellt wird, und sie mit der Größe der aktuellen Datei vergleichen, aber das ist nicht sehr zuverlässig, da Ihre aktuelle Datendatei aufgrund von Löschungen/Fragmentierungen aufgebläht sein könnte und die neue Datendatei einen zusätzlichen Index hat, den Ihre vorherige nicht hatte.

Es hört sich so an, als würden Sie eine Version von MySQL ohne InnoDB-Plugin verwenden. Das InnoDB-Plugin verfügt über schnelle Indexerstellung , für die keine vollständige Neuerstellung der Tabelle für das Hinzufügen und Löschen von Indizes erforderlich ist. 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 hat vor einiger Zeit (vor 5.5) das InnoDB-Plugin standardmäßig aktiviert.

1
Aaron Brown

pt-online-schema-change von Percona zeigt die verbleibende Zeitschätzung. Standardmäßig werden alle 30 Sekunden die verbleibende Zeitschätzung und der Fortschrittsprozentsatz ausgedruckt.

Es hat auch zusätzliche Funktionen im Vergleich dazu, den ALTER-Befehl alleine auszuführen.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

1
Haluk