本文目录导读:

我来介绍几种监控数据库连接数的脚本方法:
MySQL 连接数监控
Shell 脚本
#!/bin/bash
# MySQL 连接数监控脚本
DB_USER="root"
DB_PASS="password"
DB_HOST="localhost"
THRESHOLD=100
# 获取当前连接数
CURRENT_CONN=$(mysql -u$DB_USER -p$DB_PASS -h$DB_HOST -e "SHOW STATUS LIKE 'Threads_connected'" | grep Threads_connected | awk '{print $2}')
# 获取最大连接数
MAX_CONN=$(mysql -u$DB_USER -p$DB_PASS -h$DB_HOST -e "SHOW VARIABLES LIKE 'max_connections'" | grep max_connections | awk '{print $2}')
# 计算使用率
USAGE_RATE=$(echo "scale=2; $CURRENT_CONN/$MAX_CONN*100" | bc)
echo "当前连接数: $CURRENT_CONN"
echo "最大连接数: $MAX_CONN"
echo "使用率: $USAGE_RATE%"
# 告警逻辑
if [ $CURRENT_CONN -gt $THRESHOLD ]; then
echo "WARNING: 连接数超过阈值 $THRESHOLD"
# 可以发送告警邮件等
fi
Python 脚本
#!/usr/bin/env python3
import pymysql
import time
import smtplib
from email.mime.text import MIMEText
class MySQLMonitor:
def __init__(self, host='localhost', user='root', password='password'):
self.host = host
self.user = user
self.password = password
self.threshold = 100
def get_connections(self):
conn = pymysql.connect(
host=self.host,
user=self.user,
password=self.password
)
cursor = conn.cursor()
# 获取当前连接数
cursor.execute("SHOW STATUS LIKE 'Threads_connected'")
current_conn = int(cursor.fetchone()[1])
# 获取最大连接数
cursor.execute("SHOW VARIABLES LIKE 'max_connections'")
max_conn = int(cursor.fetchone()[1])
cursor.close()
conn.close()
return current_conn, max_conn
def check_and_alert(self):
current, max_conn = self.get_connections()
usage_rate = (current / max_conn) * 100
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] "
f"当前连接: {current}/{max_conn} ({usage_rate:.2f}%)")
if current > self.threshold:
self.send_alert(current, max_conn)
def send_alert(self, current, max_conn):
# 发送告警逻辑
subject = f"MySQL连接数告警: {current}/{max_conn}"
print(f"ALERT: {subject}")
if __name__ == "__main__":
monitor = MySQLMonitor()
monitor.check_and_alert()
PostgreSQL 连接数监控
Shell 脚本
#!/bin/bash
# PostgreSQL 连接数监控
PG_USER="postgres"
PG_HOST="localhost"
THRESHOLD=80
# 获取当前活跃连接数
CURRENT_CONN=$(psql -h $PG_HOST -U $PG_USER -t -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'active';" | tr -d ' ')
# 获取最大连接数
MAX_CONN=$(psql -h $PG_HOST -U $PG_USER -t -c "SHOW max_connections;" | tr -d ' ')
echo "当前活跃连接: $CURRENT_CONN"
echo "最大连接数: $MAX_CONN"
if [ $CURRENT_CONN -gt $THRESHOLD ]; then
echo "警告: 连接数过高"
fi
Redis 连接数监控
#!/bin/bash
# Redis 连接数监控
REDIS_HOST="localhost"
REDIS_PORT=6379
THRESHOLD=1000
# 获取连接数
CONNECTED_CLIENTS=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT INFO clients | grep connected_clients | cut -d: -f2 | tr -d '\r')
echo "当前Redis连接数: $CONNECTED_CLIENTS"
if [ $CONNECTED_CLIENTS -gt $THRESHOLD ]; then
echo "警告: Redis连接数超过阈值"
fi
通用监控脚本(支持多种数据库)
#!/usr/bin/env python3
import psutil
import sqlite3
import json
import time
from datetime import datetime
class DatabaseMonitor:
def __init__(self, config_file='db_config.json'):
with open(config_file, 'r') as f:
self.config = json.load(f)
def monitor_mysql(self, db_config):
# MySQL监控逻辑
pass
def monitor_postgresql(self, db_config):
# PostgreSQL监控逻辑
pass
def monitor_mongodb(self, db_config):
# MongoDB监控逻辑
import pymongo
client = pymongo.MongoClient(db_config['host'], db_config['port'])
stats = client.admin.command('serverStatus')
current_conn = stats['connections']['current']
available_conn = stats['connections']['available']
return current_conn, current_conn + available_conn
def save_metrics(self, db_type, metrics):
"""保存监控指标到数据库"""
conn = sqlite3.connect('db_monitor.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS connection_metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
db_type TEXT,
current_connections INTEGER,
max_connections INTEGER,
timestamp DATETIME
)
''')
cursor.execute('''
INSERT INTO connection_metrics
(db_type, current_connections, max_connections, timestamp)
VALUES (?, ?, ?, ?)
''', (db_type, metrics['current'], metrics['max'], datetime.now()))
conn.commit()
conn.close()
def run(self):
while True:
for db in self.config['databases']:
if db['type'] == 'mysql':
metrics = self.monitor_mysql(db)
elif db['type'] == 'postgresql':
metrics = self.monitor_postgresql(db)
elif db['type'] == 'mongodb':
metrics = self.monitor_mongodb(db)
self.save_metrics(db['type'], metrics)
# 检查阈值
if metrics['current'] > db.get('threshold', 100):
print(f"告警: {db['type']} 连接数过高")
time.sleep(60) # 每60秒检查一次
if __name__ == "__main__":
monitor = DatabaseMonitor()
monitor.run()
使用系统工具监控
#!/bin/bash
# 使用 ss 命令监控 MySQL 连接
echo "MySQL连接状态:"
ss -tan | grep :3306 | awk '{print $1}' | sort | uniq -c
# 使用 netstat 命令
echo "数据库连接数统计:"
netstat -an | grep -E ":(3306|5432|6379)" | awk '{print $4}' | awk -F: '{print $2}' | sort | uniq -c
Prometheus + Grafana 监控方案
# prometheus.yml
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104'] # mysqld_exporter
- job_name: 'postgresql'
static_configs:
- targets: ['localhost:9187'] # postgres_exporter
监控脚本的部署建议
-
定时执行:
# crontab 配置,每5分钟执行一次 */5 * * * * /path/to/monitor_script.sh
-
日志记录:
# 输出到日志文件 ./monitor.sh >> /var/log/db_monitor.log 2>&1
-
告警通知:
- 邮件通知
- 钉钉/微信机器人
- Slack
- Prometheus AlertManager
- 指标记录:
- 保存到时序数据库(如InfluxDB)
- 可视化到Grafana
这些脚本可以根据具体需求进行修改和扩展,建议结合使用多种监控方式来确保数据库稳定性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播