5.1.11.2 DNS-запросы и кэш хостов
Сервер MySQL поддерживает кэш хостов в оперативной памяти, содержащий информацию о клиентах: IP-адрес, имя хоста и сведения об ошибках. Таблица host_cache Схемы производительности содержит данные кэша хостов, которые можно просмотреть с помощью операторов SELECT. Это может помочь в диагностике причин проблем с подключением. См. Раздел 25.12.16.1, «Таблица host_cache».
В следующих разделах рассматриваются механизм работы кэша хостов, а также другие темы, такие как настройка и мониторинг кэша.
Работа кэша хостов
Сервер использует кэш хостов только для нелокальных TCP-соединений. Он не использует кэш для TCP-соединений, установленных с использованием адреса интерфейса обратной связи (например, 127.0.0.1 или ::1), или для соединений, установленных с использованием файла Unix-соккета, именованной трубы или общей памяти.
Сервер использует кэш хостов для нескольких целей:
Кэшируя результаты преобразования IP-адресов в имена хостов, сервер избегает выполнения DNS-запроса для каждого подключения клиента. Вместо этого для данного хоста ему требуется выполнить поиск только для первого подключения с этого хоста.
Кэш содержит информацию об ошибках, возникающих во время процесса подключения клиента. Некоторые ошибки считаются «блокирующими». Если такие ошибки происходят слишком часто от данного хоста без успешного подключения, сервер блокирует дальнейшие подключения с этого хоста. Значение системной переменной
max_connect_errorsопределяет допустимое количество последовательных ошибок перед блокировкой.
Для каждого нового подключения клиента сервер использует IP-адрес клиента, чтобы проверить, находится ли имя хоста клиента в кэше хостов. Если да, сервер отклоняет или продолжает обрабатывать запрос на подключение в зависимости от того, заблокирован ли хост. Если хост не найден в кэше, сервер пытается разрешить имя хоста. Сначала он преобразует IP-адрес в имя хоста и преобразует имя хоста обратно в IP-адрес. Затем он сравнивает результат с исходным IP-адресом, чтобы убедиться, что они совпадают. Сервер сохраняет информацию о результате этой операции в кэше хостов. Если кэш заполнен, удаляется запись с наименьшим временем последнего использования.
Сервер выполняет разрешение имен хостов с помощью системного вызова getaddrinfo().
Сервер обрабатывает записи в кэше хостов следующим образом:
Когда первое TCP-подключение клиента достигает сервера с данного IP-адреса, создается новая запись кэша для записи IP-адреса клиента, имени хоста и флага проверки разрешения имени клиента. Изначально имя хоста устанавливается в
NULL, а флаг — в false. Эта запись также используется для последующих TCP-подключений клиентов с того же исходного IP-адреса.Если флаг проверки для записи IP-адреса клиента равен false, сервер пытается выполнить DNS-разрешение IP-адреса в имя хоста и обратно в IP-адрес. Если это успешно, имя хоста обновляется разрешенным именем хоста, а флаг проверки устанавливается в true. Если разрешение не удается, принятые действия зависят от того, является ли ошибка постоянной или временной. При постоянных ошибках имя хоста остается
NULL, а флаг проверки устанавливается в true. При временных ошибках имя хоста и флаг проверки остаются неизменными. (В этом случае следующая попытка DNS-разрешения происходит при следующем подключении клиента с этого IP.)Если при обработке входящего подключения клиента с данного IP-адреса возникает ошибка, сервер обновляет соответствующие счетчики ошибок в записи для этого IP. Описание записываемых ошибок см. в Разделе 25.12.16.1, «Таблица host_cache».
Чтобы разблокировать заблокированные хосты, очистите кэш хостов; см. Обработку заблокированных хостов.
Заблокированный хост может стать разблокированным даже без очистки кэша хостов, если произошла активность с других хостов:
Если кэш заполнен при поступлении подключения от клиента с IP-адресом, не представленным в кэше, сервер удаляет запись с наименьшим временем последнего использования, чтобы освободить место для новой записи.
Если удаленная запись относится к заблокированному хосту, этот хост разблокируется.
Некоторые ошибки подключения не связаны с TCP-соединениями, возникают очень рано в процессе подключения (даже до того, как известен IP-адрес) или не специфичны для какого-либо конкретного IP-адреса (например, условия недостатка памяти). Сведения об этих ошибках можно найти в переменных состояния сервера Connection_errors_ (см. Раздел 5.1.9, «Переменные состояния сервера»). xxx
Настройка кэша хостов
Кэш хостов включен по умолчанию. Системная переменная host_cache_size управляет его размером, а также размером таблицы host_cache Схемы производительности, которая отображает содержимое кэша. Размер кэша можно задать при запуске сервера и изменить во время выполнения. Например, чтобы установить размер в 100 при запуске, поместите эти строки в файл сервера my.cnf:
[mysqld]
host_cache_size=200
Чтобы изменить размер на 300 во время выполнения, сделайте следующее:
SET GLOBAL host_cache_size=300;
Установка значения host_cache_size в 0, как при запуске сервера, так и во время выполнения, отключает кэш хостов. При отключенном кэше сервер выполняет DNS-запрос каждый раз при подключении клиента.
Изменение размера кэша во время выполнения вызывает неявную операцию очистки кэша хостов, которая очищает кэш хостов, обнуляет таблицу host_cache и разблокирует любые заблокированные хосты; см. Очистку кэша хостов.
Использование опции --skip-host-cache аналогично установке системной переменной host_cache_size в 0, но host_cache_size более гибкая, поскольку ее можно использовать для изменения размера, включения и отключения кэша хостов во время выполнения, а не только при запуске сервера. Запуск сервера с опцией --skip-host-cache не препятствует внесению изменений в значение host_cache_size во время выполнения, но такие изменения не имеют эффекта, и кэш не включается даже если host_cache_size задано больше 0.
Чтобы отключить DNS-поиск имен хостов, запустите сервер с включенной системной переменной skip_name_resolve. В этом случае сервер использует только IP-адреса, а не имена хостов, чтобы сопоставить подключаемые хосты со строками в таблицах разрешений MySQL. Могут быть использованы только учетные записи, указанные в этих таблицах с использованием IP-адресов. (Клиент не сможет подключиться, если не существует учетной записи, которая указывает IP-адрес клиента.)
При наличии очень медленного DNS и большого количества хостов, вы можете улучшить производительность, включив skip_name_resolve для отключения DNS-запросов или увеличив значение host_cache_size для увеличения размера кэша хостов.
Чтобы полностью запретить TCP/IP-соединения, запустите сервер с включенной системной переменной skip_networking.
Чтобы настроить допустимое количество последовательных ошибок подключения перед блокировкой хоста, установите системную переменную max_connect_errors. Например, чтобы установить значение при запуске, поместите эти строки в файл сервера my.cnf:
[mysqld]
max_connect_errors=10000
Чтобы изменить значение во время выполнения, сделайте следующее:
SET GLOBAL max_connect_errors=10000;
Мониторинг кэша хостов
Таблица host_cache Схемы производительности отображает содержимое кэша хостов. Эту таблицу можно просмотреть с помощью операторов SELECT, что может помочь в диагностике причин проблем с подключением. Схема производительности должна быть включена, иначе эта таблица будет пустой. Сведения о этой таблице см. в Разделе 25.12.16.1, «Таблица host_cache».
Очистка кэша хостов
Очистка кэша хостов может быть желательной в следующих случаях:
Некоторые из ваших клиентских хостов изменили IP-адрес.
Появляется сообщение об ошибке
Host 'для подключений с законных хостов. (См. Обработка заблокированных хостов.)host_name' is blocked
Очистка кэша хостов приводит к следующим эффектам:
Очищается кэш хостов в оперативной памяти.
Удаляются все строки из таблицы Performance Schema
host_cache, отображающей содержимое кэша.Разблокируются любые заблокированные хосты. Это позволяет возобновить попытки подключения с этих хостов.
Для очистки кэша хостов можно использовать следующие методы:
Измените значение системной переменной
host_cache_size. Для этого требуется привилегияSUPER.Выполните оператор
TRUNCATE TABLE, который обнуляет таблицу Performance Schemahost_cache. Для этого требуется привилегияDROPна таблицу.Выполните оператор
FLUSH HOSTS. Для этого требуется привилегияRELOAD.Выполните команду mysqladmin flush-hosts. Для этого требуется привилегия
RELOAD.
Обработка заблокированных хостов
Сервер использует кэш хостов для отслеживания ошибок, возникающих во время процесса подключения клиента. Если возникает следующая ошибка, это означает, что mysqld получил много запросов на подключение с данного хоста, прерванных на середине:
Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
Значение системной переменной max_connect_errors определяет, сколько последовательных прерванных запросов на подключение сервер допускает перед блокировкой хоста. После max_connect_errors неудачных запросов без успешного подключения сервер предполагает, что что-то не так (например, кто-то пытается взломать), и блокирует хост от дальнейших запросов на подключение.
Чтобы разблокировать заблокированные хосты, очистите кэш хостов; см. Очистка кэша хостов.
В качестве альтернативы, чтобы избежать появления сообщения об ошибке, установите max_connect_errors, как описано в Настройка кэша хостов. Значение по умолчанию max_connect_errors равно 100. Увеличение max_connect_errors до большого значения уменьшает вероятность того, что хост достигнет порога и будет заблокирован. Однако, если возникает ошибка Host
', сначала проверьте, нет ли проблем с TCP/IP-соединениями с заблокированных хостов. Не имеет смысла увеличивать значение host_name' is blockedmax_connect_errors, если есть проблемы с сетью.
© 2025 Oracle
Licensed under the GPLv2 License.