ALTER-Primärschlüsselspalte von INT nach BIGINT in der Produktion (MySQL 5.6.19a)

20

Einige INNODB-Tabellen in unserer Produktionsdatenbank stoßen kurz vor dem Erreichen des INT AUTO_INCREMENT-Grenzwerts von 2147483647, und wir müssen sie in BIGINT ändern, andernfalls schlagen die Schreibvorgänge fehl.

Die Tabellen befinden sich in einer MySQL 5.6.19a-Produktionsdatenbank, die unter Amazon RDS ausgeführt wird.

Wie können wir einen ALTER wie diesen durchführen, ohne die ständig stattfindenden Lesevorgänge und Einfügungen in der Produktion zu stören?

ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT;

Hier ist DDL für die Tabelle:

CREATE TABLE `MYTABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `siteId` int(11) NOT NULL,
  `filter` varchar(10) NOT NULL DEFAULT 'ALL',
  `date` varchar(10) NOT NULL,
  `cards` varchar(250) NOT NULL,
  `apples` varchar(45) NOT NULL,
  `carrots` varchar(45) NOT NULL,
  `corn` varchar(45) NOT NULL,
  `peas` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
  KEY `date_k` (`date`),
  KEY `cards_k` (`cards`),
  KEY `apples_k` (`apples`),
  KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8
Mark Hansen
quelle

Antworten:

22

Wenn Sie über genügend Speicherplatz verfügen, können Sie eine Kopie der aktuellen Tabelle erstellen und die folgenden Schritte ausführen:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

Dann können Sie die Spalte wie gewünscht ändern:

ALTER TABLE tbl_name MODIFY COLUMN col_name BIGINT AUTO_INCREMENT;

Sobald der Vorgang abgeschlossen ist, können Sie die Tabellen umbenennen:

RENAME TABLE tbl_name TO new_tbl_name, tbl_name2 TO new_tbl_name2;

Löschen Sie dann die ursprüngliche Tabelle, und Sie sollten das geprüfte Ergebnis haben.

kriegu
quelle
Ich habe diesen Ansatz verwendet, weil ich in der Lage war, Schreibvorgänge (die alle im Batch-Modus ausgeführt werden) für die Tabelle während des Kopierens zu deaktivieren. Dauerte ca. 36 Stunden.
Mark Hansen
und Sie möchten diese drei in einer Transaktion behalten. (sperren / entsperren)
Sławomir Lenart
4

Percona Toolkit ist der richtige Weg, zumindest wenn Sie nicht sehr schnell sind. Die Konvertierung dauerte auf unserem Tisch (500 GB, Master-Slave-Setup) etwas mehr als 24 Stunden, in der Produktion dauerte es (mit besserer Hardware) fast 1 Monat (witzige Randnotiz, die wir etwa 30 Tage hatten, bevor wir ausgehen würden) Aus diesem Grund haben wir bereits mit der Planung von Plan B und C begonnen und mit Offlinesicherungen, dem Entfernen von Slaves usw. gearbeitet. Die Verzögerung war hauptsächlich auf das Warten auf die Replikation gegenüber den Slaves zurückzuführen (wir haben eine maximale Verzögerung von 50 Sekunden zugelassen). Achten Sie auch darauf, die Anzahl der gleichzeitigen Threads zu begrenzen. Wir haben mehr als 2 Millionen Einfügungen pro Tag und viele Millionen Lesungen.

Beachten Sie auch, dass Sie die Coverion nach dem Start nicht mehr stoppen können (oder zumindest keinen Weg gefunden haben, sie neu zu starten) :-(

Matze
quelle
1

Gut....

KEY TOP_QUERIES_LAST_30DAYS_fk (siteId) ist mit dem PRIMARY KEY überflüssig, Sie können ihn also auch TROPFEN.

INT UNSIGNED würde Sie auf 4 Milliarden bringen, wird das ausreichen?

Überlegen Sie, ob Sie filterzu einem ENUM.

Haben Sie 1,75 Milliarden Zeilen? Oder hast du viele Ausweise "verbrannt"? Wenn ja, können wir das vielleicht beheben? Zum Beispiel REPLACEund bestimmte Varianten von INSERTWillenswurf-IDs. INSERT...ON DUPLICATE KEYkann in der Regel ersetzen REPLACE. Ein zweistufiger Prozess kann das INSERT IGNOREBrennen von IDs vermeiden .

Zurück zur Frage ...

Sehen Sie nach, ob die Änderung des pt-online-Schemas den Trick macht: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html

Rick James
quelle
Kann ich die Percona mit Amazon RDS verwenden? Ja, wir haben viele IDs "gebrannt", die Tabelle hat tatsächlich ungefähr 330 Millionen Zeilen.
Mark Hansen
Ich weiß nichts über PT & RDS. Wenn Sie das Brennen beseitigen könnten, haben Sie weitere ~ 330 Millionen IDs, bevor Ihnen der Raum ausgeht.
Rick James