在做DBA的这些年里,我不得不处理数据库中的各种问题。我遇到的最常见的问题之一是与众所周知的错误“error 1040 (08004): Too many connections”相关的问题。关于这个错误已经写了很多。尽管如此,用户还是会陷入这个陷阱,这可能是因为配置不佳的数据库、应用程序组件的更改,或者只是因为应用程序中的连接突然增加。在某种程度上,我们都会在职业生涯中遇到这个问题,不止一次,而是很多次。这篇博文的主要目的是指出MySQL 8上允许的新的管理连接,因为这些连接可以避免在这种情况下重新启动实例。
默认的行为
我们知道,数据库中允许的连接数量是由参数“max_connections”定义的。该参数的缺省值是151,可以动态更改,这意味着不需要重新启动数据库。如果数据库中的连接达到最大值,我们将看到可怕的消息“ERROR 1040 (08004): Too many connections”。重要的是要记住,开箱即用,MySQL允许一个额外的连接,这个连接是为拥有“SUPER”权限的用户保留的(已经弃用了<一个href="https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html">在这里一个>)或CONNECTION_ADMIN权限。
我将展示这个特性的一个例子;对于这个例子,我有一个“max_connections=20”的实例,我有三个用户,用户“monitor1”只有PROCESS特权,用户“admin1”有PROCESS和CONNECTIOraybet雷竞技竞猜在线官网N_ADMIN特权,最后用户“admin2”有SUPER特权(已弃用)。我们将看到MySQL如何处理这些连接,当用户连接的实例被刷爆时:
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29
30.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
--<年代pan class="crayon-h">
执行年代pan>
所有年代pan>
20.年代pan>
并发年代pan>
连接年代pan>
sysbench年代pan>
oltp_read_write年代pan>
--<年代pan class="crayon-i">表格年代pan>-<年代pan class="crayon-i">大小年代pan>=<年代pan class="crayon-cn">1000000年代pan>
--<年代pan class="crayon-i">db年代pan>-<年代pan class="crayon-i">司机年代pan>=<年代pan class="crayon-i">mysql年代pan>
--<年代pan class="crayon-i">mysql年代pan>-<年代pan class="crayon-i">宿主年代pan>=<年代pan class="crayon-i">本地主机年代pan>
--<年代pan class="crayon-i">mysql年代pan>-<年代pan class="crayon-i">db年代pan>=<年代pan class="crayon-i">sbt年代pan>
--<年代pan class="crayon-i">mysql年代pan>-<年代pan class="crayon-i">用户年代pan>=<年代pan class="crayon-i">根年代pan>
--<年代pan class="crayon-i">mysql年代pan>-<年代pan class="crayon-i">密码年代pan>=<年代pan class="crayon-s">“* * *”年代pan>
--<年代pan class="crayon-i">全国矿工工会年代pan>-<年代pan class="crayon-i">线程年代pan>=<年代pan class="crayon-cn">20.年代pan>
--<年代pan class="crayon-r">时间年代pan>=<年代pan class="crayon-cn">0年代pan>
--<年代pan class="crayon-i">报告年代pan>-<年代pan class="crayon-i">时间间隔年代pan>=<年代pan class="crayon-cn">1年代pan>
运行年代pan>
--<年代pan class="crayon-h">
测验年代pan>
与年代pan>
用户年代pan>
raybet雷竞技竞猜在线官网monitor1年代pan>
(年代pan>
根年代pan>
@年代pan>
岩石年代pan>-<年代pan class="crayon-i">test1年代pan>
~年代pan>
]年代pan>
# mysql -u raybet雷竞技竞猜在线官网monitor1 -p年代pan>
输入年代pan>
密码年代pan>
:年代pan>
错误年代pan>
1040年代pan>
(年代pan>
08004年代pan>
)年代pan>
:年代pan>
太年代pan>
许多年代pan>
连接年代pan>
--<年代pan class="crayon-h">
测验年代pan>
与年代pan>
用户年代pan>
admin1年代pan>
(年代pan>
根年代pan>
@年代pan>
岩石年代pan>-<年代pan class="crayon-i">test1年代pan>
~年代pan>
]年代pan>
# mysql -u admin1 -p年代pan>
输入年代pan>
密码年代pan>
:年代pan>
欢迎年代pan>
来年代pan>
的年代pan>
MySQL年代pan>
raybet雷竞技竞猜在线官网
.年代pan>
命令年代pan>
结束年代pan>
与年代pan>
;年代pan>
或年代pan>
\年代pan>
g年代pan>
.年代pan>
你的年代pan>
MySQL年代pan>
连接年代pan>
id年代pan>
是年代pan>
144年代pan>
服务器年代pan>
版本年代pan>
:年代pan>
8.0.29年代pan>-<年代pan class="crayon-cn">21年代pan>
雷竞技下载官网
服务器年代pan>
(年代pan>
GPL年代pan>
)年代pan>
,年代pan>
释放年代pan>
21年代pan>
,年代pan>
修订年代pan>
c59f87d2854年代pan>
版权年代pan>
(年代pan>
c年代pan>
)年代pan>
2009年代pan>-<年代pan class="crayon-cn">2022年代pan>
雷竞技下载官网
有限责任公司年代pan>
而且年代pan>/<年代pan class="crayon-st">或年代pan>
它的年代pan>
子公司年代pan>
版权年代pan>
(年代pan>
c年代pan>
)年代pan>
2000年代pan>
,年代pan>
2022年代pan>
,年代pan>
甲骨文年代pan>
而且年代pan>/<年代pan class="crayon-st">或年代pan>
它的年代pan>
子公司年代pan>
.年代pan>
甲骨文年代pan>
是年代pan>
一个年代pan>
注册年代pan>
商标年代pan>
的年代pan>
甲骨文年代pan>
公司年代pan>
而且年代pan>/<年代pan class="crayon-st">或年代pan>
它的年代pan>
子公司年代pan>
.年代pan>
其他年代pan>
的名字年代pan>
五月年代pan>
是年代pan>
商标年代pan>
的年代pan>
他们的年代pan>
各自的年代pan>
主人年代pan>
.年代pan>
类型年代pan>
“帮助;”年代pan>
或年代pan>
“\ h”年代pan>
为年代pan>
帮助年代pan>
.年代pan>
类型年代pan>
“\ c”年代pan>
来年代pan>
清晰的年代pan>
的年代pan>
当前的年代pan>
输入年代pan>
声明年代pan>
.年代pan>
mysql年代pan>
>年代pan>
显示年代pan>
奖助金年代pan>
;年代pan>
+-----------------------------------------------+
|年代pan>
奖助金年代pan>
为年代pan>
admin1年代pan>
@年代pan>
%年代pan>
|年代pan>
+-----------------------------------------------+
|年代pan>
格兰特年代pan>
过程年代pan>
在年代pan>
*<年代pan class="crayon-sy">.年代pan>*<年代pan class="crayon-h">
来年代pan>
”年代pan>
admin1年代pan>
”年代pan>
@年代pan>
”年代pan>
%年代pan>
”年代pan>
|年代pan>
|年代pan>
格兰特年代pan>
CONNECTION_ADMIN年代pan>
在年代pan>
*<年代pan class="crayon-sy">.年代pan>*<年代pan class="crayon-h">
来年代pan>
”年代pan>
admin1年代pan>
”年代pan>
@年代pan>
”年代pan>
%年代pan>
”年代pan>
|年代pan>
+-----------------------------------------------+
2年代pan>
行年代pan>
在年代pan>
集年代pan>
(年代pan>
0.00年代pan>
证券交易委员会年代pan>
)年代pan>
mysql年代pan>
>年代pan>
选择年代pan>
数年代pan>
(年代pan>
1年代pan>
)年代pan>
从年代pan>
information_schema年代pan>
.processlist年代pan>
;年代pan>
+----------+
|年代pan>
数年代pan>
(年代pan>
1年代pan>
)年代pan>
|年代pan>
+----------+
|年代pan>
22年代pan>
|年代pan>
+----------+
1年代pan>
行年代pan>
在年代pan>
集年代pan>
(年代pan>
0.00年代pan>
证券交易委员会年代pan>
)年代pan>
--<年代pan class="crayon-h">
测验年代pan>
与年代pan>
用户年代pan>
了admin2年代pan>
(年代pan>
根年代pan>
@年代pan>
岩石年代pan>-<年代pan class="crayon-i">test1年代pan>
~年代pan>
]年代pan>
# mysql -u admin2 -p年代pan>
输入年代pan>
密码年代pan>
:年代pan>
欢迎年代pan>
来年代pan>
的年代pan>
MySQL年代pan>
raybet雷竞技竞猜在线官网
.年代pan>
命令年代pan>
结束年代pan>
与年代pan>
;年代pan>
或年代pan>
\年代pan>
g年代pan>
.年代pan>
你的年代pan>
MySQL年代pan>
连接年代pan>
id年代pan>
是年代pan>
145年代pan>
服务器年代pan>
版本年代pan>
:年代pan>
8.0.29年代pan>-<年代pan class="crayon-cn">21年代pan>
雷竞技下载官网
服务器年代pan>
(年代pan>
GPL年代pan>
)年代pan>
,年代pan>
释放年代pan>
21年代pan>
,年代pan>
修订年代pan>
c59f87d2854年代pan>
版权年代pan>
(年代pan>
c年代pan>
)年代pan>
2009年代pan>-<年代pan class="crayon-cn">2022年代pan>
雷竞技下载官网
有限责任公司年代pan>
而且年代pan>/<年代pan class="crayon-st">或年代pan>
它的年代pan>
子公司年代pan>
版权年代pan>
(年代pan>
c年代pan>
)年代pan>
2000年代pan>
,年代pan>
2022年代pan>
,年代pan>
甲骨文年代pan>
而且年代pan>/<年代pan class="crayon-st">或年代pan>
它的年代pan>
子公司年代pan>
.年代pan>
甲骨文年代pan>
是年代pan>
一个年代pan>
注册年代pan>
商标年代pan>
的年代pan>
甲骨文年代pan>
公司年代pan>
而且年代pan>/<年代pan class="crayon-st">或年代pan>
它的年代pan>
子公司年代pan>
.年代pan>
其他年代pan>
的名字年代pan>
五月年代pan>
是年代pan>
商标年代pan>
的年代pan>
他们的年代pan>
各自的年代pan>
主人年代pan>
.年代pan>
类型年代pan>
“帮助;”年代pan>
或年代pan>
“\ h”年代pan>
为年代pan>
帮助年代pan>
.年代pan>
类型年代pan>
“\ c”年代pan>
来年代pan>
清晰的年代pan>
的年代pan>
当前的年代pan>
输入年代pan>
声明年代pan>
.年代pan>
mysql年代pan>
>年代pan>
显示年代pan>
奖助金年代pan>
;年代pan>
+------------------------------------+
|年代pan>
奖助金年代pan>
为年代pan>
了admin2年代pan>
@年代pan>
%年代pan>
|年代pan>
+------------------------------------+
|年代pan>
格兰特年代pan>
超级年代pan>
在年代pan>
*<年代pan class="crayon-sy">.年代pan>*<年代pan class="crayon-h">
来年代pan>
”年代pan>
了admin2年代pan>
”年代pan>
@年代pan>
”年代pan>
%年代pan>
”年代pan>
|年代pan>
+------------------------------------+
1年代pan>
行年代pan>
在年代pan>
集年代pan>
(年代pan>
0.00年代pan>
证券交易委员会年代pan>
)年代pan>
mysql年代pan>
>年代pan>
选择年代pan>
数年代pan>
(年代pan>
1年代pan>
)年代pan>
从年代pan>
information_schema年代pan>
.processlist年代pan>
;年代pan>
+----------+
|年代pan>
数年代pan>
(年代pan>
1年代pan>
)年代pan>
|年代pan>
+----------+
|年代pan>
1年代pan>
|年代pan>
+----------+
1年代pan>
行年代pan>
在年代pan>
集年代pan>
(年代pan>
0.00年代pan>
证券交易委员会年代pan>
)年代pan>
|
如您所见,允许具有“CONNECTION_ADMIN”或“SUPER”特权的用户进行单个连接,但是,当用户“monitor1”尝试连接时,由于它没有任何这些特权,因此无法连接。raybet雷竞技竞猜在线官网一旦我们获得了对数据库的访问权限,我们可以通过在线更改变量“max_connections”来轻松地增加连接,然后检查问题的根源。重要的是要记住,这些连接中只有一个是允许的,所以请不要将这些特权授予任何用户,否则您仍然可能被锁定在数据库之外。
|
1
2
3.
4
5
|
- - - - - -<年代pan class="crayon-h">
尝试年代pan>
一个年代pan>
第二个年代pan>
连接年代pan>
与年代pan>
用户年代pan>
admin1年代pan>
(年代pan>
根年代pan>
@年代pan>
岩石年代pan>-<年代pan class="crayon-i">test1年代pan>
~年代pan>
]年代pan>
# mysql -u admin1 -p年代pan>
输入年代pan>
密码年代pan>
:年代pan>
错误年代pan>
1040年代pan>
(年代pan>
HY000年代pan>
)年代pan>
:年代pan>
太年代pan>
许多年代pan>
连接年代pan>
|
通常,当这个问题发生时,我们无法访问MySQL,立即的解决方案是重新启动数据库并处理由此导致的所有后果,但是,嘿,这比在业务正常运行时间内拒绝连接几分钟要好。还有另一种访问数据库的方法,即使用GDB,但并不总是可行的<一个href="//m.doggingzone.com/blog/too-many-connections-no-problem/">连接太多?没问题!是我们过去写的一篇关于这个工具的文章,这篇文章有点老,但仍然有效。
雷竞技下载官网在8.0.14之前的版本中,用于MySQL的Percona服务器有另一种访问数据库实例的方式,类似于8.0.14版本中引入的新特性。那就是启用变量<一个href="https://docs.percona.com/percona-server/8.0/performance/threadpool.html">“extra_port”一个>而且<一个href="https://docs.percona.com/percona-server/8.0/performance/threadpool.html">“extra_max_connections。”一个>这些变量的使用超出了本文的范围,但是这些变量的目标是即使在数据库连接达到最大时也允许连接到数据库。记住,这些变量在8.0.14版本中被删除了,如果在配置文件中找到,实例将不会启动,并将显示一个错误。像MySQ雷竞技下载官网L的Percona Server一样,MariaDB对相同的变量有类似的实现。可以找到MariaDB的文档<一个href="https://mariadb.com/kb/en/thread-pool-system-status-variables/">在这里一个>.
从MySQL 8.0.14开始,一个新的“管理连接”或“管理网络接口”特性被引入。此特性允许通过管理端口连接到数据库,对管理连接的数量没有限制。此特性与前一个示例中显示的单个连接之间的区别在于,这是一个不同的端口,并且它没有将连接限制为一个,如果需要,则可以将连接限制为多个。这应该允许我们在用户连接达到最大值时访问数据库,并从那里开始增加连接或终止一些应用程序连接。
启用“管理连接”的最简单方法是定义<一个href="https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html">“admin_address”一个>变量,这是管理连接将侦听的IP地址,例如,如果您只想允许本地连接,您可以将此变量定义为“127.0.0.1”,或者如果您想通过网络连接,则可以将此变量定义为服务器的IP地址。这个变量不是动态的,这意味着它需要重新启动数据库。默认情况下,此变量为空,这意味着禁用管理接口。另一个相关变量是<一个href="https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html">“admin_port”一个>;这个变量定义了MySQL将监听管理连接的端口,这个变量的默认值是33062。一旦你定义了这两个变量并重新启动数据库,你将在错误日志中看到一条提示管理界面已经准备好连接的消息:
现在已经配置了管理界面,您需要定义可以访问此管理连接的用户。这些用户将需要“SERVICE_CONNECTION_ADMIN”权限;否则,它们将无法连接到它。按照我们最初的示例,我将“SERVICE_CONNECTION_ADMIN”授予用户“admin1”,但没有授予用户“admin2”
在测试到管理界面的连接时,我们看到只有用户“admin1”是允许的,而用户“admin2”的连接因为缺乏特权“SERVICE_CONNECTION_ADMIN”而被拒绝。另外,我们可以确认用户“admin1”连接到端口33062,该端口是admin接口使用的端口。
如果你使用的是MySQL 8.0.14或更高版本,你应该启用管理界面,正如我们所看到的,启用这个特性非常简单,并且允许dba在出现“ERROR 1040 (08004): Too many connections”事件时访问数据库。这个新特性不会影响正常的数据库性能,为dba带来了强大的功能。请考虑只将“SERVICE_CONNECTION_ADMIN”特权添加到管理用户,而不是应用程序用户,这样做是为了避免滥用此特性。如果你仍然在使用低版本的Percona服务器,请记住你可以配置变量" extra_p雷竞技下载官网ort "和<一个href="https://docs.percona.com/percona-server/8.0/performance/threadpool.html">”一个>extra_max_connections 雷竞技下载官网Percona Distribution for MySQL是最完整、稳定、可扩展和安全的开源MySQL解决方案,为您最关键的业务应用程序提供企业级数据库环境……而且它是免费使用的!年代trong>关于MySQL和MariaD雷竞技下载官网B的Percona服务器的边注
新功能
结论





