Выполнение Alter Table для большой таблицы Innodb

Недавно меня назначили на должность администратора БД для нашего сервера, поэтому мне приходится учиться на ходу. Недавно мы обнаружили, что в одной из наших таблиц столбец id исчерпан, и ее необходимо перенести на bigint. Это для таблицы INNODB примерно с 301 ГБ данных. Мы используем MySQL версии 5.5.38. Команда, которую я запускаю для переноса таблицы,

ALTER TABLE tb_name CHANGE id id BIGINT NOT NULL;

Я начал миграцию, и сейчас миграция длится 18 часов, но я не вижу, чтобы наше дисковое пространство на сервере вообще не менялось, что заставляет меня думать, что ничего не происходит. У нас много памяти, так что не беспокойтесь, но он все еще показывает следующее состояние сообщения, когда я запускаю «show processlist;»

скопировать в tmp таблицу

У кого-нибудь есть идеи или кто-нибудь знает, что я делаю неправильно? Пожалуйста, спросите, нужна ли вам дополнительная информация.


person mcsoup    schedule 19.06.2015    source источник
comment
Также нет никаких процессов, работающих с базой данных, кроме таблицы изменений.   -  person mcsoup    schedule 19.06.2015
comment
возможный дубликат Изменение больших таблиц MySQL InnoDB   -  person Mike Brant    schedule 19.06.2015
comment
Я проверил, и на диске выделено много места.   -  person mcsoup    schedule 20.06.2015
comment
в вашем временном каталоге???   -  person BK435    schedule 20.06.2015
comment
В каталоге, где mysql помещает файлы db   -  person mcsoup    schedule 20.06.2015


Ответы (1)


Да, это займет ооооочень много времени. Диски, вероятно, вращаются так быстро, как только могут. (В SSD используются более быстрые хомяки.)

Вы можете убить ALTER, так как все, что он делает, это, как говорится, «копирование в таблицу tmp», после чего он переименует таблицу tmp в настоящую таблицу и удалит старую копию.

Надеюсь, у вас было innodb_file_per_table = ON, когда вы начали ALTER. В противном случае он будет расширяться ibdata1, который впоследствии не будет уменьшаться.

pt-online-schema-change является альтернативой. Это все равно займет ооооочень много времени (с одним дополнительным «о», потому что это будет немного медленнее). Он будет выполнять свою работу, не блокируя другие действия.

Возможно, сейчас самое время проверить все столбцы и индексы в таблице:

  • Можно ли превратить некоторые INT в MEDIUMINT или что-то меньшее?
  • Некоторые из ИНДЕКСов не используются?
  • Как насчет нормализации некоторых VARCHAR?
  • Может быть, даже РАЗДЕЛИТЬ (но не без уважительной причины)? Временные ряды — типичное использование хранилища данных.
  • Суммировать данные и отбросить хотя бы старые данные?

Если вам нужны дополнительные указания, укажите SHOW CREATE TABLE.

person Rick James    schedule 20.06.2015