MySQL 1040错误处理办法
为什么root用户也连不上?
在正确设置的环境中,具有super权限的用户将能够访问实例并诊断导致连接不足的错误1040问题,如手册中所述:
mysqld实际上允许max_connection+1个客户端连接。额外的连接保留给拥有super账号使用。通过将权限授予管理员而不是普通用户,也具有进程权限的管理员可以连接到服务器并使用show processlist诊断问题,即使连接了最大数量的非特权客户端的。
但是我们看到很多人给他们的应用程序或脚本用户super权限,要么是由于应用程序需求(危险!)或者由于对结果缺乏了解,但是情况是,保留连接是由常规用户进行的,您的管理用户(通常是根用户)将无法连接。
如何保证实例的权限?
使用Percona Server 5.5.29及更高版本,以及MySQL8.0.14及更高版本,您可以设置一个额外的端口,允许多个额外的连接。这些附加的接口将不会被应用程序使用;它们仅用于数据库管理员监控/健康检查。
设置percona server
从Percona Server 5.5.29开始,只需在my.cnf
中添加extra_port
,下次重新启动端口时,该端口将变为可用的,并将侦听与常规连接相同的绑定地址。如果不设置extra_port
,则默认情况下没有其他端口可用。
您还可以定义extra_max_connections
,设置此端口将处理的连接数。它的默认值是1。
为了快速演示,我在一个实例的常规用户端口上设置了饱和连接,在该实例中,我已经在my.cnf
中设置了extra_port
和extra_max_connections
:
~ egrep 'port|extra' my.sandbox.cnf
port = 45989
extra_port = 45999
extra_max_connections = 10
# attempt to show some variables
~ mysql --host=127.0.0.1 --port=45989 --user=msandbox --password -e "SHOW GLOBAL VARIABLES WHERE Variable_name IN ('port', 'extra_port')"
ERROR 1040 (HY000): Too many connections
# now again, through the extra_port
~ mysql --host=127.0.0.1 --port=45999 --user=msandbox --password -e "SHOW GLOBAL VARIABLES WHERE Variable_name IN ('port', 'extra_port')"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| extra_port | 45999 |
| port | 45989 |
+---------------+-------+
注意,extra_port
已经在Percona Server 8.0.14和更新版本中删除,因为MySQL社区已经实现了与此功能重复的admin_port
。因此,在升级到Percona Server 8.0.14或更高版本时,如果已经在其中定义了extra_port
,请务必编辑my.cnf
!
设置社区版MySQL
要启用管理接口,您必须定义admin_address
,该地址必须是唯一的(不允许使用通配符)IPv4、IPv6、IPv4映射或管理接口将侦听的主机名。如果未定义此变量,则不启用接口。
您也可以定义一个端口,但它不是必需的,默认值为33062
。所以如果这个端口是空闲的,那么您不需要配置它。定义后,两个变量都应该放在my.cnf
的[mysqld]
部分下。
最后,您还可以设置create-admin-listener-thread
(默认情况下禁用),它将为传入连接处理创建一个单独的线程,这在某些情况下非常有用。
另一个区别是,Oracle的文档声称:
管理连接的数量没有限制。
(这与我们默认的1相反)。我不确定这意味着什么,但我会小心确保您不会意外地建立1000000个连接,因为它们可能不受限制,但仍会消耗资源!
使用管理端口做监控和健康检查
在达到最大连接数时,使用extra_port
和extra_max_connections
进行人工干预是非常有用的。除此之外,也可以被用作监控系统、负载均衡、服务发现的健康检查的探针。
监视脚本仍然可以为您的图形提取数据,以便以后了解连接堆积的原因。您的健康检查脚本可以报告服务器的降级状态,可能有一个特定的代码指示连接已饱和,但服务器是响应的(这意味着它可以自己清除,因此值得用更长的超时时间来做故障转移)。
注意:确保一次只建立一个用于监视/运行状况探测的单一连接,以避免在Percona服务器中充满extra_max_connections
,或避免在MySQL中创建一百万个线程。换句话说,如果上一次对数据库的查询/连接仍在进行,则脚本不应再次连接。
下面是与之前相同的MySQL示例:
~ grep admin_ my.sandbox.cnf
admin_address = 127.0.0.1
admin_port = 34888
# regular port
~ mysql --host=127.0.0.1 --port=35849 --user=msandbox --password -e "SHOW GLOBAL VARIABLES WHERE Variable_name IN ('port', 'admin_address', 'admin_port');"
Enter password:
ERROR 1040 (HY000): Too many connections
# admin interface and port
~ mysql --host=127.0.0.1 --port=34888 --user=msandbox --password -e "SHOW GLOBAL VARIABLES WHERE Variable_name IN ('port', 'admin_address', 'admin_port');"a
Enter password:
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| admin_address | 127.0.0.1 |
| admin_port | 34888 |
| port | 35849 |
+---------------+-----------+
注意,对于Percona Server 8.0.14及更高版本,该过程将与MySQL社区相同。
完