7.1.12.3 Проверка DNS-записей и кэш хостов
Сервер MySQL поддерживает кэш хостов в оперативной памяти, содержащий информацию о клиентах: IP-адрес, имя хоста и информацию об ошибках. Таблица Performance Schema host_cache предоставляет содержимое кэша хостов, которое можно просмотреть с помощью операторов SELECT. Это может помочь в диагностике причин проблем с подключением. См. Раздел 29.12.22.3, «Таблица 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, сервер пытается выполнить разрешение IP-адреса на имя хоста и обратно на IP-адрес через DNS. Если это успешно, имя хоста обновляется с разрешенным именем хоста, а флаг валидации устанавливается в true. Если разрешение не выполнено, действия зависят от того, является ли ошибка постоянной или временной. Для постоянных ошибок имя хоста остается
NULL, а флаг валидации устанавливается в true. Для временных ошибок имя хоста и флаг валидации остаются неизменными. (В этом случае следующая попытка разрешения DNS происходит в следующий раз, когда клиент подключается с этого IP-адреса.)Если при обработке входящего клиентского соединения с заданного IP-адреса возникает ошибка, сервер обновляет соответствующие счетчики ошибок в записи для этого IP-адреса. Для описания записываемых ошибок см. Раздел 29.12.22.3, «Таблица host_cache».
Чтобы разблокировать заблокированные хосты, очистите кэш хостов; см. Работа с заблокированными хостами.
Заблокированный хост может быть разблокирован, даже не очищая кэш хостов, если происходят действия от других хостов:
Если кэш заполнен, когда приходит соединение от клиента с IP-адресом, не находящимся в кэше, сервер удаляет наименее недавно используемую запись в кэше, чтобы освободить место для новой записи.
Если удаленная запись относится к заблокированному хосту, этот хост становится разблокированным.
Некоторые ошибки подключения не связаны с TCP-соединениями, возникают очень рано в процессе подключения (даже до того, как известен IP-адрес) или не специфичны для какого-либо конкретного IP-адреса (например, проблемы с недостатком памяти). Для получения информации об этих ошибках проверьте переменные состояния Connection_errors_ (см. Раздел 7.1.10, «Переменные состояния сервера»). xxx
Настройка кэша хостов
Кэш хостов включен по умолчанию. Переменная системы host_cache_size управляет его размером, а также размером таблицы Performance Schema host_cache, которая предоставляет содержимое кэша. Размер кэша можно установить при запуске сервера и изменить во время работы. Например, чтобы установить размер в 100 при запуске, добавьте эти строки в файл конфигурации сервера my.cnf:
[mysqld]
host_cache_size=200
Чтобы изменить размер на 300 во время работы, сделайте следующее:
SET GLOBAL host_cache_size=300;
Установка host_cache_size в 0, как при запуске сервера, так и во время работы, отключает кэш хостов. При отключенном кэше сервер выполняет поиск по DNS каждый раз, когда подключается клиент.
Изменение размера кэша во время работы приводит к неявной очистке кэша хостов, очистке таблицы host_cache и разблокированию любых заблокированных хостов; см. Очистка кэша хостов.
Чтобы отключить поиск по 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;
Мониторинг кэша хостов
Таблица Performance Schema host_cache предоставляет содержимое кэша хостов. Эту таблицу можно просмотреть с помощью операторов SELECT, что может помочь в диагностике причин проблем с подключением. Подробную информацию об этой таблице см. в Разделе 29.12.22.3, «Таблица host_cache».
Очистка кэша хостов
Очистка кэша хостов может быть целесообразной или желательной в следующих ситуациях:
Некоторые из ваших клиентских хостов изменили IP-адрес.
Появляется сообщение об ошибке
Host 'для подключений от легитимных хостов. (См. Работа с заблокированными хостами.)host_name' is blocked
Очистка кэша хостов имеет следующие последствия:
Она очищает кэш хостов в оперативной памяти.
Она удаляет все строки из таблицы Performance Schema
host_cache, которая отображает содержимое кэша.Она разблокирует любые заблокированные хосты. Это позволяет повторно пытаться подключиться с этих хостов.
Для очистки кэша хостов используйте любой из этих методов:
Измените значение системной переменной
host_cache_size. Это требует привилегииSYSTEM_VARIABLES_ADMIN(или устаревшей привилегииSUPER).Выполните оператор
TRUNCATE TABLE, который обнуляет таблицу Performance Schemahost_cache. Это требует привилегииDROPдля таблицы.Выполните команду mysqladmin flush-hosts. Это требует привилегии
DROPдля таблицы Performance Schemahost_cacheили привилегии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.