Linux Shell 脚本:实时监控 MySQL 状态,异常中断自动重启方案

在 Linux 服务器运维中,MySQL 数据库作为核心数据存储组件,其稳定运行直接决定业务可用性。不少用户在使用 WordPress 等程序时,常会遇到 “建立数据库连接时出错” 的故障,其中MySQL 意外停止是最常见诱因。本文将详解 MySQL 中断的核心原因,并提供两种适配不同运维场景的 Shell 脚本方案,结合定时任务实现 MySQL 故障自动恢复,保障服务持续稳定。

20250912132033874-image

一、MySQL 频繁中断?这 4 大原因要先排查

正常运行的 MySQL 突然停止,通常与服务器资源、外部攻击或业务负载相关,主要集中在以下 4 类问题:

 

  1. 服务器存储空间耗尽:MySQL 运行需依赖日志写入、临时文件存储,当根目录或数据盘满额时,进程会因无法读写数据强制终止;
  2. 服务器遭受恶意攻击:如 CC 攻击、SQL 注入等恶意行为,可能导致 MySQL 连接数超限、资源被占用,最终引发进程崩溃;
  3. 数据库读写负载过高:WordPress 等程序若未配置缓存,高频次的文章查询、用户交互会导致 MySQL 并发压力剧增,触发进程保护机制;
  4. 服务器基础性能不足:内存、CPU 配置过低,当 MySQL 占用资源超过服务器承载上限时,系统会优先终止高耗资源进程以保障基础运行。

 

针对 “读写负载过高” 问题,建议优先为 WordPress 配置Memcached 或 Redis 缓存,减少数据库直接访问次数,从根源降低 MySQL 中断概率。

二、两种 Shell 脚本方案,适配

根据服务器是否使用宝塔面板,可选择对应的自动化监控脚本,实现 MySQL 状态实时检测与自动重启。

方案 1:宝塔面板用户专用(简单高效)

宝塔面板自带 “计划任务” 功能,无需手动配置定时任务,直接添加 Shell 脚本即可实现监控,步骤如下:
  1. 登录宝塔面板,进入「计划任务」模块,点击「创建任务」;
  2. 任务配置如下:
    • 任务类型:选择「Shell 脚本」;
    • 执行周期:设置为「N 分钟」,建议默认 15 分钟(可根据业务敏感度调整,如核心业务设 5 分钟);
    • 脚本内容:复制下方代码(优化进程检测逻辑,提升兼容性):
#!/bin/bash
# 功能:宝塔面板环境下MySQL状态检测与自动重启
# 适用环境:宝塔Linux面板

# 检测mysqld进程是否存在,屏蔽冗余输出
pgrep -x mysqld > /dev/null 2>&1
# 若进程不存在(返回值非0),先释放内存再重启MySQL
if [ $? -ne 0 ];then
    /www/server/panel/script/rememory.sh  # 宝塔内存释放脚本
    /etc/init.d/mysqld start              # 启动MySQL服务
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] MySQL进程中断,已自动重启" >> /var/log/mysql_restart.log
fi
  1. 点击「保存」,任务将按设定周期自动执行,同时日志会记录重启历史(路径:/var/log/mysql_restart.log),便于后续排查。

方案 2:通用场景(无面板 / 自定义环境)

若服务器未使用宝塔面板,或采用自定义运维架构,可通过 “Shell 脚本 + Crontab 定时任务” 实现监控,步骤分为「脚本制作」和「定时任务配置」两部分:

1. 编写 MySQL 监控脚本

  1. 登录 Linux 服务器(建议 root 用户,确保权限充足),使用 vim 创建脚本文件:
vim /root/mysql_monitor_restart.sh

复制下方代码到文件中(优化进程检测逻辑,增加日志记录,便于问题追溯):

#!/bin/bash
# 功能:通用Linux环境下MySQL状态检测与自动重启
# 适用环境:无面板/LNMP/LAMP等自定义Linux环境

# 定义MySQL启动命令(不同系统可能为mysql或mysqld,可通过which mysql确认)
MYSQL_START_CMD="/etc/init.d/mysql start"
# 定义日志存储路径,记录重启记录
LOG_FILE="/var/log/mysql_monitor.log"

# 检测mysqld进程是否运行
pgrep -x mysqld > /dev/null 2>&1
# 进程不存在时执行重启操作
if [ $? -ne 0 ];then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 检测到MySQL已停止,开始执行重启..." >> $LOG_FILE
    # 执行启动命令,将启动日志写入文件
    $MYSQL_START_CMD >> $LOG_FILE 2>&1
    # 再次检测,确认重启结果
    pgrep -x mysqld > /dev/null 2>&1
    if [ $? -eq 0 ];then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] MySQL重启成功" >> $LOG_FILE
    else
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] MySQL重启失败,请手动检查服务配置" >> $LOG_FILE
    fi
else
    # 进程正常时,可选记录运行状态(减少日志冗余,可注释)
    # echo "[$(date +'%Y-%m-%d %H:%M:%S')] MySQL运行正常" >> $LOG_FILE
fi

保存并退出 vim(按Esc,输入:wq回车),然后赋予脚本执行权限:

chmod +x /root/mysql_monitor_restart.sh

2. 配置 Crontab 定时任务

通过 Crontab 设置周期性执行脚本,实现 “实时监控” 效果:
  1. 编辑 Crontab 任务列表:
crontab -e

     2.在文件末尾添加以下内容(每 15 分钟执行一次,可根据需求修改时间间隔):

# MySQL自动监控与重启任务:每15分钟执行一次
*/15 * * * * /bin/bash /root/mysql_monitor_restart.sh

    2.保存退出后,重启 Crond 服务(确保任务生效,不同系统命令略有差异):

    • CentOS/RHEL 系统:systemctl restart crond
    • Ubuntu/Debian 系统:systemctl restart cron

三、扩展:多服务统一监控(PHP/NGINX/Redis)

若需同时监控 PHP、NGINX、Redis 等核心服务,可扩展脚本逻辑,示例如下(保存为service_monitor.sh):
#!/bin/bash
# 功能:监控MySQL/PHP/NGINX/Redis并自动重启
# 日志路径
LOG_FILE="/var/log/service_monitor.log"

# 定义服务列表与启动命令
SERVICES=(
    "mysqld:/etc/init.d/mysql start"
    "php-fpm:/etc/init.d/php-fpm start"  # 不同PHP版本可能为php-fpm74等,需对应修改
    "nginx:/etc/init.d/nginx start"
    "redis-server:/etc/init.d/redis start"
)

# 循环检测每个服务
for service in "${SERVICES[@]}"; do
    # 拆分服务名与启动命令
    SERVICE_NAME=$(echo $service | cut -d: -f1)
    START_CMD=$(echo $service | cut -d: -f2)
    
    # 检测服务进程
    pgrep -x $SERVICE_NAME > /dev/null 2>&1
    if [ $? -ne 0 ];then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] $SERVICE_NAME 已停止,执行重启..." >> $LOG_FILE
        $START_CMD >> $LOG_FILE 2>&1
        # 验证重启结果
        pgrep -x $SERVICE_NAME > /dev/null 2>&1
        [ $? -eq 0 ] && echo "[$(date +'%Y-%m-%d %H:%M:%S')] $SERVICE_NAME 重启成功" >> $LOG_FILE || echo "[$(date +'%Y-%m-%d %H:%M:%S')] $SERVICE_NAME 重启失败" >> $LOG_FILE
    fi
done
同样赋予执行权限(chmod +x /root/service_monitor.sh),并添加到 Crontab 定时任务即可。

四、注意事项

  1. 命令适配性:不同 Linux 发行版(如 CentOS、Ubuntu)的 MySQL 启动命令可能不同(如/etc/init.d/mysqlsystemctl start mysql),需根据实际环境调整脚本中的启动命令;
  2. 日志查看:脚本中添加了日志记录功能,可通过cat /var/log/mysql_restart.log(或对应日志路径)查看服务状态与重启历史,便于定位长期故障;
  3. 权限问题:若非 root 用户执行脚本,需确保用户拥有pgrep命令权限及 MySQL 服务启动权限,避免因权限不足导致重启失败。
通过上述方案,可实现 MySQL 及其他核心服务的自动化监控与故障恢复,大幅降低人工运维成本,尤其适合中小网站、个人博客等场景,保障业务 7×24 小时稳定运行。
 
🎀 🌸

📜 重要提示:
如有解压密码:看下载页、看下载页、看下载页。
源码工具资源类具有可复制性: 建议具有一定思考和动手能力的用户购买。
请谨慎考虑: 小白用户和缺乏思考动手能力者不建议赞助。
虚拟商品购买须知: 虚拟类商品,一经打赏赞助,不支持退款。请谅解,谢谢合作!
邻兔跃官网:lt.lintuyue.com(如有解压密码看下载页说明)。

文章版权声明 1、本网站名称:邻兔跃lT
2、本站永久网址:https://lt.lintuyue.com/
3、本站内容主要来源于互联网优质资源整合、网友积极投稿以及部分原创内容,仅供内部学习研究软件设计思想和原理使用,学习研究后请自觉删除,请勿传播,因未及时删除所造成的任何后果责任自负,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容