Подтвердить что ты не робот

ALTER TABLE ADD COLUMN занимает много времени

Я просто пытался добавить столбец с именем "location" в таблицу (main_table) в базе данных. Команда, которую я запускал, была

ALTER TABLE main_table ADD COLUMN location varchar (256);

Основная таблица содержит > 2 000 000 строк. Он работает более 2 часов и все еще не завершен.

Я попытался использовать mytop для мониторинга активности этой базы данных, чтобы убедиться, что запрос не заблокирован другим процессом запросов, но, похоже, это не так. Должно ли это так долго? На самом деле, я только что перезагрузил машину, прежде чем запускать эту команду. Теперь эта команда все еще запущена. Я не уверен что делать.

4b9b3361

Ответ 1

Ваш оператор ALTER TABLE предполагает, что mysql придется переписывать каждую строку таблицы, включая новый столбец. Поскольку у вас более 2 миллионов строк, я бы определенно ожидал, что потребуется значительное количество времени, в течение которого ваш сервер, скорее всего, будет в основном связан с IO. Обычно вам было бы более удобно выполнять следующие действия:

CREATE TABLE main_table_new LIKE main_table;
ALTER TABLE main_table_new ADD COLUMN location varchar(256);
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table;
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table;
DROP TABLE main_table_old;

Таким образом вы добавляете столбец в пустую таблицу и в основном записываете данные в эту новую таблицу, которые, как вы уверены, никто не будет искать без блокировки как можно большего количества ресурсов.

Ответ 2

Я думаю, что подходящий ответ для этого - использование функции типа pt-online-schema-change или gh-ost.

Мы сделали миграцию более 4 миллиардов строк с этим, хотя это может занять до 10 дней, с минутой простоя.

Percona работает так же, как и выше

  • Создать временную таблицу
  • Создает триггеры в первой таблице (для вставок, обновлений, удалений), чтобы они были реплицированы в таблицу temp
  • В небольших партиях переносить данные
  • Когда закончите, переименуйте таблицу в новую таблицу и отпустите другую таблицу