Linux下修改MySQL最大连接数

小柊 发表于 2017年07月30日 13时30分10秒

序、扯淡

其实这个问题在网上的解决方案一搜就是一堆。本来并不打算单独写篇博客水一下的。但根据安排,后面有篇博客(暂定八月发表)的内容是基于本篇文章的内容继续深入的。所以还是放上来水一下。

 

一、背景

众所周知的是,MySQL在Linux上默认最大连接数只有100左右。对于一般的系统来说,这是一个相对合理的数字。但对于一些特殊系统来说,这么点连接数就明显有点不太够用了。

 

最近在实习的地方,需要部署一个SQL注入的漏洞环境用于演示。而在演示期间会使用Sqlmap进行注入点扫描,Sqlmap最大可以开启10个线程进行扫描工作,也就是说最坏的情况下,只要十个人就能把演示用的靶机打宕。

这当然不行了啊,你随便就打宕了还做什么演示啊。所以这种情况下,我们就需要对MySQL的最大连接数进行修改。以免出现MySQL: ERROR 1040: Too many connections的情况。

 

二、操作

这里我们分成CentOS 7和Ubuntu 16.04两部分进行讲述。

1.CentOS 7

编辑MySQL的配置文件:

vim /etc/my.cnf

 

然后在[mysqld]字段下,添加:

max_connections=2000

 

最后保存退出,并重启MySQL服务:

CentOS 7:

systemctl restart mysqld.service

 

CentOS 6:

service mysqld restart

 

现在重新进入MySQL控制台,最大连接数应该已经被调整为2000了。

 

2.Ubuntu 16.04

Ubuntu的设置其实和CentOS差不多,主要差异在MySQL的配置文件位置不同。

编辑MySQL配置文件:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

 

然后在[mysqld]字段下,添加:

max_connections=2000

最后保存退出,并重启MySQL服务:

service mysql restart

 

注意:可能会出现的问题

由于各部分系统环境差异的影响,会出现明明已经在MySQL配置文件中设置了max_connections值,但重启服务后,显示MySQL最大连接数只有214,再怎么调整配置文件都没用。

 

具体的原因可以参照MySQL官方文档《B.5.2.7 Too many connections》中的这一段:

The maximum number of connections MySQL supports depends on the quality of the thread library on a given platform, the amount of RAM available, how much RAM is used for each connection, the workload from each connection, and the desired response time. Linux or Solaris should be able to support at least 500 to 1000 simultaneous connections routinely and as many as 10,000 connections if you have many gigabytes of RAM available and the workload from each is low or the response time target undemanding. Windows is limited to (open tables × 2 + open connections) < 2048 due to the Posix compatibility layer used on that platform.

Increasing open-files-limit may be necessary. Also see Section 2.5, “Installing MySQL on Linux”, for how to raise the operating system limit on how many handles can be used by MySQL.

 

个人渣翻:

MySQL的最大连接数取决于当前给定平台的线程库质量、可用的RAM数、每个连接使用的RAM数、每个连接的工作负荷以及所需要的时间。如果当前您有足够大RAM可用,而且每个工作负荷较低或响应时间较低,此时的Linux或Solaris系统通常可以支持至少500到1000的并发连接,以及多达10000个连接。而Windows系统由于使用了Posix兼容层,最大连接数受限于(打开的表数量×2 + 打开的连接数)<2048。

增加同时文件打开数量限制(open-files-limit)可以提高最大并发连接数。请参阅第2.5节“在Linux上安装MySQL”,了解如何提高MySQL可以使用多少句柄的操作系统限制。

 

上面那么一大段话简单的讲就是:MySQL的最大连接数还有可能受到当前系统的限制,必要时可以提高同时文件打开数量限制(open-files-limit)来提高最大连接数。

 

具体操作如下,就是往MySQL服务的配置文件里加入提高限制的命令,具体操作如下:

CentOS 7:

vim /usr/lib/systemd/system/mysqld.service

 

Ubuntu:

sudo vim /lib/systemd/system/mysql.service

 

打开文件后服务配置文件后,配置文件底部加入或替换以下两行设置:

LimitNOFILE=65535

LimitNPROC=65535

 

保存并退出,再让系统重新加载新配置:

CentOS 7:

systemctl daemon-reload

systemctl restart mysqld.service

 

Ubuntu:

sudo systemctl daemon-reload

sudo service mysql restart

 

完成后应该就能解决问题了。

 

三、验证

 

四、写在最后

在实际的测试过程中,CentOS系统改一下my.cnf配置文件就好,很少会出现需要改动mysqld.service服务配置文件的情况。而Ubuntu系统就可能需要去改动mysql.service服务配置文件,这有可能是因为我用的是Ubuntu Desktop版本。另外,在可能会出现的问题小章节中,我并没有提到CentOS 6的解决方案,因为在实际测试下,可能是由于CentOS 6使用的是daemon而不是systemd,所以我并没有找到MySQL的服务配置文件。如果您使用的是CentOS 6,并出现了修改my.cnf配置文件但实际最大连接数被限制在一个最大值时,可以尝试修改/etc/security/limits.conf文件,设置一下open_files_limit值。

其实在经过上面的修改后,并不是所有环境都能被正常修改。之所以说的那么肯定,是因为我前不久就遇到了这样的情况,那就是在Docker容器里。至于Docker容器中怎么修改MySQL最大连接数,这就要留到下一篇博客里去讨论了。

 

 

 

 

小柊

2017年7月30日 13:23:11

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注