8.11.5 Внешняя блокировка
Внешняя блокировка — это использование блокировок файловой системы для управления конфликтами доступа к таблицам базы данных MyISAM несколькими процессами. Внешняя блокировка используется в ситуациях, когда нельзя гарантировать, что один процесс, например, сервер MySQL, является единственным процессом, которому требуется доступ к таблицам. Вот некоторые примеры:
Если вы запускаете несколько серверов, использующих один и тот же каталог базы данных (не рекомендуется), каждый сервер должен иметь включенную внешнюю блокировку.
-
Если вы используете myisamchk для выполнения операций обслуживания таблиц с таблицами
MyISAM, вы должны либо убедиться, что сервер не запущен, либо убедиться, что сервер имеет включенную внешнюю блокировку, чтобы он блокировал файлы таблиц по мере необходимости для координации с myisamchk при доступе к таблицам. То же самое относится к использованию myisampack для упаковки таблицMyISAM.Если сервер запущен с включенной внешней блокировкой, вы можете использовать myisamchk в любое время для операций чтения, например, для проверки таблиц. В этом случае, если сервер пытается обновить таблицу, которую использует myisamchk, сервер ждет, пока myisamchk не завершит работу, прежде чем продолжить.
Если вы используете myisamchk для операций записи, таких как ремонт или оптимизация таблиц, или если вы используете myisampack для упаковки таблиц, вы обязательно должны убедиться, что сервер mysqld не использует таблицу. Если вы не останавливаете mysqld, по крайней мере, выполните mysqladmin flush-tables перед запуском myisamchk. Ваши таблицы могут быть повреждены, если сервер и myisamchk обращаются к таблицам одновременно.
При включенной внешней блокировке каждый процесс, которому требуется доступ к таблице, приобретает блокировку файловой системы для файлов таблицы, прежде чем приступить к доступу к таблице. Если все необходимые блокировки не могут быть получены, процесс блокируется от доступа к таблице до тех пор, пока блокировки не будут получены (после того, как процесс, который в настоящее время удерживает блокировки, их освободит).
Внешняя блокировка влияет на производительность сервера, потому что серверу иногда приходится ждать других процессов, прежде чем он сможет получить доступ к таблицам.
Внешняя блокировка не требуется, если вы запускаете один сервер для доступа к заданному каталогу данных (что обычно и делается) и если другие программы, такие как myisamchk, не нуждаются в изменении таблиц во время работы сервера. Если вы только читаете таблицы другими программами, внешняя блокировка не требуется, хотя myisamchk может сообщать об ошибках, если сервер изменяет таблицы во время чтения myisamchk.
При отключенной внешней блокировке для использования myisamchk, вы должны либо остановить сервер во время выполнения myisamchk, либо заблокировать и очистить таблицы перед запуском myisamchk. (См. Раздел 8.12.1, «Системные факторы».) Чтобы избежать этого требования, используйте операторы CHECK TABLE и REPAIR TABLE для проверки и ремонта таблиц MyISAM.
Для mysqld внешняя блокировка контролируется значением системной переменной skip_external_locking. Когда эта переменная включена, внешняя блокировка отключена, и наоборот. Внешняя блокировка отключена по умолчанию.
Использование внешней блокировки можно контролировать при запуске сервера, используя параметр --external-locking или --skip-external-locking.
Если вы используете параметр внешней блокировки для включения обновлений таблиц MyISAM многими процессами MySQL, вы должны убедиться, что выполнены следующие условия:
Не используйте кэш запросов для запросов, использующих таблицы, которые обновляются другим процессом.
Не запускайте сервер с системной переменной
delay_key_write, установленной в значениеALL, или не используйте параметр таблицыDELAY_KEY_WRITE=1для любых общих таблиц. В противном случае может произойти повреждение индексов.
Самый простой способ удовлетворить этим условиям — всегда использовать --external-locking вместе с --delay-key-write=OFF и --query-cache-size=0. (Это не делается по умолчанию, потому что во многих настройках полезно иметь комбинацию указанных выше параметров.)
© 2025 Oracle
Licensed under the GPLv2 License.