美文网首页DBA
MySQL 1040错误处理办法

MySQL 1040错误处理办法

作者: mysia | 来源:发表于2019-08-06 20:10 被阅读14次

    为什么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_portextra_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_portextra_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社区相同。

    相关文章

      网友评论

        本文标题:MySQL 1040错误处理办法

        本文链接:https://www.haomeiwen.com/subject/fjqwdctx.html