Понимание глобальных блокировок MySQL и блокировок на уровне таблиц
глобальная блокировка
- Заблокировать весь экземпляр базы данных
- Сценарий использования: при выполнении полного логического резервного копирования базы данных, чтобы гарантировать, что база данных во время резервного копирования находится в одном и том же логическом моменте времени, то есть согласованное представление (аналогично эффекту уровня изоляции повторяемого чтения)
Существует два способа глобальной блокировки:
- Flush tables with read lock(FTWRL)База данных находится в состоянии только для чтения, и добавление, удаление и изменение данных, операторы определения данных и операторы фиксации для транзакций обновления будут заблокированы.
- mysqldumpОфициальный встроенный инструмент логического резервного копирования, параметры-single-transactionНачнет транзакцию перед импортом данных, чтобы обеспечить согласованное представление
Различия между двумя вышеуказанными методами заключаются в следующем:
использоватьmysqldumpпредпосылкаДвижок поддерживает уровень изоляции,такsingle-transactionМетоды доступны только для библиотек, поддерживающих механизмы транзакций; MyISAM не поддерживает транзакции, поэтому можно использовать только команды FTWRL.
set global readonly = true
Этот оператор также может сделать всю библиотеку доступной только для чтения, но использовать ее не рекомендуется:
- Иногда для определения того, является ли библиотека основной или резервной библиотекой, используется только чтение, поэтому способ изменения глобальной переменной будет иметь большее значение.
- С точки зрения обработки исключений: после FTWRL клиент аварийно отключится, MySQL автоматически снимет глобальную блокировку, и библиотека вернется в нормальное состояние; если установлен режим только для чтения, если клиент ненормальный, он останется только для чтения, что приведет к в долгосрочное недоступное для записи состояние, и риск высок.
В любом из приведенных выше методов после глобальной блокировки библиотеки любая таблица на противоположной стороне будет заблокирована при выполнении полевых операций.
Даже если глобальной блокировки нет, с блокировками на уровне таблицы при добавлении полей возникнут проблемы.
блокировка на уровне стола
MySQL имеет две блокировки на уровне таблицы: одна блокировка таблицы, а другая блокировка метаданных (MDL).
Синтаксис блокировок на уровне таблицы:lock tables xxx read/write
Например, поток A выполняетlock table t1 read,t2 write
эффектВсе потоки, включая поток A, могут только читать таблицу t1, а запись заблокирована; чтение и запись таблицы t2 заблокированы.
Операция блокировки таблиц может быть активно разблокирована с помощью таблиц разблокировки или автоматически разблокирована при отключении клиента.
Эта операция не только блокирует работу других потоков, но и блокирует работу текущего потока.
Для механизма, такого как innoDB, который поддерживает блокировки строк, он обычно не используется.lock tables
Параллелизм командного управления, влияние слишком велико
Еще одна блокировка на уровне таблицы:MDL(metadata lock)
MDL автоматически добавляется при доступе к таблице, роль MDL заключается в обеспечении корректности чтения и записи. При добавлении, удалении, изменении и проверке таблицы добавить блокировку чтения MDL, при изменении структуры таблицы добавить блокировку записи MDL.
- Блокировки чтения не являются взаимоисключающими, и несколько потоков могут добавлять, удалять, изменять и запрашивать одну и ту же таблицу.
- Взаимное исключение между блокировками чтения-записи и блокировками записи. Если два потока одновременно добавляют поля в таблицу, второму необходимо дождаться завершения выполнения первого, прежде чем продолжить.
- Блокировки MDL применяются в начале выполнения оператора и снимаются после завершения транзакции.
Как безопасно добавить поля в маленький замок
- Чтобы решить длинную транзакцию, если измененная таблица DDL просто выполняет длинную транзакцию, найдите текущую исполнительную длинную транзакцию из innodb_trx библиотеки information_schema, сначала уничтожьте длинную транзакцию или приостановите DDL.
- Идеальное состояние: измените таблицу изменений структуры таблицы, чтобы установить время ожидания.Если блокировка MDL не может быть получена в течение этого времени, блокировка MDL не может быть получена в течение этого времени, и выполнение будет прекращено без блокировки следующего оператора.
MariaDB/ALiSQL уже поддерживаетсяDDL NOWAIT/WAIT n
этот синтаксис
alter table tb1_name NOWAIT add column...
alter table tb1_name WAIT N add column...
Суммировать
Для библиотек, использующих движок innoDB, рекомендуется использовать параметр --single-transaction, который более удобен для приложений.
Эта статья для гиков«45 практических лекций по MySQL»Учебные заметки, которые содержат часть исходного текста, если есть какое-либо нарушение, пожалуйста, свяжитесь со мной, чтобы немедленно удалить его.