MySql Числовой тип Миграция на InnoDB - PullRequest
2 голосов
/ 31 мая 2011

У нас есть очень большая (более 10 миллионов) таблица строк, хранящаяся в MySql с использованием механизма InnoDB.Столбец «x» определен как «smallint (5) unsigned not null».

Требования изменились с момента создания оригинального проекта несколько лет назад, а в столбце «x» необходимо хранить минимальный размер типа данных «int unsigned not null '.

Нам разрешается "короткое" время простоя для развертывания приложения (менее 5 минут), поэтому любое изменение базы данных должно соответствовать этому временному окну, если для этого требуется, чтобы таблица базы данных былавременно недоступен (например, полная блокировка таблицы).Если изменение может быть сделано «онлайн», то мы, вероятно, можем принять ухудшение производительности в течение более длительного периода.

Кто-нибудь здесь имел опыт изменения типа столбца в MySql / InnoDB для очень большой таблицы?Если так, все прошло нормально и примерно сколько времени это заняло (я понимаю, что это зависит от аппаратного обеспечения, я просто пытаюсь понять, возможно ли даже то, что мы просим сделать во временном окне)?

Заранее спасибо,

Ответы [ 4 ]

1 голос
/ 31 мая 2011

вот рецепт, который я использовал

, где у вас есть старый столбец,

  1. создать новый столбец b
  2. создать триггер для обновления b при обновлении / вставке в
  3. обновление b = a
  4. отбросить все отношения fkey, ссылающиеся на
  5. создать отношения fkey для b
  6. обновить код для использования столбца b вместо (развернуть)
  7. триггеры удаления для столбца a
  8. выпадающий столбец a

повторите все шаги, если вам нужно изменить имя столбца обратно.

0 голосов
/ 01 июня 2011

Этот подход довольно быстрый

Query OK, 10000000 rows affected (6 min 0.14 sec)

mysql медленный запрос

0 голосов
/ 31 мая 2011

Какое решение для обеспечения высокой доступности вы используете в настоящее время?

Я спрашиваю, потому что 5 минут недостаточно для перезагрузки для обычных задач, таких как обновления ОС.

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

Должно быть возможно использовать такоесистема делает это.

Однако, ALTER TABLE позволяет таблице оставаться доступной для операций чтения на протяжении всего ее выполнения, и только блокирует чтение в течение короткого времени в конце (намного меньше, чем пять минут в большинстве систем).

Итак, спросите, во сколько раз вы можете разумно блокировать записи?

Кроме того, 10M строк - это не большая таблица, по всем параметрам.Вероятно, он подходит для оперативной памяти, поэтому его можно очень быстро изменить.

0 голосов
/ 31 мая 2011

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

CREATE TABLE newtable LIKE oldtable;

Затем измените столбцы вашей новой таблицы, чтобы они соответствовали новой спецификации

ALTER TABLE newtable ... ;

Как только это будет сделано, скопируйте данные.

INSERT INTO newtable SELECT * FROM oldtable;

Наконец, используйте несколько минут простоя, чтобы переименовать старую таблицу во что-то другое, а затем присвойте новой таблице имя старой таблицы.

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

Если вы уверены, что все данные в старой таблице были скопированы в новую без каких-либо потерь, вы можете окончательно удалить старую таблицу полностью.

РЕДАКТИРОВАТЬ:

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

Кроме того, если у вас есть какие-либо ограничения FK, которые зависят от рассматриваемого столбца, вам нужно будет удалить их перед запуском и восстановить их в новом столбце, как только вы это сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...