MySQL 5.6 - таблица блокируется, даже когда используется ALGORITHM = inplace - PullRequest
0 голосов
/ 13 февраля 2019

Я запускаю следующую команду ALTER для базы данных MySQL 5.6 в большой таблице с 60 миллионами строк:

ALTER TABLE `large_table` ADD COLUMN `note` longtext NULL, 
ALGORITHM=INPLACE, LOCK=NONE;

Несмотря на указание ALGORITHM=INPLACE и LOCK=NONE, таблица получаетзаблокирован и, по сути, закрывает приложение до завершения миграции.

Я проверил, что таблица действительно была заблокирована, проверив значение столбца In_use на выходе команды SHOW OPEN TABLES.Это было установлено на 1.

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

Это ожидаемое поведение?Как мне узнать, что здесь происходит не так?

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

У меня также были проблемы с блокировкой MySQL 5.6, даже когда используется ALGORITHM=INPLACE, LOCK=NONE;.Сначала я бы проверил следующее:


Проверить ограничения для таблицы

Предложение ALTER TABLE LOCK = NONE не разрешено, если есть ON ... CASCADEили ON ... SET NULL ограничения для таблицы.

Источник: https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations.html


Имеет ли таблица отношение внешнего ключа?

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

Источник: https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations.html

И прочтите о блокировке метаданных здесь: https://dev.mysql.com/doc/refman/5.6/en/metadata-locking.html


Сначала измените таблицы из старого формата времени

Если вы создали таблицы до MySQL 5.6 с полями DATETIME или TIMESTAMP, их необходимо обновить до версии MySQL 5.6 newformat.

Таблицы InnoDB, созданные до MySQL 5.6, не поддерживают ALTER TABLE ... ALGORITHM = INPLACE для таблиц, которые содержат временные столбцы (DATE, DATETIME или TIMESTAMP) и не были перестроены с использованием ALTER TABLE... АЛГОРИТМ = КОПИЯ.В этом случае операция ALTER TABLE ... ALGORITHM = INPLACE возвращает следующую ошибку:

ОШИБКА 1846 (0A000): ALGORITHM = INPLACE не поддерживается.Причина: невозможно изменить тип столбца INPLACE.Попробуйте ALGORITHM = COPY.

Источник: https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations.html


Проверьте, имеет ли таблица Разделение

Разделение изменяет, как изменитьприменяются правила столаПроверьте статус разделения таблицы

show table status;

Ищите «Двигатель», не равный InnoDB

Источники: https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html#online-ddl-partitioning


Наконец, какРик Джеймс в своем ответе упомянул, что обновление с 5.6 до 8.0 может быть вариантом, поскольку оно обеспечивает другие улучшения.

0 голосов
/ 18 февраля 2019

Я предполагаю, что вы не выполняли какой-либо другой DDL для этой таблицы в то же время?

На будущее:

8.0.12 имеет ALTER TABLE .. ALGORITHM=INSTANT для ADD COLUMN.См. Обсуждение и ALTER Reference и Online DDL Reference

При использовании алгоритма INSTANT для добавления столбца применяются следующие ограничения:

  • Добавление столбца нельзя объединить в одном выражении с другими действиями ALTER TABLE, которые не поддерживают ALGORITHM = INSTANT.
  • Столбец можно добавить только как последний столбец таблицы.Добавление столбца в любую другую позицию среди других столбцов не поддерживается.
  • Невозможно добавить столбцы в таблицы, в которых используется ROW_FORMAT = COMPRESSED.
  • Невозможно добавить столбцы в таблицы, содержащие индекс FULLTEXT.
  • Столбцы нельзя добавлять во временные таблицы.Временные таблицы поддерживают только ALGORITHM = COPY.
  • Невозможно добавить столбцы в таблицы, которые находятся в табличном пространстве словаря данных.
  • При добавлении столбца ограничения размера строки не оцениваются.Однако ограничения размера строки проверяются во время операций DML, которые вставляют и обновляют строки в таблице.

В одном выражении ALTER TABLE можно добавить несколько столбцов.

Если вы можете 't модернизируйте, а затем подумайте о pt-online-schema-change от Percona или о новом конкурирующем продукте gh-ost (который использует binlog).

...