当前位置:首页 > Linux > 正文

linux 如何关闭mysql

在 Linux 中,可通过 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)

️ 必要前提

  1. 权限验证:需具备 root 或所属用户组权限(如 mysql 用户)
  2. 连接状态:建议提前通知应用层停止写入操作,防止事务未提交
  3. 数据安全:重要业务场景应优先执行 FLUSH TABLES WITH READ LOCK 锁定读操作

标准化关闭流程

方法一:通过 systemd 管理(推荐)

适用于 CentOS 7+/Ubuntu 16.04+ 等采用 systemd 的发行版。

linux 如何关闭mysql  第1张

步骤 命令示例 作用说明 输出特征
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 表空间损坏!


特殊场景处理方案

场景一:数据库卡死无响应

  1. 尝试组合拳:kill -TERM <PID> → 等待 30s → kill -KILL <PID>
  2. 检查磁盘空间:df -h 确保数据目录所在分区可用空间 > 1GB
  3. 分析慢查询日志: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 进行元数据更新。


最佳实践建议

  1. 监控集成:将 systemctl 操作纳入 Zabbix/Prometheus 监控模板
  2. 审计追踪:启用 audit_log_filter 记录管理员操作
  3. 灾备准备:制作包含 ibdata1ib_logfile 的完整物理备份
  4. 版本控制:使用 etckeeper 管理配置文件变更历史

通过以上方法,可实现从日常维护到应急处理的全场景覆盖,实际操作时应始终遵循「先备份,后操作」原则,并在测试环境充分验证后再应用于

0