【发布时间】:2012-12-29 03:44:31
【问题描述】:
如何解决这些问题,“SQL 错误 1040:连接过多” 即使我尝试放
max_user_connection=500
还是“连接太多”
【问题讨论】:
-
这是在我们的案例中唯一有效的方法:stackoverflow.com/questions/53226015/…
标签: mysql connection
如何解决这些问题,“SQL 错误 1040:连接过多” 即使我尝试放
max_user_connection=500
还是“连接太多”
【问题讨论】:
标签: mysql connection
如果您这样的连接用完了,很有可能您没有关闭已打开的连接。
查看打开连接的代码并确保尽快关闭连接。通常,您希望在实现 IDisposable 的任何对象(包括数据库连接)周围使用 using 关键字,以确保这些对象在离开它们所在的范围后立即被释放需要。
您可以使用此查询检查当前的活动连接数:
show processlist
【讨论】:
您必须更改 max_connections 以增加允许的连接总数。
并将max_user_connections 设置回默认值 0 => 无限制,除非您需要限制每个用户连接。
【讨论】:
试试这个:
打开终端并输入以下命令:sudo gedit /etc/mysql/my.cnf
在 my.cnf 文件中粘贴该行:set-variable=max_connections=500
【讨论】:
在您的程序中,您会打开连接并保持打开状态而不关闭它。
我遇到了同样的问题,终于确定了。
我在 try catch 之后添加了这段代码。
finally{
try {
rs.close();
p.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
【讨论】:
using 关键字以更简洁的方式执行此操作。
java 而不是 C#。
值得知道的是,如果您的服务器分区或驱动器上的可用磁盘空间不足,这也会导致 MySQL 返回此错误。如果您确定它不是实际的number of users connected,那么下一步是检查您的 MySQL 服务器驱动器/分区上是否有可用空间。
2019 年 1 月编辑:
MySQL 5.7 和 5.8 也是如此。我不知道上面的版本。
【讨论】:
INSERT 或 UPDATE 完成之前等待,这反过来又导致挂起的用户连接数增加,直到达到限制。跨度>
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 量。
【讨论】:
/etc/my.cnf 以拥有 max_connections = 200 以使更改在 MySQL 重新启动时持续存在。
检查您当前正在运行的应用程序是否仍在访问您的 mysql 并已使用所有数据库连接。
所以如果你尝试从workbench访问mysql,你会得到“too many connections”的错误。
停止当前正在运行的 Web 应用程序,该应用程序持有所有这些数据库连接,然后您的问题将得到解决。
【讨论】:
出现此错误,是由于连接限制达到了配置文件my.cnf中定义的最大限制。
为了修复这个错误,以root用户登录MySQL(注意:你可以以root用户登录,因为mysql会为root user预先分配一个额外的连接)并增加max_connections 变量,使用以下命令:
SET GLOBAL max_connections = 500;
此更改将一直存在,直到下一次服务器重新启动。为了使此更改永久生效,您必须在配置文件中进行修改。你可以这样做,
vi /etc/my.cnf
[mysqld]
max_connections = 500
This article有详细的步骤workaround to fix this error。看看它,我希望它可以帮助你。谢谢。
【讨论】:
查看配置了多少个连接供您的数据库使用:
select @@max_connections;
改变它:
set global max_connections = 200;
查看当前有多少连接:
show processlist;
我还写了this piece of software 来帮助我创建一个很好的交易电子表格,以便我可以追踪哪些查询是问题所在:
【讨论】:
https://dev.mysql.com/doc/refman/8.0/en/too-many-connections.html 中明确指出的问题:
如果客户端在尝试连接时遇到太多连接错误 连接到 MySQL 服务器,所有可用的连接都在使用 其他客户。
几分钟后我解决了这个问题,似乎其他客户端释放了连接,我也尝试同时重启vs和workbench。
【讨论】:
即使我的所有连接都包含在 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
}
这样你的连接被允许关闭并在你去做其他事情之前释放回线程池
【讨论】:
此问题主要发生在超过 MySQL 允许的最大并发连接数时。
允许的最大连接数存储在全局变量 max_connections 中。
您可以在 MySQL 中通过show global variables like max_connections; 进行检查
您可以通过以下步骤修复它:
第一步:
登录 MySQL 并运行以下命令:SET GLOBAL max_connections = 100;
现在登录 MySQL,连接太多错误已修复。此方法不需要重启服务器。
第二步:
使用上面的 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 服务器中的打开表限制以适应额外的请求。最后。关闭服务器上已完成事务的连接非常重要。
【讨论】:
问题通过重启数据库windows服务解决
【讨论】: