MySQL专题和技巧——入侵检测:谁在不断连接数据库
原创2023-04-20 10:10·贺浦力特
这个问题起源于一次用户反应数据库连接不上, 经过检查发现数据库连接数设置过低,连接数被占满了,导致新的连接连不上。

通过检查, 发现日志中有大量的如下报错呢?

[Warning] [MY-013360] [Server] Plugin sha256_password reported: ''sha256_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'

9de7bb31d0644e7393039222babfed10 欢迎收藏。

排查思路:

数据库平时没多少人连接,负载也不高, 一直运行很稳定,不需要关心。

检查发现数据库没几个连接, 但日志中很多如上的报错。而且数据库和用户已经设置为使用 mysql_native_password 认证。并没有使用 sha256_password 认证。

配置文件

default_authentication_plugin=mysql_native_password

创建账号

CREATE USER 'TEST'@'%' IDENTIFIED WITH mysql_native_password BY 'Test_1qaz' password expire never;

后来,查了官方文档发现,如果客户端使用一个不存在的账号登录, 那默认并不一定会使用数据库的默认认证插件,而是随机选择一个认证插件。怪不得这么多报错日志。

解决方法

安装插件

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

验证插件

select * from information_schema.PLUGINS where PLUGIN_NAME like 'connection%';
select * from information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;

相关参数说明

connection_control_failed_connections_threshold: 单个用户登录失败 (由于密码错误引起)次数上限,默认3次

connection_control_max_connection_delay: 失败上限之后再次尝试登录前最大等待时间,单位ms

connection_control_min_connection_delay: 失败上限之后再次尝试登录前最小等待时间,默认1秒 (1000ms)

尝试3次错误输入密码后,在第4次登录时会delay 1秒 (由
connection_control_min_connection_delay指定),同时 Connection_control_delay_generated 计数+1 (若登录密码继续输入错误,则 delay 秒数与计数器继续增加. 直到成功登录为止之后,此时 delay 清零,但计数器不清零. 需要注意的是,即使后续密码正确,依然要先延迟一定的秒数,才会进入账号校验流程)

查看delay

show global status like "Connection_control_delay_generated";

主从安装顺序

先装主, 再装从. 这个表分别记录各自实例的登录失败, 不会同步, 重启实例记录清空

安装之后过了几分钟,很快找到原因,定位到了具体客户端服务中写错了账号。 修改并重启服务, 问题解决。

补充

MySQL8中建议配置 admin_address=127.0.0.1 和 admin_port=33062 这样的话,如果连接数被占满了, 不至于管理员也连不上。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐