解决MySQL8小时无连接自动关闭问题
2024-10-10 12:18:23

最近部署了nest-admin线上环境,但是线上的MySQL总是在次日无法连接,每次都要重启。

一开始没弄明白的时候,被这个定期关机的情况折腾的心累。

后来稍微搜了一下,才发现这事儿好像是线上长时间断连之后,MySQL会自动关闭导致的。

正文

经测试,此方法虽然在一定程度上缓解了这种问题,但是似乎并不能完美解决数据库断连的问题,如果有更好的办法,还请评论留言。

这里以常见的MySQL数据库为例,介绍如何配置其自动重启功能。

这些步骤同样适用于其他类型的数据库服务,如PostgreSQL、MongoDB等,但具体的命令和服务名称可能会有所不同。

在此之前,请确保已经装过了MySQL工具,另外,部分命令可能因为MySQL的版本不同而有差异,推荐用通义千问之类的AI工具辅助操作。

确保服务开机自启

对于大多数Linux发行版,可以通过以下命令来设置MySQL服务开机自启动:

1
sudo systemctl enable mysqld

这会创建一个符号链接到/etc/systemd/system/multi-user.target.wants/目录下,使得systemd在启动multi-user目标时也会启动MySQL服务。

配置systemd自动重启策略

为了使数据库服务在意外停止时能够自动重启,可以编辑服务的systemd单元文件,添加或修改[Service]部分中的Restart选项。

对于MySQL,文件通常位于/lib/systemd/system/mysql.service/etc/systemd/system/mysql.service

1
sudo nano /lib/systemd/system/mysqld.service

在文件中加入或修改如下内容:

1
2
3
ini[Service]
Restart=always
RestartSec=10s
  • Restart=always 指定当服务退出时,systemd将总是尝试重启它。
  • RestartSec=10s 定义了systemd在尝试重新启动服务前等待的时间。

修改完成后,重载systemd配置并重启MySQL服务:

1
2
sudo systemctl daemon-reload
sudo systemctl restart mysqld.service

sudo systemctl daemon-reload 是一个用于刷新 systemd 系统和服务管理器配置的命令。

执行该命令后,systemd 会重新加载所有服务单元文件,包括新添加的或已修改的单元文件。

这个命令通常在修改了服务配置文件(如 .service 文件)之后使用,以使更改生效。

无需重启系统即可应用新的配置,提高了配置调整的效率和灵活性。

测试自动重启功能

为了验证上述配置是否有效,你可以手动停止MySQL服务,并观察它是否按照预期自动重启:

1
sudo systemctl stop mysqld

然后等待一段时间,检查服务状态:

1
sudo systemctl status mysqld

如果一切正常,你应该能看到服务已经自动重新启动。

监控与日志

为了更好地管理和监控数据库服务的状态,建议设置日志记录和告警机制。

可以利用Linux的日志系统(如syslog)或者第三方工具(如Prometheus, Grafana)来实现这一目的。

通过以上步骤,你可以为Linux环境下的数据库服务配置自动重启功能,从而提高系统的可靠性和可用性。

修改MySQL配置

如果你的配置不是8小时无连接导致的自动断连,可能是你的配置有问题。

你可以通过修改间隔时长,至少保证不会因为间隔时间太短导致频繁断连。

interactive_timeout参数,定义了对于交互式连接,服务端等待数据的最大时间。

如果超过这个时间,服务端仍然没有收到数据,则会关闭连接,默认是28800,单位秒,即8个小时。

linux系统

打开/etc/my.cnf,在属性组mysqld下面添加如下参数。

这样,我们有8H的间隔连接时间,这样我们

1
2
interactive_timeout=28800000
wait_timeout=28800000

windows系统

和linux一样,打开my.ini,添加同样配置

1
2
interactive_timeout=28800000
wait_timeout=28800000

有实践表明,没有办法把这个值设置成无限大,即永久。

因此如果你无法保证你的应用程序必定在设定的秒数内至少有一次操作,那么最好用第二个方法解决这个问题。

结语

我目前采用的方法算是治标不治本,简单的来说,就是设置一个定时重启MySQL的脚本配置,保证MySQL不断连。

实际开发中,大多使用连接池或者其他方式来解决这种问题,后续随着我对后端的深入,我会使用考虑使用其他方式来解决此类问题。

目前先用配置这种笨一些的方式吧,至少简单好用,能解决问题。

参考

通义千问

MySQL 的连接时长控制–interactive_timeout和wait_timeout - 翔云123456 - 博客园 (cnblogs.com)

如何解决mysql数据库8小时无连接自动关闭