sudo systemctl stop mysql
(或 mysqld
)快速关闭;若为旧版系统,可用 sudo service mysql stop
;也可通过 ps -ef | grep mysql
找到进程 ID 后执行 kill -9 [PID]
强制核心概念与前置条件
✅ 基础认知
术语 | 说明 |
---|---|
mysqld |
MySQL 主守护进程,负责监听端口并执行 SQL 请求 |
PID | Process ID,用于定位正在运行的 MySQL 进程 |
systemd | Linux 统一服务管理器,现代发行版默认采用 |
init.d | 传统 SysVinit 脚本目录,部分旧系统仍保留 |
SIGTERM/SIGINT | 标准信号量,分别对应优雅退出(15)和快速中断(2) |
⚠️ 必要前提
- 权限验证:需具备
root
或所属用户组权限(如mysql
用户) - 连接状态:建议提前通知应用层停止写入操作,防止事务未提交
- 数据安全:重要业务场景应优先执行
FLUSH TABLES WITH READ LOCK
锁定读操作
标准化关闭流程
🔧 方法一:通过 systemd 管理(推荐)
适用于 CentOS 7+/Ubuntu 16.04+ 等采用 systemd 的发行版。
步骤 | 命令示例 | 作用说明 | 输出特征 |
---|---|---|---|
1 | systemctl stop mysql |
发送 SIGTERM 信号,触发正常关闭流程 | 显示 “Stopped…” |
2 | systemctl status mysql |
验证服务状态变为 disabled/inactive | ActiveEnterprise=no |
3 | journalctl -u mysql |
查看关闭过程日志(含错误堆栈) | 记录完整关闭时间线 |
进阶操作:
- 立即重启:
systemctl restart mysql
- 定时任务:
crontab -e
添加@daily systemctl stop mysql && sleep 60 && systemctl start mysql
- 禁用开机启动:
systemctl disable mysql
⚙️ 方法二:传统 init.d 脚本
适用于 SUSE/旧版 RHEL 等未完全迁移至 systemd 的环境。
命令 | 功能描述 | 注意事项 |
---|---|---|
/etc/init.d/mysql stop |
调用 LSB Init Script 关闭服务 | 部分系统需替换为 mysqld |
/etc/init.d/mysql status |
检查服务状态 | 返回值 0=运行中,3=已停止 |
/etc/init.d/mysql restart |
重启服务 | 会先执行 stop 再 start |
🖥️ 方法三:直接终止进程(应急方案)
仅在常规方法失效时使用,可能导致数据丢失!
操作步骤 | 命令示例 | 风险等级 |
---|---|---|
查找进程号 | ps aux | grep mysqld |
|
发送终止信号 | kill -15 <PID> |
|
强制终止(慎用!) | kill -9 <PID> |
|
批量清理僵尸进程 | pkill -9 mysqld |
警告:kill -9
会跳过事务回滚,可能造成 InnoDB 表空间损坏!
特殊场景处理方案
🚨 场景一:数据库卡死无响应
- 尝试组合拳:
kill -TERM <PID>
→ 等待 30s →kill -KILL <PID>
- 检查磁盘空间:
df -h
确保数据目录所在分区可用空间 > 1GB - 分析慢查询日志:
cat /var/lib/mysql/-slow.log
定位阻塞源
🛡️ 场景二:计划内维护窗口
#!/bin/bash # 安全关闭脚本示例 echo "Starting graceful shutdown at $(date)" >> /var/log/mysql_shutdown.log systemctl stop mysql sleep 10 # 等待残留进程退出 pgrep mysqld || echo "All processes terminated successfully" >> /var/log/mysql_shutdown.log
📊 性能对比表
方法 | 耗时(s) | 资源占用 | 数据完整性保障 | 适用场景 |
---|---|---|---|---|
systemctl stop | 8-15 | 低 | 日常维护 | |
init.d script | 10-20 | 中 | 兼容旧系统 | |
kill -15 | 5-8 | 高 | 次要组件升级 | |
kill -9 | <2 | 极高 | 灾难恢复前清场 |
常见错误诊断
错误现象 | 可能原因 | 解决方案 |
---|---|---|
Job failed to start | 端口被占用/配置文件语法错误 | netstat -tulnp | grep 3306 |
Table is marked as crashed | 非正常关机导致索引损坏 | myisamchk --recover |
Can’t connect to server | 防火墙阻断/套接字文件缺失 | iptables -L + lsof -i :3306 |
相关问答 FAQs
Q1: 为什么执行 systemctl stop mysql
后仍有进程残留?
A: 可能存在以下原因:① 多实例部署(通过 ps aux | grep mysql
核查);② 第三方插件未注册到 systemd;③ 跨分区挂载导致信号传递延迟,建议使用 pkill -TERM mysqld
补刀,并通过 ss -tulnp | grep 3306
确认端口释放。
Q2: 如何在不重启系统的情况下重建 MySQL 配置?
A: 可采用滚动升级策略:① 修改 /etc/my.cnf
后发送 SIGHUP
信号:kill -HUP <主进程PID>
;② 对主从架构,需依次切换读写分离;③ 复杂变更建议通过逻辑备份+全新安装实现,注意修改完配置后必须运行 mysql_upgrade
进行元数据更新。
最佳实践建议
- 监控集成:将
systemctl
操作纳入 Zabbix/Prometheus 监控模板 - 审计追踪:启用
audit_log_filter
记录管理员操作 - 灾备准备:制作包含
ibdata1
和ib_logfile
的完整物理备份 - 版本控制:使用 etckeeper 管理配置文件变更历史
通过以上方法,可实现从日常维护到应急处理的全场景覆盖,实际操作时应始终遵循「先备份,后操作」原则,并在测试环境充分验证后再应用于
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/105347.html