如何解决这些问题,“SQL 错误 1040:连接太多”,即使我尝试输入
max_user_connection=500
仍然“连接太多”
MySQL:错误 1040:连接太多
这基本上告诉 MySQL 同时处理最大数量的连接,默认情况下它同时处理100 个连接。
以下这些原因导致 MySQL 耗尽连接。
慢查询
数据存储技术
错误的 MySQL 配置
通过执行以下操作,我能够克服这个问题。
打开MySQL command line tool
并输入,
show variables like "max_connections";
这会给你返回这样的东西。
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 100 |
+-----------------+-------+
您可以通过发出以下命令将设置更改为例如 200,而无需重新启动 MySQL 服务器。
set global max_connections = 200;
现在,当您下次重新启动 MySQL 时,它将使用此设置而不是默认设置。
请记住,连接数的增加将增加 MySQL 运行所需的 RAM 量。
值得知道的是,如果您的服务器分区或驱动器上的可用磁盘空间不足,这也会导致 MySQL 返回此错误。如果您确定这不是实际连接的用户数,那么下一步是检查您的 MySQL 服务器驱动器/分区上是否有可用空间。
编辑 2019 年 1 月:
这适用于 MySQL 5.7 和 5.8 。我不知道上面的版本。
如果您用完了这样的连接,则很有可能您没有关闭已打开的连接。
查看打开连接的代码并确保尽快关闭连接。通常,您希望在实现IDisposable的任何对象(包括数据库连接)周围使用 using关键字,以确保这些对象在离开需要它们的范围后立即被释放。
您可以使用此查询检查当前的活动连接数:
show processlist
发生此错误是由于连接限制达到配置文件中定义的最大限制my.cnf
。
为了修复这个错误,请以root
用户身份登录 MySQL(注意:您可以以 root 身份登录,因为 mysql 将为 预分配一个额外的连接root user
)并使用以下命令增加max_connections变量:
SET GLOBAL max_connections = 500;
此更改将一直存在,直到下一次服务器重新启动。为了使此更改永久生效,您必须在配置文件中进行修改。你可以这样做,
vi /etc/my.cnf
[mysqld]
max_connections = 500
在您的程序中,您将打开连接并保持打开状态而不关闭它。
我遇到了同样的问题,终于确定了。
我在尝试捕获后添加了此代码。
finally{
try {
rs.close();
p.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
要查看为您的数据库配置了多少个连接以供使用:
select @@max_connections;
要更改它:
set global max_connections = 200;
要查看当前连接的数量:
show processlist;
我还编写了这个软件来帮助我创建一个很好的交易电子表格,这样我就可以追踪哪些查询是问题所在:
尝试这个 :
打开终端并输入以下命令:sudo gedit /etc/mysql/my.cnf
将该行粘贴到 my.cnf 文件中:set-variable=max_connections=500
此问题主要发生在超过 MySQL 允许的最大并发连接数时。允许的最大连接数存储在全局变量 max_connections 中。您可以show global variables like max_connections;
在 MySQL中检查它
您可以通过以下步骤修复它:
步骤1:
登录 MySQL 并运行以下命令:SET GLOBAL max_connections = 100;
现在登录到 MySQL,连接太多错误已修复。此方法不需要重新启动服务器。
第2步:
使用上面的 step1 你可以解决这个问题,但是当 mysql 重新启动时 max_connections 将回滚到它的默认值。
为了使 max_connection 值永久化,请更新 my.cnf 文件。
停止 MySQL 服务器: Service mysql stop
编辑配置文件 my.cnf:vi /etc/mysql/my.cnf
在 mysqld 部分下找到变量 max_connections。
[mysql]
max_connections = 300
设置为更高的值并保存文件。
启动服务器:Service mysql start
注意: 在增加 max_connections 变量值之前,请确保服务器有足够的内存用于新的请求和连接。
MySQL 为每个连接预分配内存并仅在连接关闭时取消分配。当新的连接查询时,系统应该有足够的资源,如内存、网络和计算能力来满足用户的请求。
此外,您应该考虑增加 MySQL 服务器中的打开表限制以适应额外的请求。最后。关闭服务器上已完成事务的连接非常重要。
即使我的所有连接都包含在 using 语句中,我也收到了这个错误。我忽略的是这些连接保持开放的时间。
我正在做这样的事情:
using (MySqlConnection conn = new MySqlConnection(ConnectionString))
{
conn.Open();
foreach(var m in conn.Query<model>(sql))
{
// do something that takes a while, accesses disk or even open up other connections
}
}
请记住,在循环中的所有内容完成之前,连接不会关闭,如果循环创建更多连接,它们就可以真正开始加起来。
这个更好:
List<model> models = null;
using (MySqlConnection conn = new MySqlConnection(ConnectionString))
{
conn.Open();
models = conn.Query<model>(sql).ToList(); // to list is needed here since once the connection is closed you can't step through an IEnumerable
}
foreach(var m in models)
{
// do something that takes a while, accesses disk or even open up other connections
}
这样你的连接就可以关闭并在你去做其他事情之前被释放回线程池
通过重新启动数据库 Windows 服务解决了问题
该问题在https://dev.mysql.com/doc/refman/8.0/en/too-many-connections.html中明确指出:
如果客户端在尝试连接 MySQL 服务器时遇到 Too many connections 错误,则所有可用连接都被其他客户端使用。
几分钟后我解决了这个问题,似乎连接已被其他客户端释放,我也尝试同时重新启动 vs 和工作台。
检查您当前正在运行的应用程序是否仍在访问您的 mysql 并已使用所有数据库连接。
因此,如果您尝试从 workbench 访问 mysql ,您将收到“连接过多”错误。
停止当前正在运行的 Web 应用程序,该应用程序持有所有这些数据库连接,然后您的问题将得到解决。