Найшвидший спосіб змінити тип даних із індексованим ключем таблиці 600 ГБ з INT на BIGINT


13

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

  1. АЛЬТЕР ТАБЛ
  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 ГБ додаткового дискового простору для підтримки двох копій таблиці під час її перебудови.


Отримали якусь оцінку часу? (Я знаю, це залежить від багатьох факторів, але якби вам довелося здогадуватися, який би був діапазон)
Ноам

@Нома вам не потрібно копіювати таблицю. Якщо ви використовуєте таблицю Alter, НАЙКРАЩИЙ СЛУЧАЙ полягає в тому, що вона копіює, якщо ви використовуєте зрілий двигун, вона просто зробить собі зауваження, що все, що раніше (якесь місце у файлі чи якийсь запис) використовує int, все, що використовується, використовує bigint, поки ви оптимізуєте.

@AlecTeal Чи є у вас якісь офіційні посилання на це?
Ноам

@Noam дивіться мою відповідь.

1
@Noam Я вважаю, що запуск ALTER TABLEможе зайняти 24 - 96 годин. Ви можете отримати кращу оцінку, запустивши ALTER TABLE у тестовому середовищі.
Айк Уокер

2

Використання інструментарію percona pt-online-schema-changeбуло б моїм вибором у виробництві, не впливаючи на використання. Це додасть деякі тригери, щоб отримати ваші дельти та тимчасову таблицю, яка буде перейменована після цього.

приклад:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

pt - це шлях. @Noam FYI: INT-> BIGINT міграція на ~ 270 ГБ таблиці з великою кількістю рядків на екземплярі EC2 з досить великою активністю запису в цій таблиці зайняла 64 години, використовуючи pt-online-схему зміни.
Якуб Глазік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.