MYSQL 连接全部打满后的解决方案, 包含5.7 8.0 (外加一个招聘信息)

2021-02-22 00:00:00 连接 版本 的是 默认 端口


MYSQL 的连接被打满,然后就无法提供服务了, 那大部分会有几种解决的方案和方法.


1  监控要到位,你的MYSQL到底MAX_CONNECTIONS是多少, 超过多少连接数就需要告警了,这是一个问题. 当然这只能提前预知危险,但不能阻止危险.


2  基于MYSQL 的连接打满后的连接清理的问题

    这里分两个部分说

     1  MYSQL 5.X  

     2  MYSQL 8 


1  MYSQL 5.X  如何处理这样的问题

     首先要确认的是你的MYSQL 的版本, 如果你的MYSQL 5.X 是 percona 或者mariadb的版本,那么OK,下面的方法适合你, 如果你用的是官方的版本,(俗称社区版),那不好意思,自己想办法去吧.


实际上我们只需要在MYSQL 的配置文件中添加另个参数


extra_max_connections = 3 

extra_port=3307


为了测试我们将MYSQL的 MAX_CONNECTIONS 变化到 1 


我们开了一个SESSION 又开了一个 报错, 这个是自然的, TOO MANY CONNECTIONS 


我们将参数打入到MY.CNF 并重启动数据库


我们通过3307 的预设的端口进行访问是可以的, 这个方法可以弥补这个连接打满的问题


后面我们可以通过直接执行下面的存储过程,将应用的连接都KILL 掉,达到治标的解决问题的方案.

DELIMITER $

CREATE PROCEDURE kill_process_proc()

BEGIN

DECLARE kill_done int;

DECLARE EXIT HANDLER FOR NOT FOUND SET kill_done = 1;

BEGIN

DECLARE cursor_ID int;

DECLARE cursor_i CURSOR FOR

SELECT

id

FROM information_schema.PROCESSLIST

WHERE USER not in ('root','sys','repl','proxysql','mha','event_scheduler')

AND ID != CONNECTION_ID();

OPEN cursor_i;

read_loop:

LOOP

FETCH cursor_i INTO cursor_ID;

KILL CONNECTION cursor_ID;

IF kill_done THEN

LEAVE read_loop;

END IF;

END LOOP;

CLOSE cursor_i;

END;

END$

DELIMITER ;


以上的脚本是验证过的.


那么MYSQL 官方版本如何解决这个问题, 实际上在MYSQL 8.014这个版本提供了administrative connection port 这个功能.


要启动这个功能,需要设置admin_address ,如果admin address不设置,则这个功能无法被启用.

默认这个TCP/IP 的端口为33062, 对于通过这个端口连接到数据库的用户的数量我们并没有限制,但连接的用户必须有 service_connection_admin的权限.

另外这个功能create admin listener thread 这个选择项默认是关闭,也就是说,如果按照默认的来说,mysql 的管理连接和普通连接是一个,而不是分开的.




在简单的配置后,就可以通过33062 来访问了

上图是打开  create_admin_listener_thread, 也就是说普通用户的thread 和我们的ADMIN 的 thread 不同 大家可以注意上图 凡是普通thread开通的端口在3开头, 如果是ADMIN thread 是 4开头, 说明的确是通过打开create_admin_listener_thread 将访问的thread 分开了.


另外MYSQL 8 的  MAX_CONNECTION +1 这个就不多说了,和administrator port 相比,那是天上地下.


另外插播一段招聘,  天津滨海新区,招聘  PYTHON 程序员 和 MYSQL DBA 各一名,有意联系 wxid_5770667707722 (微信号,注明应聘)



相关文章