mysql出现大量Sleep连接时,进行清理的脚本

本文介绍了一个用于清理MySQL中由root用户发起且Host非localhost的睡眠进程的Shell脚本。通过设置group_concat_max_len参数来确保可以获取到足够的信息,并利用information_schema.processlist表来查找符合条件的睡眠进程,然后将这些进程的ID收集起来并执行kill命令进行清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
#! /bin/sh
#
# clear_sleep.sh
# Copyright (C) 2015 root <root@db01>
#
# Distributed under terms of the MIT license.
#

mysql -u root -p123456 -e "SET GLOBAL group_concat_max_len=102400;"
mysql -u root -p123456 -e "select
case count(1)>50
when true
then
(select group_concat(concat('KILL ',id,';') separator '') from information_schema.processlist where Command = 'Sleep' AND user = 'root' and host!='localhost')
else ''
end
from information_schema.processlist where Command = 'Sleep' AND user = 'root' and host!='localhost'
into outfile '/tmp/sleep_processes.txt'"
mysql -u root -p123456 -e "source /tmp/sleep_processes.txt;"
rm -rf /tmp/sleep_processes.txt

 

<think>好的,用户现在需要监控MySQL并报警的Linux Bash脚本。首先,我需要确定用户的需求是什么。他们可能希望实监控MySQL的状态,比如连接数、负载、慢查询等,并在某些指标超过阈值触发警报。 接下来,我得考虑用户可能没有说出来的深层需求。例如,他们可能需要脚本能够自动发送邮件或通过其他方式通知管理员,或者希望脚本能定期运行,比如使用cron定任务。此外,用户可能还关心如何获取MySQL的状态信息,是否需要使用特定的命令或工具,比如mysqladmin或者直接查询数据库。 然后,我需要设计一个结构合理的脚本。通常,监控脚本会包括以下几个部分:获取监控指标、判断是否超过阈值、发送警报。对于MySQL,常见的监控指标包括最大连接数、线程数、缓存命中率、慢查询数量等。每个指标都需要设置合理的阈值,这些阈值可能需要根据用户的实际环境进行调整。 在编写脚本,需要注意权限问题,确保执行脚本的用户有权限访问MySQL的状态信息。可能需要配置mysql的用户名和密码,或者使用.sock文件连接。另外,处理敏感信息如密码,应考虑安全性,比如避免明文存储密码,或者使用配置文件并设置适当的文件权限。 关于报警方式,用户可能希望发送邮件,所以脚本中需要包含发送邮件的命令,比如mail或者curl调用企业微信、钉钉等API。如果用户没有指定具体的方式,可能需要提供多种选项,或者让用户自行修改脚本中的相关部分。 测试也是关键步骤,确保脚本在正常和异常情况下都能正确工作。例如,当连接数超过阈值脚本能正确发送警报邮件。同,需要考虑脚本的健壮性,比如处理命令执行失败的情况,避免因个别命令错误导致整个脚本崩溃。 最后,用户可能需要将脚本加入到定任务中,比如每分钟执行一次。因此,在示例中应该包括如何设置cron job的指导。此外,还需要提醒用户根据实际情况调整阈值和监控项,以及如何维护和更新脚本。 总结下来,我需要提供一个结构清晰、易于配置、具备基本监控功能的Bash脚本,并解释每个部分的作用,以及如何根据用户需求进行调整和扩展。同,要确保脚本的安全性和可靠性,避免潜在的问题。</think>以下是用于监控MySQL状态并触发报警的Linux Bash脚本示例,支持自定义阈值和邮件通知: ```bash #!/bin/bash # 配置区域 MYSQL_USER="root" MYSQL_PASS="your_password" MYSQL_HOST="127.0.0.1" MYSQL_PORT="3306" CHECK_INTERVAL=60 # 检查间隔秒数 WARNING_THRESHOLD=80 # 警戒阈值百分比 EMAIL_ALERT="admin@example.com" # 获取MySQL状态函数 get_mysql_status() { mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW GLOBAL STATUS" 2>/dev/null | awk '{print $1"="$2}' } # 获取MySQL变量函数 get_mysql_vars() { mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW GLOBAL VARIABLES" 2>/dev/null | awk '{print $1"="$2}' } # 监控核心逻辑 monitor_mysql() { status=$(get_mysql_status) vars=$(get_mysql_vars) # 提取关键指标 max_connections=$(echo "$vars" | grep -i "max_connections" | awk -F= '{print $2}') threads_connected=$(echo "$status" | grep -i "Threads_connected" | awk -F= '{print $2}') slow_queries=$(echo "$status" | grep -i "Slow_queries" | awk -F= '{print $2}') qcache_hits=$(echo "$status" | grep -i "Qcache_hits" | awk -F= '{print $2}') qcache_lowmem=$(echo "$status" | grep -i "Qcache_lowmem_prunes" | awk -F= '{print $2}') # 计算使用率 connection_usage=$(echo "scale=2; $threads_connected * 100 / $max_connections" | bc) # 判断阈值并报警 if (( $(echo "$connection_usage > $WARNING_THRESHOLD" | bc -l) )); then send_alert "连接数过高: $connection_usage% ($threads_connected/$max_connections)" fi if [ "$slow_queries" -gt 100 ]; then send_alert "慢查询数过高: $slow_queries" fi if [ "$qcache_lowmem" -gt 1000 ]; then send_alert "查询缓存内存不足: $qcache_lowmem次被清理" fi } # 发送报警函数 send_alert() { local message=$1 echo "MySQL监控警报: $message" | mail -s "MySQL 状态警报" $EMAIL_ALERT echo "[$(date)] 警报已发送: $message" >> /var/log/mysql_monitor.log } # 主循环 while true; do monitor_mysql sleep $CHECK_INTERVAL done ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值