在 Linux 服务器运维中,MySQL 数据库作为核心数据存储组件,其稳定运行直接决定业务可用性。不少用户在使用 WordPress 等程序时,常会遇到 “建立数据库连接时出错” 的故障,其中MySQL 意外停止是最常见诱因。本文将详解 MySQL 中断的核心原因,并提供两种适配不同运维场景的 Shell 脚本方案,结合定时任务实现 MySQL 故障自动恢复,保障服务持续稳定。
一、MySQL 频繁中断?这 4 大原因要先排查
二、两种 Shell 脚本方案,适配
方案 1:宝塔面板用户专用(简单高效)
#!/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
方案 2:通用场景(无面板 / 自定义环境)
1. 编写 MySQL 监控脚本
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 -e
2.在文件末尾添加以下内容(每 15 分钟执行一次,可根据需求修改时间间隔):
# MySQL自动监控与重启任务:每15分钟执行一次
*/15 * * * * /bin/bash /root/mysql_monitor_restart.sh
2.保存退出后,重启 Crond 服务(确保任务生效,不同系统命令略有差异):
三、扩展:多服务统一监控(PHP/NGINX/Redis)
#!/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
四、注意事项
© 版权声明
文章版权归原作者所有,本站只做转载和学习以及开发者个人原创。声明:下载本站资源即同意用户协议,本站程序仅供内部学习研究软件设计思想和原理使用,学习研究后请自觉删除,请勿传播,因未及时删除所造成的任何后果责任自负。
THE END
暂无评论内容