Niektóre tabele INNODB w naszej produkcyjnej bazie danych wkrótce przekroczą limit INT AUTO_INCREMENT wynoszący 2147483647 i musimy je zmienić na BIGINT, w przeciwnym razie zapisy zaczną się nie powieść.
Tabele znajdują się w produkcyjnej bazie danych MySQL 5.6.19a działającej na Amazon RDS.
Jak możemy zrobić ALTER tak, aby nie zakłócać odczytywania produkcji i wstawek, które mają miejsce przez cały czas?
ALTER TABELA MYTABLE
ZMIANA id
id
WIELKA NIE NULL AUTO_INCREMENT;
Oto DDL dla tabeli:
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
zestaw narzędzi percona to droga, przynajmniej jeśli nie masz bardzo krótkiego czasu. Konwersja objęła nasz stół (500 Gb, konfiguracja master-slave), kiedy testowaliśmy ją nieco ponad 24 godziny, w produkcji zajęło to (z lepszym sprzętem) prawie 1 miesiąc (zabawny sidenote mieliśmy około 30 dni, zanim zabrakło nam identyfikatory, dlatego zaczęliśmy już planować plan B i C, pracując z kopiami zapasowymi offline, usuwając urządzenia podrzędne ...). Opóźnienie było głównie spowodowane oczekiwaniem replikacji na niewolników (dopuszczaliśmy maksymalne opóźnienie 50 sekund). Upewnij się także, aby ograniczyć liczbę jednoczesnych wątków. Mamy ponad 2 mln wkładek dziennie i wiele milionów odczytów.
Pamiętaj również, że po rozpoczęciu tworzenia kowboju nie możesz go zatrzymać (a przynajmniej nie znaleźliśmy żadnego sposobu na jego ponowne uruchomienie) :-(
źródło
Dobrze....
KEY TOP_QUERIES_LAST_30DAYS_fk (siteId)
jest zbędny z KLUCZEM PODSTAWOWYM, więc równie dobrze możesz go ZROBIĆ.INT UNSIGNED doprowadziłby cię do 4 miliardów, wystarczy?
Rozważ zmianę
filter
naENUM
.Czy masz 1,75 miliarda wierszy? A może „spaliłeś” dużo identyfikatorów? Jeśli tak, to możemy to naprawić? Na przykład
REPLACE
i niektóre smakiINSERT
podrzucą identyfikatory.INSERT...ON DUPLICATE KEY
zwykle może zastąpićREPLACE
. Dwuetapowy proces pozwala uniknąćINSERT IGNORE
wypalania identyfikatorów.Powrót do pytania ...
Sprawdź, czy zmiana schematu pt-online załatwi sprawę: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
źródło