Die schnellste Möglichkeit, einen mit 600 GB Tabellen indizierten Schlüsseldatentyp von INT in BIGINT zu ändern

12

In einer 600-GB-MySQL-Tabelle muss ein Datentyp von INT in BIGINT geändert werden. Die Spalte hat einen eindeutigen Index. Ich mag mit nicht signiertem INT gut umgehen können, aber ich gehe davon aus, dass der Wechsel zu BIGINT ziemlich schmerzhaft sein wird. Die Engine der Tabelle ist InnoDB. Was wäre einfacher:

  1. ALTER TABLE
  2. Struktur kopieren und INSERT INTO (SELECT *)
  3. Dump-Tabelle und Ändern der Definitionen der Dump-Datei-Tabelle
  4. Noch etwas?

UPDATE: Wie gewünscht, MySQL Version 5.5.15, keine Fremdschlüssel und Tabelle erstellen:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8
Noam
quelle
Definieren Sie Schmerzen, nehmen Sie sich die kürzeste Zeit ...? Schnellste Ergebnisse?
@ AlecTeal Nehmen Sie sich die kürzeste Zeit
Noam
Obwohl es die Frage nicht beantwortet und diese Frage wahrscheinlich diskutiert wurde, bevor der Tisch so groß wurde, würde ich auch nach einer Möglichkeit suchen, die Größe dieses Tisches zu reduzieren.
1
Welche Version von MySQL? Es ist wichtig, wie einige Versionen haben ALTER TABLE ONLINE. Haben Sie Fremdschlüssel, die auf diese Spalte verweisen? Es wäre hilfreich, wenn Sie die SHOW CREATE TABLE tablename;Ausgabe zeigen würden.
Ypercubeᵀᴹ
2
Wenn kurze Feldnamen zur Reduzierung der Tabellengröße beitragen würden, wären es 600 MB .
Jon of All Trades

Antworten:

2

Angenommen, Ihre Tabelle enthält keine Trigger, sollten Sie die Verwendung in Betracht ziehen, pt-online-schema-changeda Sie damit die Tabelle ÄNDERN können, ohne sie zu sperren.

Angesichts der Größe des Tisches wird es noch eine ganze Weile dauern.

Außerdem müssen Sie bei dieser Methode oder mit ALTER TABLEsicherstellen, dass Sie 600 GB zusätzlichen Speicherplatz haben, um zwei Kopien der Tabelle zu unterstützen, während diese wiederhergestellt wird.

Ike Walker
quelle
Hast du eine Zeitschätzung? (Ich weiß, es hängt von vielen Faktoren ab, aber wenn Sie raten müssten, was wäre die Reichweite)
Noam
@Noam Sie müssen die Tabelle nicht kopieren. Wenn Sie Alter table verwenden, ist der schlimmste Fall, dass es kopiert wird. Wenn Sie eine ausgereifte Engine verwenden, macht es sich nur eine Notiz, dass alles, was zuvor (an einem Ort in einer Datei oder in einem Datensatz) verwendet wurde, int, alles, was post verwendet, bigint, bis Sie optimieren.
@ AlecTeal Haben Sie einen formellen Hinweis darauf?
Noam
@Noam meine Antwort sehen.
1
@Noam Ich würde schätzen, dass die ALTER TABLEAusführung 24 bis 96 Stunden dauern könnte. Sie können eine bessere Schätzung erhalten, indem Sie die ALTER TABLE in einer Testumgebung ausführen.
Ike Walker
2

Die Verwendung des Percona-Toolkits pt-online-schema-changewäre meine Wahl für die Produktion, ohne die Verwendung zu beeinträchtigen. Dadurch werden einige Trigger hinzugefügt, um Ihre Deltas und eine temporale Tabelle abzurufen, die anschließend umbenannt werden.

Beispiel:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
Binlogic DBA
quelle
pt ist der richtige Weg. @Noam FYI: Die INT-> BIGINT-Migration auf eine ~ 270-GB-Tabelle mit vielen Zeilen in der EC2-Instanz mit ziemlich hoher Schreibaktivität für diese Tabelle dauerte 64 Stunden mit pt-online-schema-change.
Jakub Głazik