Самый быстрый способ изменить тип данных индексированного ключа таблицы 600 ГБ с INT на BIGINT

13

Мне нужно изменить тип данных с INT на BIGINT в таблице MySQL 600 ГБ. Столбец имеет уникальный индекс. Я мог бы быть хорош с неподписанным INT, но я предполагаю, что изменение к этому или BIGINT будет в значительной степени той же самой болью. Двигатель стола - InnoDB. Что будет проще:

  1. ALTER TABLE
  2. Копирование структуры и INSERT INTO (SELECT *)
  3. Таблица дампа и изменение определений таблицы файла дампа
  4. Что-нибудь еще?

ОБНОВЛЕНИЕ: Как и требовалось, MySQL версии 5.5.15, без внешних ключей и создания таблицы:

 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
Ноам
источник
Определить боль, принять кратчайшее количество времени ....? Самые быстрые результаты?
@AlecTeal Возьмите самое короткое время
Noam
Хотя он не отвечает на этот вопрос, и этот вопрос, вероятно, обсуждался до того, как таблица стала настолько большой, я бы также искал способ уменьшить размер этой таблицы.
1
Какая версия MySQL? Это имеет значение, как и некоторые версии ALTER TABLE ONLINE. У вас есть внешние ключи, ссылающиеся на этот столбец? Это помогло бы, если бы вы показали SHOW CREATE TABLE tablename;вывод.
ypercubeᵀᴹ
2
Если бы короткие имена полей помогли уменьшить размер таблицы, это было бы 600 МБ .
Джон на все руки

Ответы:

2

Предполагая, что ваша таблица не имеет никаких триггеров, вы должны рассмотреть возможность ее использования, pt-online-schema-changeпоскольку это позволит вам ИЗМЕНИТЬ таблицу без ее блокировки.

Это все еще займет значительное количество времени, учитывая размер таблицы.

Кроме того, при использовании этого метода или ALTER TABLEвам потребуется убедиться, что у вас есть 600 ГБ дополнительного дискового пространства для поддержки двух копий таблицы во время ее восстановления.

Айк Уокер
источник
Получил оценку времени? (Я знаю, что это зависит от многих факторов, но если бы вам пришлось угадывать, каков будет диапазон)
Noam
@ Нет, тебе не нужно копировать таблицу. Если вы используете Alter table, то WORST CASE заключается в том, что он копирует, если вы используете зрелый движок, он просто сделает для себя заметку, что все, что раньше (какое-то место в файле или какая-либо запись) использует int, все, что в посте использует bigint, пока Вы оптимизируете.
@AlecTeal У вас есть официальная ссылка на это?
Noam
@ Ноу посмотри мой ответ.
1
@ Ноам я бы посчитал, что бег ALTER TABLEможет занять 24 - 96 часов. Вы можете получить более точную оценку, запустив ALTER TABLE в тестовой среде.
Айк Уокер
2

Использование Percona Toolkit pt-online-schema-changeбыло бы моим выбором на производстве без ущерба для использования. Это добавит триггеры для получения дельт и временную таблицу, которая будет переименована после того, как это будет сделано.

пример:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
Binlogic DBA
источник
это путь. @Noam FYI: миграция INT-> BIGINT для таблицы ~ 270 ГБ с большим количеством строк в экземпляре EC2 с довольно высокой активностью записи в эту таблицу заняла 64 часа с использованием pt-online-schema-change.
Якуб Глазик