Tạo Script khởi động lại MySQL khi bị stop trên máy chủ Linux với 3 bước vô cùng đơn giản.
Giới thiệu
Trong quá trình vận hành và quản trị máy chủ Linux, hiện tượng dịch vụ MySQL dừng đột ngột hoặc treo là một sự cố không hiếm gặp. Với kinh nghiệm thực tế, chúng tôi nhận thấy phần lớn nguyên nhân xuất phát từ việc:
- Dung lượng ổ cứng bị đầy
- Máy chủ vượt quá giới hạn tài nguyên RAM
Trong trường hợp thứ hai, khi hệ thống thiếu hụt bộ nhớ nghiêm trọng, cơ chế OOM Killer (Out-of-Memory Killer) sẽ tự động kết thúc các tiến trình tiêu tốn nhiều tài nguyên, trong đó MySQL thường là ứng cử viên hàng đầu.
Để xử lý từng tình huống:
- Nếu MySQL dừng do đầy dung lượng: Cần kiểm tra và giải phóng không gian lưu trữ bằng cách xóa các file log không cần thiết hoặc dữ liệu rỗng trước khi khởi động lại dịch vụ.
- Nếu nguyên nhân do thiếu RAM hoặc chưa xác định được: Triển khai cơ chế giám sát và tự động khởi động lại dịch vụ thông qua Cron Job là giải pháp tối ưu, như được hướng dẫn chi tiết trong bài viết dưới đây.
Hướng dẫn triển khai Script tự động giám sát và khởi động lại MySQL
Phần 1: Thiết lập kết nối đến máy chủ
Để triển khai cơ chế tự động khởi động MySQL thông qua Cron Job, trước hết cần thiết lập kết nối SSH đến máy chủ Linux với quyền root hoặc tài khoản có đặc quyền sudo.
Lưu ý: Đảm bảo tuân thủ các biện pháp bảo mật khi kết nối từ xa. Tham khảo: [Hướng dẫn bảo mật kết nối SSH]
Sau khi xác thực thành công, tiến hành Bước 2.
Phần 2: Hướng dẫn tạo Script giám sát nâng cao cho MySQL/MariaDB
Bước 1: Tạo script với tích hợp Telegram
Tạo file script:
mkdir -p /opt/scripts/monitoring
vi /opt/scripts/monitoring/mysql_monitor_advanced.shNội dung script nâng cao với Telegram:
#!/bin/bash
# =============================================
# SCRIPT GIÁM SÁT MYSQL/MARIADB NÂNG CAO
# Version: 2.1
# Author: System Administrator
# =============================================
# CẤU HÌNH BIẾN
SERVICE="mysql" # Thay đổi thành "mariadb" nếu sử dụng MariaDB
LOG_FILE="/var/log/mysql_monitor.log"
MAX_LOG_SIZE="10M" # Kích thước log tối đa
RETRY_COUNT=3 # Số lần thử khởi động lại
WAIT_TIME=5 # Thời gian chờ giữa các lần thử (giây)
# CẤU HÌNH TELEGRAM
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN_HERE"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID_HERE"
TELEGRAM_API_URL="https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage"
# HÀM KIỂM TRA VÀ XOAY LOG
manage_log() {
if [ -f "$LOG_FILE" ] && [ "$(stat -c%s "$LOG_FILE" 2>/dev/null || echo 0)" -gt 10485760 ]; then
mv "$LOG_FILE" "${LOG_FILE}.old"
touch "$LOG_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Log file rotated" >> "$LOG_FILE"
fi
}
# HÀM GHI LOG
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
logger -t "MySQLMonitor" "$1" # Ghi đồng thời vào syslog
}
# HÀM GỬI CẢNH BÁO TELEGRAM
send_telegram_alert() {
local message="$1"
local hostname=$(hostname)
local full_message="🚨 *MySQL Monitor - ${hostname}*
📝 ${message}
⏰ Time: $(date '+%Y-%m-%d %H:%M:%S')
🖥️ Host: ${hostname}"
# Gửi tin nhắn đến Telegram
curl -s -X POST "$TELEGRAM_API_URL" \
-d chat_id="$TELEGRAM_CHAT_ID" \
-d text="$full_message" \
-d parse_mode="Markdown" \
> /dev/null
log_message "Telegram alert sent: $message"
}
# HÀM KIỂM TRA VÀ KHỞI ĐỘNG LẠI DỊCH VỤ
restart_service() {
local service_name=$1
local attempt=1
while [ $attempt -le $RETRY_COUNT ]; do
log_message "Attempt $attempt to restart $service_name..."
send_telegram_alert "🔄 Attempting to restart ${service_name} (Attempt ${attempt}/${RETRY_COUNT})"
systemctl start "$service_name"
sleep $WAIT_TIME
if systemctl is-active --quiet "$service_name"; then
log_message "$service_name restarted successfully on attempt $attempt"
send_telegram_alert "✅ ${service_name} restarted successfully on attempt ${attempt}"
return 0
fi
attempt=$((attempt + 1))
done
log_message "CRITICAL: Failed to restart $service_name after $RETRY_COUNT attempts"
send_telegram_alert "❌ CRITICAL: Failed to restart ${service_name} after ${RETRY_COUNT} attempts! Manual intervention required!"
return 1
}
# HÀM KIỂM TRA TÀI NGUYÊN HỆ THỐNG
check_system_resources() {
local memory_usage=$(free | awk 'NR==2{printf "%.2f", $3*100/$2}')
local disk_usage=$(df / | awk 'NR==2{print $5}' | sed 's/%//')
local load_average=$(cat /proc/loadavg | awk '{print $1}')
# Kiểm tra memory usage
if (( $(echo "$memory_usage > 90" | bc -l 2>/dev/null || echo 0) )); then
log_message "WARNING: High memory usage detected: ${memory_usage}%"
send_telegram_alert "⚠️ High memory usage: ${memory_usage}%"
fi
# Kiểm tra disk usage
if [ "$disk_usage" -gt 90 ]; then
log_message "WARNING: High disk usage detected: ${disk_usage}%"
send_telegram_alert "⚠️ High disk usage: ${disk_usage}% - MySQL may stop due to lack of space"
fi
# Kiểm tra load average
local cpu_cores=$(nproc)
local load_threshold=$(echo "$cpu_cores * 0.8" | bc)
if (( $(echo "$load_average > $load_threshold" | bc -l) )); then
log_message "WARNING: High load average: ${load_average} (CPUs: ${cpu_cores})"
send_telegram_alert "⚠️ High load average: ${load_average} (CPUs: ${cpu_cores})"
fi
}
# HÀM KIỂM TRA KẾT NỐI MYSQL
check_mysql_connection() {
if systemctl is-active --quiet "$SERVICE"; then
# Thử kết nối đến MySQL (giả sử không cần password hoặc sử dụng .my.cnf)
if command -v mysql &> /dev/null; then
if mysql -e "SELECT 1;" &> /dev/null; then
log_message "✓ MySQL connection test: SUCCESS"
else
log_message "✗ MySQL connection test: FAILED"
send_telegram_alert "🔴 MySQL is running but cannot establish connection!"
fi
fi
fi
}
# =============================================
# MAIN EXECUTION
# =============================================
# Kiểm tra và quản lý log file
manage_log
log_message "=== Starting MySQL monitoring check ==="
# Kiểm tra tài nguyên hệ thống
check_system_resources
# Kiểm tra trạng thái dịch vụ
if systemctl is-active --quiet "$SERVICE"; then
log_message "✓ $SERVICE is running normally"
# Kiểm tra kết nối MySQL nếu dịch vụ đang chạy
check_mysql_connection
else
log_message "✗ $SERVICE is stopped. Initiating restart procedure..."
send_telegram_alert "🔴 ${SERVICE} is stopped! Initiating auto-recovery..."
# Thử khởi động lại dịch vụ
if restart_service "$SERVICE"; then
# Kiểm tra lại sau khi khởi động thành công
sleep 3
if systemctl is-active --quiet "$SERVICE"; then
log_message "✓ $SERVICE verification: Service is stable after restart"
send_telegram_alert "🟢 ${SERVICE} is now stable and running normally"
else
log_message "⚠ $SERVICE verification: Service restarted but may be unstable"
send_telegram_alert "🟡 ${SERVICE} restarted but may be unstable - Please verify manually"
fi
fi
fi
log_message "=== MySQL monitoring check completed ==="Bước 2: Cấu hình Telegram Bot
Để lấy Telegram Bot Token và Chat ID:
- Tạo Bot:
- Tìm @BotFather trên Telegram
- Gửi lệnh
/newbot - Lưu lại token được cung cấp
- Lấy Chat ID:
- Thêm bot vào nhóm/channel
- Gửi message bất kỳ
- Truy cập:
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates - Tìm
chat.idtrong response
- Cập nhật thông tin trong script:
TELEGRAM_BOT_TOKEN="1234567890:ABCdefGHIjklMnOpQRSTuvwxyz"
TELEGRAM_CHAT_ID="-1001234567890"Bước 3: Cấp quyền và kiểm tra
# Cấp quyền thực thi
chmod +x /opt/scripts/monitoring/mysql_monitor_advanced.sh
# Cài đặt các dependencies cần thiết
apt-get install curl bc -y # Ubuntu/Debian
# hoặc
yum install curl bc -y # CentOS/RHEL
# Test script
/opt/scripts/monitoring/mysql_monitor_advanced.sh
# Kiểm tra log
tail -f /var/log/mysql_monitor.logBước 4: Cấu hình Cron Job
crontab -e
# Thêm dòng sau (chạy mỗi 5 phút):
*/5 * * * * /opt/scripts/monitoring/mysql_monitor_advanced.sh >/dev/null 2>&1Tính năng cảnh báo Telegram:
- ✅ Thành công: Biểu tượng xanh + thông báo thành công
- ⚠️ Cảnh báo: Biểu tượng vàng + thông tin tài nguyên
- 🔴 Lỗi: Biểu tượng đỏ + yêu cầu can thiệp thủ công
- 🔄 Đang xử lý: Thông báo tiến trình khởi động lại
Script sẽ gửi cảnh báo real-time đến Telegram giúp bạn nhanh chóng phát hiện và xử lý sự cố! 📱🚨






