服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 线上MySQL不可用,报错数据库无法连接

线上MySQL不可用,报错数据库无法连接

2022-02-20 21:19JavaEdge Mysql

当MySQL告诉你Too many connections,就是在传达它的连接池的连接已经满了,你这业务系统不能再和它建立新的连接。ERROR 1040(HY000): Too many connections:DB连接池里已有太多连接,不能再和你建立新连接。

ERROR 1040(HY000): Too many connections:DB连接池里已有太多连接,不能再和你建立新连接。

数据库自己有个连接池,你的每个系统部署在机器时,那台机器上部署的系统实例/服务实例自己也有个连接池,你的系统每个连接Socket都对应DB连接池里的一个Socket连接,这就是TCP连接:

线上MySQL不可用,报错数据库无法连接

当MySQL告诉你Too many connections,就是在传达它的连接池的连接已经满了,你这业务系统不能再和它建立新的连接。

案例

DB部署在64G内存大机器,而连接这台物理机的Java业务系统部署在2台机器,Java系统的连接池最大大小为200,即每个Java业务系统节点,最多和MySQL建立200个连接,共最多建立400个连接。

但这时若MySQL报异常Too many Connections,说明目前MySQL无法建立400个网络连接。这也太少了吧,这可是高配置机器!

于是检查了my.cnf,有个关键参数是max_connections,即MySQL能建立的最大连接数,设置的800。那为啥两台机器就只需建立400个连接都不行?

登录到MySQL机器,执行如下命令:

show variables like 'max_connections'

可观察到,当前MySQL仅建立了214个连接而已!难道MySQL根本不在乎我们设置的这参数?

检查MySQL启动日志:

Could not increase number of max_open_files to more than mysqld (request: 65535) Changed limits: max_connections: 214 (requested 2000) Changed limits: table_open_cache: 400 (requested 4096)

MySQL发现自己无法设置max_connections为我们期望的800,于是强制为214!因为底层linux把进程可打开的文件句柄数限制为1024了,导致MySQL最大连接数是214!

Linux文件句柄数量被限制也会导致MySQL最大连接数被限制。

如何解决

核心就如下命令:

ulimit -HSn 65535

然后就能用如下命令,检查最大文件句柄数是否被修改:

cat /etc/security/limits.conf cat /etc/rc.local

若都修改好之后,可在MySQL的my.cnf里确保max_connections参数也调整好了,然后重启服务器、重启MySQL,这样linux的最大文件句柄就会生效,MySQL最大连接数也会生效了。

此时再尝试业务系统去连接DB,就没问题了。

为何Linux最大文件句柄限制为1024时,MySQL最大连接数是214?MySQL源码中就是有个计算公式,算下来就是这样的结果。

linux默认会限制你每个进程对机器资源的使用,包括:

  • 可打开的文件句柄的限制
  • 可打开的子进程数的限制
  • 网络缓存的限制
  • 最大可锁定的内存大小

因为linux os设计的初衷,就是要尽量避免你某个进程一下子耗尽机器上的所有资源,所以他默认都是会做限制的。

对我们来说,常见问题就是文件句柄的限制。

因为若linux限制你一个进程的文件句柄太少,就会导致我们无法创建大量网络连接,我们的系统进程就无法正常工作。比如MySQL运行时,其实就是Linux上的一个进程,那么他其实是需要跟很多业务系统建立大量的连接的,结果你限制了他的最大文件句柄数量,那么他就不能建立太多连接了!

所以,你在生产环境部署了个系统,比如DB系统、MQ系统、存储系统、Cache系统后,都需要调整Linux的一些内核参数,这个文件句柄数量一定要调整,通常得设为65535。

比如Kafka之类的MQ,在生产环境部署时,若不优化linux内核参数,会导致Kafka可能无法创建足够的线程,此时也无法运行。

所以可用ulimit命令设置每个进程被限制使用的资源量,用

# 进程被限制使用的各种资源的量 ulimit -a

线上MySQL不可用,报错数据库无法连接

  • core file size 进程崩溃时的转储文件的大小限制
  • max locked memory 最大锁定内存大小
  • open files 最大可以打开的文件句柄数量
  • max user processes就是最多前可进以拥有的子进程数量。久性的设置进程的资源

设置之后,要确保变更落地到/etc/security/limits.conf文件,永打印限制

所以执行ulimit -HSn 65535命令后,要用如下命令检查一下是否落地到配置文件里去了。

cat /etc/security/limits.conf cat /etc/rc.local

原文地址:https://www.toutiao.com/a7062342938801553953/

延伸 · 阅读

精彩推荐
  • MysqlMySQL锁的知识点总结

    MySQL锁的知识点总结

    在本篇文章里小编给大家整理了关于MySQL锁的知识点总结以及实例内容,需要的朋友们学习下。...

    别人放弃我坚持吖4362020-12-14
  • MysqlMySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    逆心2972019-06-23
  • Mysqlmysql 不能插入中文问题

    mysql 不能插入中文问题

    当向mysql5.5插入中文时,会出现类似错误 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

    MYSQL教程网5722019-11-25
  • Mysql浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参...

    小码农叔叔5242021-11-16
  • Mysql解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Veir_dev5592019-06-25
  • Mysql详解MySQL中的分组查询与连接查询语句

    详解MySQL中的分组查询与连接查询语句

    这篇文章主要介绍了MySQL中的分组查询与连接查询语句,同时还介绍了一些统计函数的用法,需要的朋友可以参考下 ...

    GALAXY_ZMY5442020-06-03
  • MysqlERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 2 ...

    MYSQL教程网6412020-03-13
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4192019-11-23