Следующий запрос состоит из изменений, которые каждый должен разрешать параллельный DML:
ALTER TABLE sometable
DROP INDEX index1_on_column1,
DROP INDEX index2_on_column2,
DROP INDEX index3_on_column1_and_column2,
DROP COLUMN column1,
DROP COLUMN column2;
В таблице содержится около 80 миллионов записей. Когда я запускал запрос, он выглядел как заблокированный доступ/блокировка.
Кто-нибудь знает, почему/как это заблокировало бы таблицу?
Добавление явного LOCK=NONE
должно привести к тому, что это можно сделать (или выбросить ошибку, если оно не удается), но из документов не видно, что это обязательная инструкция для предотвращения блокировки.
Итак, в принципе, без объяснения LOCK=NONE
вы не можете быть уверены в том, как MySql решит выполнить изменение DML. Если он не может действовать без блокировки, и вы указываете LOCK=NONE
вы получите сообщение об ошибке при выполнении команды, но если вы не укажете LOCK=NONE
и блокировки будут отброшены, это в основном приведет к тому, что Mysql выполнит изменить таблицу.
Для больших таблиц вы должны использовать параллельную копию, чтобы избежать блокировки записи. Даже если чтение разрешено, весь процесс может быть заблокирован из-за одной записи.
Такие инструменты, как Percona Toolkit, великолепны. Я использовал его на таблицах 2GB (InnoDB с внешними ключами), восстановление потребовалось 3-5 минут, но таблица была недоступна всего за несколько секунд.