文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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

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

注意

可以安装一个插件而没有另一个插件,但必须安装这两个插件才能实现完整的连接控制功能。特别是,仅安装 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 帐户匹配,但提供的凭据不正确或与任何已知帐户不匹配的尝试。

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

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

如果连接尝试与任何 mysql.user 条目都不匹配,则该尝试将失败。在这种情况下,没有 CURRENT_USER() 值可用,并且失败连接计数使用客户端提供的用户名和服务器确定的客户端主机。例如,如果客户端尝试以用户 user2 的身份从主机 host2.example.com 连接,则用户名部分在客户端请求中可用,并且服务器会确定主机信息。用于计数的用户/主机组合是 [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 赋值将产生以下影响。