MySQL/MariaDB服务异常:无法正常停止服务的问题排查求助
解决MariaDB停止后网站仍可访问的问题
咱们一步步拆解你遇到的问题:
1. 先理清服务名的混淆问题
你执行sudo systemctl stop mariadb提示服务未加载,这是因为在Debian系统的早期MariaDB版本(比如你用的10.0.34)中,MariaDB通常沿用了原MySQL的服务名——mysql,而非独立的mariadb服务名。所以你用stop mysql是正确的方向,但为什么网站还能正常运行呢?
2. 可能的原因及排查步骤
(1)数据库服务其实没真正停止
有时候systemctl stop mysql只是发送了停止信号,但进程可能因为锁表、未完成的事务等原因卡住,没有真正退出。你可以:
- 先检查服务状态:
sudo systemctl status mysql,如果输出显示active (running),说明服务没停掉。 - 查看进程列表:
ps aux | grep mysqld,找到所有包含mysqld的进程。如果有存活的进程,用sudo kill -9 <进程ID>(进程ID是输出第二列的数字)强制终止,或者用sudo killall mysqld批量杀死。 - 再次执行
systemctl status mysql确认服务已停止。
(2)网站启用了缓存机制
这是最常见的原因!如果网站开启了页面缓存(比如静态化插件、Redis缓存)或者PHP的OPcache,即使数据库停了,服务器会直接返回缓存的静态页面,看起来网站还能正常运行。你可以:
- 清空网站的应用级缓存(比如WordPress的缓存插件、CMS自带的缓存功能)。
- 重启PHP服务(比如
sudo systemctl restart php7.0-fpm,根据你的PHP版本调整命令),清空OPcache。 - 之后刷新网站,尝试操作需要读写数据库的功能(比如登录后台、提交表单),这时候应该会出现数据库连接失败的错误。
(3)存在持久连接/连接池
如果网站使用了数据库持久连接(比如PHP的mysql_pconnect)或者连接池,已经建立的连接可能不会立即断开,仍能返回旧数据。但这种情况只会维持一段时间,新的请求会无法连接数据库。你可以重启Web服务器(比如sudo systemctl restart apache2或nginx)来切断所有现存连接,再测试网站。
(4)网站部分页面为静态内容
如果网站的首页或部分页面是纯静态HTML文件,不依赖数据库,那即使数据库停了,这些页面也能正常访问。你可以尝试访问需要从数据库读取数据的页面(比如文章列表、用户中心)来验证。
总结
先确认MariaDB进程是否真的被终止,再排查缓存和连接的问题,基本就能找到原因啦。
内容的提问来源于stack exchange,提问作者Anna K




