Одновременность MySQL: блокировки и транзакции для разработчиков и DBA MySQL

Джеспер Висборг Крог

 Состав исполнителей

Издания на английском языке
Автор
Джеспер Висборг Крог
Директор- распорядитель, Apress Media LLC
Велмоуид Спахр
Редактор приобретения
Джонатан Генник
Редактор по разработке
Лаура Вирендсон
Координирующий редактор
Джил Больцано
Разработка обложки
Freepik
www.freepik.com

Моей жене, Анне- Маргарите - Спасибо за участие и поддержку.

 Об авторе

 


Джеспер Висборг Крог работал с базами данных MySQL начиная с 2006 и как разработчик, и как администратор базы данных, а на протяжении более чем 8 лет как часть Команды поддержки Oracle MySQL. В настоящее время он работает в качестве инженера по надёжности баз данных для Okta. Он выступает на MySQL Connect, Oracle OpenWorld и Oracle Developer Live во многих случаях. Дополнительно к своим книгам Джеспер постоянно ведёт блоги по темам MySQL и является автором более чем 800 документов в Oracle Knowledge Base. Он внёс свой вклад в схему sys и в четыре экзамена Oracle Certified Professional (OCP) для MySQL 5.6–8. Джеспер обладает степенью доктора философии в вычислительной химии; проживает в Сиднее, Австралия; получает удовольствие от проведения времени в прогулках вне дома, путешествиях и от чтения. Его экспертные области включают в себя MySQL Cluster, MySQL Enterprise Backup (MEB), настройку производительности, а также схемы производительности и sys.

 О рецензенте

 


Чарльз Белл проводит исследования в области новейших технологий. Он является участником команды разработчиков Oracle MySQL и старшим разработчиком для команды Корпоративного резервного копирования MySQL. Он живёт в небольшом городке в сельской местности в Вирджинии со своей любящей супругой. Он получил степень доктора философии в области инженерии в Университете Содружества Вирджинии в 2005.

Чарльз является экспертом в области баз данных и обладает обширными познаниями в разработке программного обеспечения и системной инженерии. Его исследовательские интересы включают в себя 3D печать, микроконтроллеры, системы с высокой доступностью, облачные решения и сенсорные сети. Своё ограниченное свободное время он проводит как практикующий Творец, уделяя особое внимание проектам микроконтроллеров и улучшения трёхмерных принтеров.

 Благодарности

Прежде всего, я бы хотел поблагодарить всех тех из команды Appress, кто сделал возможной эту книгу. В частности, я бы хотел поблагодарить Джонатана Генника, который придумал саму идею, Джилл Бальцано, которая координировала эту работу, Лауру Берендсон за её закулисную работу и Креапзилин Рома за то, что она уловила лингвистические ошибки.

Те знания, которыми мы поделились в этой книге возникли не на пустом месте. Благодарю Чарльза Белла за предоставление - как всегда - тщательного обзора с конструктивными отзывами и предложения улучшений. Якуб Лопушанский был полезен подробностями блокировок InnoDB. Я бы также хотел поблагодарить всех своих колег, которые на протяжении многих лет, через их наставничество, были частью моего путешествия по изучению того как работает MySQL, обучая меня, задавая мне хорошие вопросы, а также через общие рассуждения. Особая благодарность за их помощь Эдвину Десуза и Фре́де́рику Декампу (более известному как Лефред).

И последнее, но не менее важное: спасибо моей жене Анн-Маргарите за её терпение и поддержку при написании этой книги. Без тебя было бы невозможно написать эту книгу.

 Введение

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

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

 Аудитория книги

Эта книга была написана для разработчиков и администраторов базы данных, которые обладают опытом работы с MySQL и хотели бы расширить свои познания относительно того как работают блокировки и транзакции в царстве одновременности MySQL.

 Примеры и GitHub репозиторий книги

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

В репозитории GitHub этой книги были добавлены длинные примеры, либо те, что производят длинный или обширный вывод. Здесь также содержатся рисунки, которые могут оказаться трудными для прочтения по причине того размера рисунка, который позволяет формат печатной страницы.

[Замечание]Замечание

Саму ссылку на этот репозиторий можно обнаружить на домашней странице книги. Её также можно отыскать непосредственно на GitHub.

В GitHub репозиторий этой книги также был включён написанный на Python модуль для его применения в Оболочке MySQL для упрощения воспроизведения всех примеров и предоставления образцов запросов, который можно применять для изучения той задачи, которую демонстрирует конкретный тест. Базовая установка и инструкции по использованию приводятся в Главе 1 и документированы полностью в Дополнении B.

GitHub также станет пристанищем для всех ошибок в этой книге после её создания. Я буду пользоваться этими перечнем ошибок не только для сообщения об ошибках в самой книге, но также для предоставления обновлений при исправлении ошибок и новых функциональных возможностях MySQL 8, приводящих к изменениям в содержимом книги. Когда это потребуется, я также обновлю сами примеры в этом репозитории чтобы отражать изменения поведения в более новых выпусках. По этим причинам я рекомендую вам следить за данным репозиторием.

 Структура книги

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

Книга подразделяется на восемнадцать глав и два Дополнения. Глава 1 предоставляет некое введение. Главы 2 - 4 охватывают мониторинг блокировок и транзакций. Главы 5 - 10 обсуждают блокировки. Главы 11 - 12содержат сведения о транзакциях, а заключительные Главы 13 - 18 проходят через шесть вариантов применения. Дополнения содержат справочные сведения относительно мониторинга блокировок и транзакций, а также о предоставляемого в этой книге модуля Оболочки MySQL.

  • Глава 1, Введение: Эта вводная глава охватывает некоторые положения верхнего уровня, а также служит введением в модуль Оболочки MySQL для воспроизведения тех примеров и проверочных данных, которые имеются в этой книге.

  • Глава 2, Мониторинг блокировок и взаимных исключений: Данная глава покрывает то как вы можете отслеживать блокировки при помощи схемы Производительности, схемы sys, счётчиков состояния и метрик InnoDB. Также имеются сведения относительно того как пользоваться монитором блокировок InnoDB и сведениями о взаимных блокировках в мониторе InoD, а также как получать сведения относительно состязательности взаимных исключений и семафоров.

  • Глава 3, Мониторинг транзакций InnoDB: Эта глава в первую очередь показывает как вы можете пользоваться представлением information_schema.INNODB_TRX для расследования транзакций InnoDB. Также обсуждаются собственно список транзакций в мониторе InnoDB и связанные с транзакциями метрики InnoDB.

  • Глава 4, Транзакции в схеме Производительности: Данная глава продолжает с того места, на котором завершилась предыдущая, проходя через сведения о конкретной транзакции в Схеме Производительности и то как вы можете отыскивать соответствующие операторы для некой транзакции.

  • Глава 5, Уровни блокировок доступа: Эта глава следует через совместные, исключительные блокировки и блокировки намерений, а также показывает какие из них совместимы друг с другом.

  • Глава 6, Типы блокировок верхнего уровня: В отой главе рассматриваются те блокировки, которые работают на более высоком уровне нежели записи. В основном это блокировки, обрабатываемые вне сферы действия самих механизмов хранения и содержат блокировки уровня пользователя, блокировки метаданных, сбрасывающих блокировок и блокировки уровня таблиц. Также включены новые для MySQL 8 блокировки резервного копирования и журналирования.

  • Глава 7, Блокировки InnoDB: Данная глава следует применяемыми InnoDB блокировками записей. Они включают в свой состав блокировки простых записей, блокировки промежутка, блокировки предикатов, блокировки намерений вставки, а также взаимные исключения и семафоры блокировок RW.

  • Глава 8, Работа с конфликтами блокировок: В этой главе поясняется что происходит когда случается конфликт блокировок на примере обсуждения CATS (планирования транзакций осведомлённых о состязательности), применяемых внутри блокировок с приоритетами и обсуждения совместимости блокировок для таймаутов ожидания блокирования и взаимного блокирования.

  • Глава 9, Снижение проблем блокираний: Данная глава обсуждает как можно снижать состязательность блокировок и собственно воздействие состязательности в вашей системе. Методы включают снижение размера и возраста самих транзакций при помощи индексации, доступа к записям в том же самом порядке для одновременных задач, изменения значения уровня изоляции транзакции и прочего.

  • Глава 10, Индексы и внешние ключи: Эта глава подробно рассматривает воздействие индексации и внешних ключей на блокирование. Требуют ли уникальные индексы меньше блокировок по сравнению с не уникальной индексацией? Действительно ли внешние ключи вызывают большее число блокировок? Ответом является да, а данная глава почему это имеет место и предоставляет примеры имеющихся отличий.

  • Глава 11, Транзакции: В этой главе обсуждается то, чем являются транзакции и как они способствуют обработке одновременных рабочих потоков. Данная глава также охватывает собственно воздействие транзакцию и то как функциональная возможность групповой фиксации способствует снижению влияния продолжающихся транзакций фиксации.

  • Глава 12, Уровни изоляции транзакции: Данная глава проходит через поддерживаемых InnoDB четыре уровня изоляции транзакций посредством обсуждения того как каждый уровень воздействует на блокирование и согласованность данных.

  • Глава 13, Пример использования: блокировки сброса: В этой главе устанавливается определённая база данных, а потому возникает состязательность блокировки сброса, а затем она следует через анализ данной проблемы и предоставление некого решения с обсуждением того как предотвращать такую проблему.

  • Глава 14, Пример использования: блокировки метаданных и схемы: В данной главе рассматривается ещё одна распространённая проблема блокировки на примере изучения ситуации с блокированием метаданных.

  • Глава 15, Пример использования: блокировки уровня записи: Эта глава предпринимает некое расследование в блокировках уровня записи InnoDB и обсуждает как разрешить такую проблему блокировки и снижать вероятность встречи с ней.

  • Глава 16, Пример использования: взаимные блокировки: Данная глава следует расследованию взаимной блокировки при помощи подробностей анализа конкретных сведений относительно взаимной блокировки из вывода монитора InnoDB.

  • Глава 17, Пример использования: внешние ключи: В этой главе охватывается сценарий некой расширенной блокировки, вызываемой внешними ключами, включая и блокировки метаданных и блокировки записей InnoDB.

  • Глава 18, Пример использования: семафоры: Данная глава настраивает некий вариант проверки включения состязательности семафоров и осуществляет расследование этой проблемы.

  • Дополнение A: Справочные сведения: Это Дополнение предоставляет некий обзор ресурсов для поиска сведений, относящихся к обсуждаемым в этой книге темам. Эти ресурсы в первую очередь состоят из таблиц в Схеме Производительности и представлений в схеме sys, включая все возможные значения в столбцах OBJECT_TYPE и LOCK_TYPE таблицы performance_schema.metadata_locks. Включены также некоторые ресурсы Информационной Схемы, а также имеется список разделов в конкретном вывода из монитора InnoDB.

  • Дополнение B: Модуль оболочки MySQL: Данное Дополнение является справочными сведениями для модуля Python, включённого в эту книгу. Оно содержит обсуждение того как устанавливать и применять такой модуль, а также как организован его код на тот случай, если вы пожелаете расширить его на свои собственные рабочие потоки.

 Содержание

О книге
Состав исполнителей
Об авторе
О техническом рецензенте
Благодарности
Введение
Глава 1. Введение
Зачем нужны блокировки
Уровни блокирования
Блокировки и транзакции
Примеры
Предварительные требования для Модуля concurrency_book.generate
Установка Модуля concurrency_book.generate
Сбор сведений
Загрузка данных проверки
Выполнение рабочей нагрузки
Данные проверки: Схема мира
Схема
Установка
Данные проверки: Схема sakila
Схема
Установка
Данные проверки: Схема служащих
Схема
Установка
Выводы
Глава 2. Мониторинг блокировок и взаимных исключений
Схема Производительности
Блокировки метаданных и таблиц
Блокировка данных
Ожидание синхронизации
Таблицы операторов и ошибок
Схема sys
Счётчики состояния и Метрики InnoDB
Запрос данных
Настройка Метрик InnoDB
Монитор блокировок InnoDB и регистрация взаимных блокировок
Взаимные исключения и семафоры InnoDB
Выводы
Глава 3. Мониторинг транзакций InnoDB
Информационная схема INNODB_TRX
Монитор InnoDB
INNODB_METRICS и sys.metrics
Выводы
Глава 4. Транзакции в схеме Производительности
События транзакции и их операторы
Сводные таблицы транзакции
Выводы
Глава 5. Уровни блокировок доступа
Совместные блокировки
Исключающие блокировки
Блокировка намерений
Совместимость блокировок
Выводы
Глава 6. Типы блокировок верхнего уровня
Блокировки уровня пользователя
Блокировки сброса
Блокировки метаданных
Явные блокировки таблиц
Неявные блокировки таблиц
Блокировки резервного копирования
Блокировки журнала
Выводы
Глава 7. Блокировки InnoDB
Блокировки записи и блокировки следующего ключа
Блокировки промежутка
Блокировки предиката и страницы
Блокировки намерения вставки
Блокировки автоматического приращения
Взаимные исключения и семафоры блокировки RW
Выводы
Глава 8. Работа с конфликтами блокировок
Планирование осведомлённых о состязательности транзакций (CATS)
Совместимость блокировок InnoDB
Ожидание таймаутов метаданных и блокировки резервного копирования
Ожидание таймаутов блокировки InnoDB
Взаимные блокировки
Ожидание взаимного исключения и семафоров InnoDB
Выводы
Глава 9. Снижение проблем блокирований
Размер и возраст транзакции
Индексы
Порядок доступа к записи
Уровни изоляции транзакции
Настройка
Разбиение ресурса на разделы
Отключение адаптивного индекса хэширования InnoDB
Снижение приоритета блокировок записи метаданных
Вытесняющее блокирования
Выводы
Глава 10. Индексы и внешние ключи
Индексы
Сопоставление первичных и вторичных индексов
Сопоставление восходящей и нисходящей индексаций
Уникальная индексация
Внешние ключи
Оператор DML
Оператор DDL
Выводы
Глава 11. Транзакции
Транзакции и ACID
Атомарность
Согласованность
Изоляция
Длительность
Воздействие транзакций
Блокировки
Отмена журнала
Групповая фиксация
Выводы
Глава 12. Уровни изоляции транзакции
Упорядочиваемость
Повторяемое считывание
Фиксированное считывание
Считывание без фиксации
Выводы
Глава 13. Пример использования: блокировки сброса
Симптомы
Повод
Настройка
Расследование
Решение
Предохранение
Выводы
Глава 14. Пример использования: блокировки метаданных и схемы
Симптомы
Повод
Настройка
Расследование
Решение
Предохранение
Выводы
Глава 15. Пример использования: блокировки уровня записи
Симптомы
Повод
Настройка
Расследование
Решение
Предохранение
Выводы
Глава 16. Пример использования: взаимные блокировки
Симптомы
Повод
Настройка
Расследование
Решение
Предохранение
Выводы
Глава 17. Пример использования: внешние ключи
Настройка
Обсуждение
Ошибки и мониторинг верхнего уровня
Метрики блокировок
Состязательные блокировки метаданных
Состязательные блокировки InnoDB
Решение и предохранение
Выводы
Глава 18. Пример использования: семафоры
Симптомы
Повод
Настройка
Расследование
Метрики блокировки RW InnoDB
Монитор InnoDB и монитор взаимного исключения
Определение значения рабочей нагрузки
Решение и предохранение
Отключение адаптивного хеширования индекса
Увеличение общего числа частей хеширования индекса
Прочие решения
Выводы
Дополнение A: Справочные сведения
Таблицы и представления
Сведения блокировки
Типы объекта метаданных
Типы блокировки метаданных
Сведения транзакции
Сведения оператора
Сведения ожидания
Сведения таблицы ввода/ вывода
Сведения файла ввода/ вывода
Сведения ошибки
Переменные состояния и метрики InnoDB
Разделы монитора InnoDB
Дополнение B: Модуль оболочки MySQL
Предварительные требования
Установка
Методы help() и show()
Загрузка проверочных данных
Выполнение рабочей нагрузки
Структура модуля
Файлы библиотеки
Каталог рабочих нагрузок
Определение рабочей нагрузки
Глобальные ключи
Запросы и состязательность
Расследования
Выводы
Указатель