Некоторые таблицы INNODB в нашей производственной базе данных собираются достичь предела INT AUTO_INCREMENT, равного 2147483647, и нам нужно изменить их на BIGINT, в противном случае записи начнут давать сбой.
Таблицы находятся в рабочей базе данных MySQL 5.6.19a, работающей на Amazon RDS.
Как мы можем сделать ALTER, как это, не прерывая производственные операции чтения и вставки, которые происходят все время?
ALTER TABLE MYTABLE
CHANGE id
id
BIGINT NOT NULL AUTO_INCREMENT;
Вот DDL для таблицы:
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 - это путь, по крайней мере, если вы не слишком коротки во времени. Преобразование потребовалось на нашем столе (500 Гб, настройка «главный-подчиненный»), когда мы протестировали его чуть более чем за 24 часа, в производстве это заняло (с лучшим аппаратным обеспечением) почти 1 месяц (забавный sidenote, у нас было около 30 дней, прежде чем у нас закончились идентификаторы, поэтому мы уже начали планировать планы B и C, работая с автономными резервными копиями, удаляя подчиненных, ...). Задержка произошла в основном из-за ожидания репликации, ведущей к подчиненным устройствам (мы допустили максимальную задержку в 50 секунд). Также убедитесь, что ограничено количество одновременных потоков. У нас более 2 миллионов вкладок в день и много миллионов операций чтения.
Также имейте в виду, что после запуска покрытия вы не сможете остановить его (или, по крайней мере, мы не нашли способа перезапустить его) :-(
источник
Что ж....
KEY TOP_QUERIES_LAST_30DAYS_fk (siteId)
избыточен с ПЕРВИЧНЫМ КЛЮЧОМ, так что вы можете также УДАЛИТЬ его.INT UNSIGNED даст вам 4 миллиарда, этого будет достаточно?
Рассмотреть вопрос о переходе
filter
наENUM
.У вас есть 1,75 миллиарда строк? Или ты "сжег" много идентификаторов? Если так, может быть, мы можем это исправить? Например
REPLACE
и определенные ароматыINSERT
воли бросают идентификаторы.INSERT...ON DUPLICATE KEY
обычно можно заменитьREPLACE
. Двухэтапный процесс может избежатьINSERT IGNORE
записи идентификаторов.Вернуться к вопросу ...
Посмотрите, поможет ли pt-online-schema-change: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
источник