文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9MB
PDF (A4) - 40.0MB
手册页 (TGZ) - 258.5KB
手册页 (Zip) - 365.5KB
信息 (Gzip) - 4.0MB
信息 (Zip) - 4.0MB


MySQL 8.4 参考手册  /  ...  /  连接控制插件安装

8.4.2.1 连接控制插件安装

本节介绍如何安装连接控制插件,CONNECTION_CONTROLCONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS。有关安装插件的一般信息,请参阅 第 7.6.1 节 “安装和卸载插件”

为了供服务器使用,插件库文件必须位于 MySQL 插件目录中(由 plugin_dir 系统变量命名的目录)。如有必要,请在服务器启动时设置 plugin_dir 的值以配置插件目录位置。

插件库文件的基本名称是 connection_control。文件扩展名因平台而异(例如,Unix 和类 Unix 系统为 .so,Windows 为 .dll)。

要在服务器启动时加载插件,请使用 --plugin-load-add 选项命名包含它们的库文件。使用此插件加载方法,每次服务器启动时都必须提供该选项。例如,将这些行放在服务器的 my.cnf 文件中,并根据您的平台调整 .so 后缀:

[mysqld]
plugin-load-add=connection_control.so

修改 my.cnf 后,请重新启动服务器以使新设置生效。

或者,要在运行时加载插件,请使用以下语句,并根据您的平台调整 .so 后缀:

INSTALL PLUGIN CONNECTION_CONTROL
  SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
  SONAME 'connection_control.so';

INSTALL PLUGIN 会立即加载插件,并将其注册到 mysql.plugins 系统表中,以便服务器在每次后续正常启动时加载它,而无需使用 --plugin-load-add

要验证插件安装,请检查信息模式 PLUGINS 表或使用 SHOW PLUGINS 语句(请参阅 第 7.6.2 节 “获取服务器插件信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME                              | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL                       | ACTIVE        |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE        |
+------------------------------------------+---------------+

如果插件初始化失败,请检查服务器错误日志以获取诊断消息。

如果插件已使用 INSTALL PLUGIN 注册或使用 --plugin-load-add 加载,则可以在服务器启动时使用 --connection-control--connection-control-failed-login-attempts 选项来控制插件激活。例如,要在启动时加载插件并防止它们在运行时被删除,请使用以下选项:

[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT

如果希望防止服务器在没有给定连接控制插件的情况下运行,请使用选项值 FORCEFORCE_PLUS_PERMANENT 来强制服务器启动失败(如果插件未成功初始化)。

注意

可以只安装一个插件而不安装另一个插件,但为了获得完整的连接控制功能,必须同时安装这两个插件。特别是,仅安装 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 插件用处不大,因为如果没有 CONNECTION_CONTROL 插件来提供填充 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 表的数据,则该表将始终为空。

连接延迟配置

为了启用操作配置,CONNECTION_CONTROL 插件公开了以下系统变量:

如果 connection_control_failed_connections_threshold 不为零,则启用失败连接计数,并具有以下属性:

  • 延迟在 connection_control_failed_connections_threshold 次连续连接尝试失败之前为零。

  • 此后,服务器会为后续的连续尝试添加递增的延迟,直到连接成功。初始未调整的延迟从 1000 毫秒(1 秒)开始,每次尝试增加 1000 毫秒。也就是说,一旦为某个帐户激活了延迟,则后续失败尝试的未调整延迟为 1000 毫秒、2000 毫秒、3000 毫秒,依此类推。

  • 客户端经历的实际延迟是未调整的延迟,经过调整后位于 connection_control_min_connection_delayconnection_control_max_connection_delay 系统变量的值范围内(包括这两个值)。

  • 一旦为某个帐户激活了延迟,该帐户此后的第一次成功连接也会遇到延迟,但后续连接的失败计数会重置。

例如,使用默认的 connection_control_failed_connections_threshold 值 3,则对于某个帐户的前三次连续连接尝试失败,不会有任何延迟。该帐户在第四次及后续失败连接中遇到的实际调整后的延迟取决于 connection_control_min_connection_delayconnection_control_max_connection_delay 的值:

您可以在服务器启动或运行时设置 CONNECTION_CONTROL 系统变量。假设您希望在服务器开始延迟其响应之前允许四次连续的连接尝试失败,最小延迟为 2000 毫秒。要在服务器启动时设置相关变量,请将以下行添加到服务器的 my.cnf 文件中:

[mysqld]
plugin-load-add=connection_control.so
connection_control_failed_connections_threshold=4
connection_control_min_connection_delay=2000

要在运行时设置并持久化这些变量,请使用以下语句:

SET PERSIST connection_control_failed_connections_threshold = 4;
SET PERSIST connection_control_min_connection_delay = 2000;

SET PERSIST 为正在运行的 MySQL 实例设置一个值。它还会保存该值,使其在后续服务器重启后继续有效。要更改正在运行的 MySQL 实例的值而不将其保留到后续重启,请使用 GLOBAL 关键字而不是 PERSIST。请参阅 第 15.7.6.1 节“SET 语法用于变量赋值”

connection_control_min_connection_delayconnection_control_max_connection_delay 系统变量的最小值和最大值分别为 1000 和 2147483647。此外,每个变量允许的值的范围还取决于另一个变量的当前值:

因此,要对某些配置进行所需的更改,您可能需要按特定顺序设置变量。假设当前的最小和最大延迟分别为 1000 和 2000,并且您希望将它们分别设置为 3000 和 5000。您不能先将 connection_control_min_connection_delay 设置为 3000,因为这大于当前的 connection_control_max_connection_delay 值 2000。而是先将 connection_control_max_connection_delay 设置为 5000,然后再将 connection_control_min_connection_delay 设置为 3000。

连接失败评估

安装 CONNECTION_CONTROL 插件后,它会检查连接尝试并跟踪它们是失败还是成功。为此,失败的连接尝试是指客户端用户和主机与已知的 MySQL 帐户匹配,但提供的凭据不正确或与任何已知帐户都不匹配。

失败连接计数基于每次连接尝试的用户/主机组合。确定适用的用户名和主机名时会考虑代理,具体如下:

  • 如果客户端用户代理另一个用户,则用于失败连接计数的帐户是代理用户,而不是被代理用户。例如,如果 [email protected] 代理 [email protected],则连接计数使用代理用户 [email protected],而不是被代理用户 [email protected][email protected][email protected] 都必须在 mysql.user 系统表中具有有效的条目,并且必须在 mysql.proxies_priv 系统表中定义它们之间的代理关系(请参阅 第 8.2.19 节“代理用户”)。

  • 如果客户端用户没有代理另一个用户,但与 mysql.user 条目匹配,则计数使用与该条目对应的 CURRENT_USER() 值。例如,如果从主机 host1.example.com 连接的用户 user1[email protected] 条目匹配,则计数使用 [email protected]。如果用户改为与 user1@%.example.comuser1@%.comuser1@% 条目匹配,则计数分别使用 user1@%.example.comuser1@%.comuser1@%

对于刚才描述的情况,连接尝试与某些 mysql.user 条目匹配,请求是成功还是失败取决于客户端是否提供了正确的身份验证凭据。例如,如果客户端提供的密码不正确,则连接尝试失败。

如果连接尝试与任何 mysql.user 条目都不匹配,则尝试失败。在这种情况下,没有可用的 CURRENT_USER() 值,并且连接失败计数使用客户端提供的用户名和服务器确定的客户端主机。例如,如果客户端尝试从主机 host2.example.com 以用户 user2 的身份连接,则用户名部分在客户端请求中可用,并且服务器确定主机信息。用于计数的用户/主机组合为 [email protected]

注意

服务器会维护有关哪些客户端主机可能连接到服务器的信息(基本上是 mysql.user 条目的主机值的并集)。如果客户端尝试从任何其他主机连接,服务器会在连接建立的早期阶段拒绝该尝试:

ERROR 1130 (HY000): Host 'host_name' is not
allowed to connect to this MySQL server

因为这种类型的拒绝发生得如此之早,所以 CONNECTION_CONTROL 不会看到它,也不会对其进行计数。

连接失败监控

要监控连接失败,请使用以下信息源:

在运行时为 connection_control_failed_connections_threshold 赋值会产生以下影响: