Что произойдет, если вы убьете долго выполняющийся запрос на изменение?

Что произойдет, если вы убьете долго выполняющийся запрос на изменение? Будет ли измененный запрос просто возвращаться? Сколько времени это может занять (по отношению к тому времени, когда он уже работает)?

Что, если этот запрос реплицируется на другой сервер? Будет ли уничтожение процесса на другом сервере возвращать запрос на изменение исходного сервера?

Мы запускаем mysql


person B T    schedule 28.04.2010    source источник
comment
Ха-ха, извините, у меня в голове возник веселый образ кучки инженеров, сгрудившихся вокруг монитора, вглядывающихся сквозь потные брови в этот пост — просто ожидающих ответа — в то время как сервер mysql на заднем плане начинает дымиться.   -  person Peter Bailey    schedule 28.04.2010
comment
ха-ха, нам пришлось подождать, пока запрос не завершится. Но было бы неплохо узнать в следующий раз.. не дай бог   -  person B T    schedule 28.04.2010
comment
Ну вот и я. Я был в деле, когда была сделана копия, так что остановить это было нормально, но пришлось попотеть. Слава богу, это не было в производстве, но блокировка записи печально известна.   -  person Aki    schedule 13.01.2014


Ответы (2)


Это зависит от того, что вы делаете. Если вы запускаете команду an alter table...add index для таблицы InnoDB (не совсем уверен насчет MyISAM), то она будет просто выполняться и выполняться, поскольку сначала копирует всю чертову таблицу с замком-прикладом и стволом: если она находится в середине «копировать к временной таблице», то это практически невозможно остановить.

См. здесь:

В большинстве случаев ALTER TABLE работает, создавая временную копию исходной таблицы. Изменение выполняется на копии, затем исходная таблица удаляется, а новая переименовывается. Во время выполнения ALTER TABLE исходная таблица доступна для чтения другими сеансами. Обновления и записи в таблицу приостанавливаются до тех пор, пока новая таблица не будет готова, а затем автоматически перенаправляются в новую таблицу без каких-либо неудачных обновлений.

person davek    schedule 28.04.2010
comment
Похоже, что в нашем случае временная таблица не нужна, но похоже, что наши таблицы все еще заблокированы, наши открытые соединения резко увеличились, и у нас был сбой на 5-10 минут. Если мы уничтожим запрос, который не создает копию... что тогда? - person B T; 29.04.2010
comment
@BT: Почему временная таблица не была создана, каков ваш конкретный случай? - person Aki; 13.01.2014
comment
Кстати, я убил процесс во время копирования во временную таблицу, он снял блокировку записи, и данные все еще были там и доступны. Я понятия не имею, куда делась временная копия. - person Aki; 13.01.2014
comment
Временная копия отсоединяется, когда ALTER прерывается. - person dland; 26.01.2016

Что, если этот запрос реплицируется на другой сервер?

ALTER также будет выполняться на этом сервере с соответствующими последствиями.

Будет ли уничтожение процесса на другом сервере возвращать запрос на изменение исходного сервера?

Неа. Исходный сервер не имеет обратного канала, чтобы узнать, что произошло (или не произошло) на ведомом устройстве. Если вы убьете ALTER на ведомом устройстве, вы окажетесь в ситуации, когда у ведущего есть новое ограничение или индекс, а у ведомого — нет. Редкий рецепт счастья :)

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

person dland    schedule 26.01.2016