У меня есть большая таблица со столбцом VARCHAR (20), и мне нужно изменить его, чтобы он стал столбцом VARCHAR (50). Как правило, выполнение ALTER TABLE (добавление TINYINT) для этой конкретной таблицы занимает около 90-120 минут, поэтому я могу сделать это только в субботу или в воскресенье вечером, чтобы избежать влияния на пользователей базы данных. Если возможно, я хотел бы сделать эту модификацию до этого.
Столбец также индексируется, что, как я полагаю, приведет к замедлению ALTER TABLE, потому что он должен перестроить индекс после изменения длины столбца.
Веб-приложение настроено в среде репликации MySQL (26 подчиненных и один ведущий). Однажды я вспомнил, что когда-то читал, что один из методов - сначала выполнить команду ALTER TABLE для каждого ведомого устройства (чтобы минимизировать влияние на пользователей), а затем сделать это на ведущем устройстве, но не попытается ли это затем повторить команду ALTER TABLE для ведомых устройств?
Поэтому мой вопрос: каков наилучший способ изменить эту таблицу с минимальными помехами для моих пользователей?
Изменить: таблица InnoDB.
источник
Ответы:
Если вы немного любите приключения, вы можете взять дело в свои руки, выполнив ALTER TABLE поэтапно, как вы можете видеть. Предположим, таблица, которую вы хотите изменить, называется WorkingTable. Вы можете выполнить изменения поэтапно:
Вы можете выполнить это на всех рабов. Как насчет мастера ??? Как вы мешаете этому реплицироваться на рабов. Просто: не отправляйте SQL в двоичные журналы мастера. Просто отключите бинарное ведение журнала в сеансе, прежде чем выполнять функцию ALTER TABLE:
Но ждать !!! Как насчет любых новых данных, которые появляются при обработке этих команд ??? Переименование таблицы в начале операции должно помочь. Давайте немного изменим этот код, чтобы не вводить новые данные в этом отношении:
Попробуйте!
источник
Я предполагаю из документации , что простое увеличение ограничения длины
varchar
не вызовет таких же проблем, как добавление столбца:Но это , кажется, противоречит в комментариях по этому С.О. вопросу.
РЕДАКТИРОВАТЬ
По крайней мере, на 5.0, я думаю, я могу подтвердить, что увеличение длины действительно требует временной таблицы (или какой-либо другой столь же дорогой операции):
Testbed:
результат:
источник
Я думал, я бы упомянул, что с
ENGINE=INNODB
Если у вас есть ограничения внешнего ключа, вы не можете изменять и переименовывать без ограничений, указывающих на старую таблицу (теперь переименованную). Вам придется изменить потом или отбросить ограничения на время.
источник