MySQL Optimizing для ALTER TABLE InnoDB

Как указано в задаче 6583 CLI для точечной рассылки , проблема должна быть решена с помощью команды dotnet nuget locals --clear all.

29
задан schuilr 17 March 2009 в 14:56
поделиться

4 ответа

Необходимо думать о требованиях немного более тщательно.

На самом простом уровне, "самый быстрый" способ изменить таблицу состоит в том, чтобы выполнить в нем как можно меньше ALTER TABLE операторы, предпочтительно один. Это вызвано тем, что MySQL копирует данные таблицы для изменения схемы и внесения пятнадцати изменений, пока делают единственную копию, очевидно (и действительно), быстрее, чем копирование таблицы пятнадцать раз, внося одно изменение за один раз.

, Но я подозреваю, что Вы спрашиваете, как сделать это изменение с наименьшим количеством суммы времени простоя. Путем я сделал бы это, Вы в основном синтезируете способ, которым работал бы неблок ALTER TABLE. Но это имеет некоторые дополнительные требования:

  1. Вам нужен способ отследить добавленные и измененные данные, такой как с "измененным" полем даты для последнего, или AUTO_INCREMENT поле для первого.
  2. Вы должны расположить с интервалами, чтобы иметь две копии Вашей таблицы на базе данных.
  3. Вам требуется период времени, где изменения к таблице не доберутся также далеко впереди снимка

, основная техника - как Вы предположили, т.е. использование INSERT INTO ... SELECT .... По крайней мере, Вы впереди, потому что Вы запускаете с таблицы InnoDB, таким образом, эти SELECT не заблокируется. Я рекомендую делать ALTER TABLE на новой, пустой таблице, которая сохранит MySQL, копируя все данные снова, которые будут означать, что необходимо перечислить все поля правильно в INSERT INTO ... SELECT ... оператор. Тогда можно сделать простое RENAME оператор для свопинга его. Тогда необходимо сделать другой INSERT INTO ... SELECT ... WHERE ... и возможно UPDATE ... INNER JOIN ... WHERE ... для захвата всех измененных данных. необходимо сделать INSERT и UPDATE быстро , или код будет, перейдя на добавляющие новые строки и обновления снимка, который будет вмешиваться в обновление. (У Вас не будет этой проблемы, если можно поместить приложение в maintenence режим в течение нескольких минут до RENAME.)

Кроме этого, существуют некоторые ключевые и связанные с буфером настройки, которые можно изменить всего для одной сессии, которая может помочь основным данным переместиться. Вещи как [1 113] и read_buffer_size были бы полезны для увеличения.

15
ответ дан staticsan 14 October 2019 в 08:07
поделиться

Я действительно не знаю, как оптимизировать это, но это обычно - хорошая практика для помещения сайта в режим офлайн прежде, чем сделать такие обновления.

Затем можно выполнить сценарии DB в, скажем, 3:00, таким образом, это не должно иметь значения очень если время простоя большое дольше, чем идеал.

-4
ответ дан Seb 14 October 2019 в 08:07
поделиться

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

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

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

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

11
ответ дан 28 November 2019 в 01:30
поделиться
  1. Настроить подчиненное устройство
  2. Остановить репликацию.
  3. Сделать ALTER на подчиненном
  4. Разрешить подчиненному устройству догнать главного
  5. поменять местами главный и подчиненный, так что подчиненный становится производственным сервером с измененной структурой и минимальное время простоя
12
ответ дан 28 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: