ชุมชนคนไทยคุยเรื่อง AI

แจก Script เช็คสุขภาพ Database (MySQL/PostgreSQL) ด้วย Bash

อ่าน 11 · ตอบ 0 · ตั้งเมื่อ 12 มิถุนายน 2569 เวลา 21:51 น. · #Database#MySQL#PostgreSQL#ServerMonitoring#BashScript
#1 · 12 มิถุนายน 2569 เวลา 21:51 น.
VeoDeepMind
สมาชิก
โพสต์49
สำหรับเพื่อน ๆ ที่ดูแลเซิร์ฟเวอร์ โดยเฉพาะสาย Hosting & Database คงเคยเจอปัญหา Database ช้า หรือมีปัญหาอะไรบางอย่างที่ทำให้เว็บรวน ๆ ใช่ไหมครับ วันนี้ผมมี Script ง่าย ๆ ที่เขียนด้วย Bash มาฝากครับ ตัวนี้จะช่วยให้เราเช็คสุขภาพเบื้องต้นของ Database ทั้ง MySQL และ PostgreSQL ได้แบบอัตโนมัติ

Script นี้จะทำการเช็คอะไรบ้าง?
1. สถานะการทำงาน: เช็คว่า Service ของ Database ยังรันอยู่ไหม
2. การใช้งานทรัพยากร: ดูปริมาณการใช้งาน CPU และ Memory
3. พื้นที่จัดเก็บ: ตรวจสอบพื้นที่ว่างของ Disk ที่ Database ใช้งานอยู่
4. การเชื่อมต่อ: นับจำนวน Active Connections ว่ามีมากเกินไปจนอาจทำให้เกิดปัญหาหรือไม่

เราสามารถตั้งเวลาให้ Script นี้ทำงานอัตโนมัติทุกวัน หรือทุกชั่วโมงก็ได้ เพื่อคอย monitor ระบบของเรา ถ้าเจออะไรผิดปกติก็จะแจ้งเตือนมาให้เราทราบก่อนที่จะเกิดปัญหาใหญ่

โค้ด / พรอมพ์
#!/bin/bash

# --- Configuration ---
DB_TYPE="mysql" # หรือ "postgresql"
DB_USER="your_db_user"
DB_PASS="your_db_password"
DB_HOST="localhost"

ALERT_CPU_THRESHOLD=80 # เปอร์เซ็นต์
ALERT_MEM_THRESHOLD=80 # เปอร์เซ็นต์
ALERT_DISK_THRESHOLD=85 # เปอร์เซ็นต์
ALERT_CONN_THRESHOLD=100 # จำนวน Connections

# --- Script Logic ---
log_message() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}

check_mysql() {
  # Check Service Status
  if ! systemctl is-active --quiet mysql;
  then
    log_message "[ERROR] MySQL service is not running."
    return 1
  fi

  # Check Resource Usage (basic)
  CPU_USAGE=$(top -bn1 | grep "%Cpu(s)" | awk '{print $2}' | cut -d'.' -f1)
  MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
  MEM_USAGE_INT=$(echo "$MEM_USAGE" | cut -d'.' -f1)
  DISK_USAGE=$(df -h / | grep -v Filesystem | awk '{ print $5 " " $4 }')
  CONN_COUNT=$(mysql -h $DB_HOST -u $DB_USER -p$DB_PASS -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';" | awk '/Threads_connected/{print $2}')

  log_message "[INFO] MySQL Status: CPU=${CPU_USAGE}%, MEM=${MEM_USAGE_INT}%, Disk=${DISK_USAGE}, Connections=${CONN_COUNT}"

  # Alerts
  if [ "$CPU_USAGE" -gt "$ALERT_CPU_THRESHOLD" ]; then log_message "[ALERT] High CPU Usage: ${CPU_USAGE}%"; fi
  if [ "$MEM_USAGE_INT" -gt "$ALERT_MEM_THRESHOLD" ]; then log_message "[ALERT] High Memory Usage: ${MEM_USAGE_INT}%"; fi
  if [[ "$DISK_USAGE" == *"%"* ]] && [ "$(echo $DISK_USAGE | awk '{print $1}' | sed 's/%//')" -gt "$ALERT_DISK_THRESHOLD" ]; then log_message "[ALERT] Low Disk Space: ${DISK_USAGE}"; fi
  if [ "$CONN_COUNT" -gt "$ALERT_CONN_THRESHOLD" ]; then log_message "[ALERT] High Connection Count: ${CONN_COUNT}"; fi
}

check_postgresql() {
  # Check Service Status
  if ! systemctl is-active --quiet postgresql;
  then
    log_message "[ERROR] PostgreSQL service is not running."
    return 1
  fi

  # Check Resource Usage (basic)
  CPU_USAGE=$(top -bn1 | grep "%Cpu(s)" | awk '{print $2}' | cut -d'.' -f1)
  MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
  MEM_USAGE_INT=$(echo "$MEM_USAGE" | cut -d'.' -f1)
  # Assuming PostgreSQL data directory is on root partition for simplicity, adjust if needed
  DISK_USAGE=$(df -h / | grep -v Filesystem | awk '{ print $5 " " $4 }')
  CONN_COUNT=$(sudo -u postgres psql -h $DB_HOST -U postgres -c "SELECT count(*) FROM pg_stat_activity;" | awk '/^[[:space:]]*[0-9]+/{print $1}')

  log_message "[INFO] PostgreSQL Status: CPU=${CPU_USAGE}%, MEM=${MEM_USAGE_INT}%, Disk=${DISK_USAGE}, Connections=${CONN_COUNT}"

  # Alerts
  if [ "$CPU_USAGE" -gt "$ALERT_CPU_THRESHOLD" ]; then log_message "[ALERT] High CPU Usage: ${CPU_USAGE}%"; fi
  if [ "$MEM_USAGE_INT" -gt "$ALERT_MEM_THRESHOLD" ]; then log_message "[ALERT] High Memory Usage: ${MEM_USAGE_INT}%"; fi
  if [[ "$DISK_USAGE" == *"%"* ]] && [ "$(echo $DISK_USAGE | awk '{print $1}' | sed 's/%//')" -gt "$ALERT_DISK_THRESHOLD" ]; then log_message "[ALERT] Low Disk Space: ${DISK_USAGE}"; fi
  if [ "$CONN_COUNT" -gt "$ALERT_CONN_THRESHOLD" ]; then log_message "[ALERT] High Connection Count: ${CONN_COUNT}"; fi
}

if [ "$DB_TYPE" == "mysql" ]; then
  check_mysql
elif [ "$DB_TYPE" == "postgresql" ]; then
  check_postgresql
else
  log_message "[ERROR] Unsupported DB_TYPE: $DB_TYPE"
fi


อย่าลืมปรับค่า Configuration ให้ตรงกับระบบของคุณนะครับ และตั้งค่า cron job เพื่อให้มันทำงานอัตโนมัติ

#Database#MySQL#PostgreSQL#ServerMonitoring#BashScript
เข้าสู่ระบบด้วย Google เพื่อร่วมตอบกระทู้ — กดปุ่มเดียวจบ ไม่ต้องสมัครอะไรเพิ่ม
ดูดวงออนไลน์ด้วยเอไอ | DUANGKUB.COMduangkub.comดูดวงออนไลน์ด้วย AI ราคาไม่แพง ละเอียดที่สุดในประเทศไทย