终止空闲的MySQL连接

49

我看到有很多连接处于打开状态,闲置了很长时间,比如5分钟。

有没有办法在不重启MySQL服务的情况下从服务器端终止/关闭这些连接?

我正在维护一个遗留的PHP系统,不能关闭已建立用于执行查询的连接。

我应该减少my.cnf文件中默认为8小时的超时值吗?

# default 28800 seconds

interactive_timeout=60
wait_timeout=60
2个回答

75

手动清理:

你可以终止进程的processid。

mysql> show full processlist;
+---------+------------+-------------------+------+---------+-------+-------+-----------------------+
| Id      | User       | Host              | db   | Command | Time  | State | Info                  |
+---------+------------+-------------------+------+---------+-------+-------+-----------------------+
| 1193777 | TestUser12 | 192.168.1.11:3775 | www  | Sleep   | 25946 |       | NULL                  |
+---------+------------+-------------------+------+---------+-------+-------+-----------------------+

mysql> kill 1193777;

但是:

  • php应用程序可能会报告错误(或者Web服务器,请检查错误日志)
  • 不要修复没有问题的东西 - 如果您没有连接不足,就让它们保持原样。

自动清理服务 ;)

或者您可以通过设置wait_timeoutinteractive_timeout上的较短超时时间来配置您的mysql服务器。

mysql> show variables like "%timeout%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| connect_timeout          | 5     |
| delayed_insert_timeout   | 300   |
| innodb_lock_wait_timeout | 50    |
| interactive_timeout      | 28800 |
| net_read_timeout         | 30    |
| net_write_timeout        | 60    |
| slave_net_timeout        | 3600  |
| table_lock_wait_timeout  | 50    |
| wait_timeout             | 28800 |
+--------------------------+-------+
9 rows in set (0.00 sec)

使用以下代码进行设置:

set global wait_timeout=3;
set global interactive_timeout=3;

(还需要在配置文件中设置,以便在服务器重新启动时生效)

但您只是在处理症状,而不是根本原因-为什么连接还处于开放状态?如果 PHP 脚本已经完成,它们不应该关闭吗?请确保您的 Web 服务器没有使用连接池...


我能在HostGator这样的共享主机上使用这个命令吗?我想减少达到MySQL连接上限并收到TOS电子邮件/关闭的可能性。 - hamish

3

我看不出有什么问题,除非您没有使用连接池进行管理。

如果您使用连接池,这些连接将被重复使用,而不是初始化新的连接。因此,保持打开的连接并重复使用它们比每次重新创建它们要少出问题。


请问您能否建议如何重用现有的开放/空闲连接,而不是创建新连接。我正在使用Spring Boot 2.1.4 + Hikari CP + MariaDB 10.3。是否有一种方法可以配置数据库连接的重用属性? - s developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接