在Linux服务器管理中,安全、可靠地停止数据库是一项至关重要的操作,无论是进行系统维护、数据库升级还是常规重启,一个不恰当的关闭方式都可能导致数据损坏、丢失或需要长时间的恢复,本文将详细介绍在Linux环境下停止主流数据库的标准方法、命令以及最佳实践,确保操作过程既安全又高效。

通用服务管理方法
现代Linux发行版普遍采用systemd作为初始化和服务管理器,而较旧的系统则可能使用SysVinit,停止数据库服务首先需要确定你的系统所使用的管理工具。
使用 systemctl (现代Linux发行版)
对于如Ubuntu 16.04+、CentOS 7+、Debian 8+等现代发行版,systemctl是首选工具,它提供了强大的服务管理功能。
- 停止服务:
sudo systemctl stop <service_name> - 检查状态:
sudo systemctl status <service_name> - 启动服务:
sudo systemctl start <service_name>
systemctl stop命令会发送一个SIGTERM信号给服务进程,请求其优雅地关闭,这给了数据库一个机会来完成正在执行的事务、将缓存中的数据写入磁盘并释放资源。
使用 service (传统Linux发行版)
对于如CentOS 6、Ubuntu 14.04等较旧的系统,service命令是标准操作方式。
- 停止服务:
sudo service <service_name> stop - 检查状态:
sudo service <service_name> status - 启动服务:
sudo service <service_name> start
service命令的底层机制与systemctl类似,也是通过发送信号来控制服务进程,旨在实现优雅关闭。
针对不同数据库的具体操作
不同的数据库在系统中注册的服务名可能略有不同,以下是几种常见数据库的停止命令示例。
停止 MySQL 或 MariaDB
MySQL和MariaDB是最流行的关系型数据库之一,它们的服务名通常是mysqld或mariadb。

- 使用systemctl:
sudo systemctl stop mysqld # 或者对于MariaDB sudo systemctl stop mariadb
- 使用service:
sudo service mysqld stop # 或者对于MariaDB sudo service mariadb stop
MySQL还提供了一个专用的客户端工具mysqladmin来执行关闭操作,这同样是一种优雅的方式:
mysqladmin -u root -p shutdown
停止 PostgreSQL
PostgreSQL是一个功能强大的开源对象-关系型数据库系统,其服务名通常为postgresql-<version>。
- 使用systemctl:
# 假设版本为13 sudo systemctl stop postgresql-13
- 使用service:
# 假设版本为13 sudo service postgresql-13 stop
PostgreSQL也自带控制工具
pg_ctl,可以实现更精细的控制:sudo -u postgres pg_ctl stop -D /var/lib/pgsql/13/data/
停止 MongoDB
作为一个流行的NoSQL文档数据库,MongoDB的服务名通常是mongod。
- 使用systemctl:
sudo systemctl stop mongod
- 使用service:
sudo service mongod stop
停止 Redis
Redis是一个高性能的内存键值数据库,常用于缓存和消息队列,其服务名通常是redis或redis-server。
- 使用systemctl:
sudo systemctl stop redis
- 使用service:
sudo service redis stop
Redis客户端也提供了
SHUTDOWN命令,可以在连接后执行关闭:redis-cli SHUTDOWN
优雅停库与强制停库
上述所有标准命令都旨在实现“优雅停库”,这意味着数据库会:

- 停止接受新的连接。
- 完成当前正在处理的所有事务。
- 将内存中的脏数据(修改后尚未写入磁盘的数据)刷新到数据文件。
- 释放所有资源并正常退出。
但在极少数情况下,数据库可能无响应,无法通过正常命令关闭,这时,可以考虑“强制停库”,但这应该是最后的手段,因为它有数据丢失的风险。
- 使用kill命令:
- 找到数据库主进程的PID(进程ID):
ps aux | grep <process_name>(mysqld) - 首先尝试发送TERM信号(等同于正常停止):
sudo kill -TERM <PID> - 如果无响应,再发送KILL信号(强制终止):
sudo kill -9 <PID>
- 找到数据库主进程的PID(进程ID):
警告:kill -9会立即终止进程,不给数据库任何清理的机会,极易导致数据文件损坏,启动时需要漫长的恢复过程。
命令速查表
为了方便快速查阅,下表小编总结了常用数据库的停止命令。
| 数据库类型 | Systemd 命令 | SysVinit 命令 | 备注 |
|---|---|---|---|
| MySQL / MariaDB | sudo systemctl stop mysqld |
sudo service mysqld stop |
服务名可能为mariadb |
| PostgreSQL | sudo systemctl stop postgresql-13 |
sudo service postgresql-13 stop |
服务名包含版本号 |
| MongoDB | sudo systemctl stop mongod |
sudo service mongod stop |
服务名通常为mongod |
| Redis | sudo systemctl stop redis |
sudo service redis stop |
服务名可能为redis-server |
相关问答FAQs
Q1: 我执行了停止命令,但数据库服务过了一会儿又自动启动了,这是为什么?
A: 这通常是因为数据库服务被设置为了“开机自启”,在systemd系统中,可以使用 systemctl is-enabled <service_name> 来检查服务是否为启用状态,如果显示为 enabled,则表示系统启动或服务异常退出时会自动拉起,要禁止此行为,可以执行 sudo systemctl disable <service_name> 命令来禁用它。
Q2: 如果我直接使用 kill -9 强制停止数据库,最坏会发生什么情况?
A: 最坏的情况是导致数据文件损坏,造成数据丢失,因为kill -9会瞬间终止进程,数据库来不及将内存中的缓存数据(已提交或未提交的事务)写入磁盘,也无法正常关闭文件,这会留下一个不一致的数据库状态,下次启动时,数据库必须执行崩溃恢复(Crash Recovery)过程,这个过程可能非常耗时,甚至可能因损坏严重而无法恢复,需要从备份中还原数据,除非在极端紧急且无法通过正常方式关闭的情况下,否则绝对应避免使用 kill -9。