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 MYTABLE
CHANGE id
id
BIGINT 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
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) :-(
quelle
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
filter
zu einemENUM
.Haben Sie 1,75 Milliarden Zeilen? Oder hast du viele Ausweise "verbrannt"? Wenn ja, können wir das vielleicht beheben? Zum Beispiel
REPLACE
und bestimmte Varianten vonINSERT
Willenswurf-IDs.INSERT...ON DUPLICATE KEY
kann in der Regel ersetzenREPLACE
. Ein zweistufiger Prozess kann dasINSERT IGNORE
Brennen 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
quelle