Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Connection-Control Plugin Installation

8.4.2.1 连接控制插件安装

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

要使插件库文件可供服务器使用,必须将其位于 MySQL 插件目录中(由 plugin_dir 系统变量命名的目录)。如果必要,请通过在服务器启动时设置 plugin_dir 的值来配置插件目录的位置。

插件库文件的基本名称是 connection_control。文件名后缀因平台而异(例如,Unix 和 Unix-like 系统上的 .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

要验证插件安装,请检查 Information Schema 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 选项值,以强制服务器启动失败,如果插件未成功初始化。

Note

可以单独安装一个插件,但两个插件都需要安装以获得完整的连接控制功能。特别是,仅安装 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 插件几乎没有用,因为没有 CONNECTION_CONTROL 插件提供数据来填充 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 表,该表总是空的。

连接延迟配置

为了启用其操作,CONNECTION_CONTROL 插件公开了这些系统变量:

如果 连接控制失败连接阈值 不为零,失败连接计数启用,并具有以下属性:

  • 延迟为零,直到 连接控制失败连接阈值 连续失败连接尝试。

  • 然后,服务器为后续连续尝试添加递增延迟,直到成功连接发生。未调整的延迟从 1000 毫秒(1 秒)开始,每次尝试增加 1000 毫秒。那就是说,一旦延迟被激活 для账户,后续失败尝试的未调整延迟为 1000 毫秒、2000 毫秒、3000 毫秒等。

  • 客户端实际经历的延迟是未调整延迟,调整以在 连接控制最小连接延迟连接控制最大连接延迟 系统变量之间,包括。

  • 一旦延迟被激活 для账户,账户的第一次成功连接也将经历延迟,但失败计数将被重置为后续连接。

例如,使用默认的 连接控制失败连接阈值 值 3,对于账户的前三个连续失败连接尝试没有延迟。账户对第四个和后续失败连接的实际调整延迟取决于 连接控制最小连接延迟连接控制最大连接延迟 值:

您可以在服务器启动或运行时设置 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 语法 for 变量赋值”

系统变量 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 帐户匹配,但提供的凭据不正确,或者不匹配任何已知帐户。

失败连接计数基于每个连接尝试的用户/主机组合。确定适用的用户名和主机名考虑了代理并按照以下方式进行:

  • 如果客户端用户代理另一个用户,连接失败计数的账户是代理用户,而不是被代理的用户。例如,如果 external_user@example.com 代理 proxy_user@example.com,连接计数使用代理用户,external_user@example.com,而不是被代理用户,proxy_user@example.com。两个 external_user@example.comproxy_user@example.com 都必须在 mysql.user 系统表中有有效的条目,并且在 mysql.proxies_priv 系统表中必须定义代理关系(见 第 8.2.19 节,“代理用户”)。

  • 如果客户端用户不代理另一个用户,但匹配一个 mysql.user 条目,计数使用相应的 CURRENT_USER() 值。例如,如果用户 user1 从主机 host1.example.com 连接,匹配 user1@host1.example.com 条目,计数使用 user1@host1.example.com。如果用户匹配 user1@%.example.comuser1@%.comuser1@% 条目,计数使用 user1@%.example.comuser1@%.comuser1@%,分别。

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

如果连接尝试不匹配任何 mysql.user 条目,尝试将失败。在这种情况下,无法获取 CURRENT_USER() 值,连接失败计数使用客户端提供的用户名和服务器确定的客户端主机。例如,如果客户端尝试以用户 user2 从主机 host2.example.com 连接,用户名部分来自客户端请求,服务器确定主机信息。用于计数的用户/主机组合是 user2@host2.example.com

Note

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

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

因为这种拒绝发生得如此早,CONNECTION_CONTROL 不会看到它,也不会计数。

连接失败监控

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

在运行时分配 connection_control_failed_connections_threshold 的值将产生以下效果: