❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.
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 sử dụng hay quản trị máy chủ Linux, chắc hẳn các bạn không còn lạ gì với việc dịch vụ Mysql bị treo hoặc stop ở một số thời điểm vì một nguyên nhân nào đó. Với mình, là một nhân viên kỹ thuật thì mình thường thấy khách hàng của mình gặp vấn đề Mysql bị stop khi dung lượng bị đầy hoặc do sử dụng vượt quá tài nguyên Ram trên máy chủ. Khi tài nguyên Ram trên máy chủ bị quá tải, thì một dịch vụ có tên OOM sẽ phải kill tiến trình Mysql để giảm tải tài nguyên này.
Nếu trường hợp Mysql bị stop do đầy dung lượng, thì việc các bạn cần làm là kiểm tra và xóa bớt các dữ liệu không thiết đi (log,…) thì mới có thể start lại Mysql. Còn nếu rơi vào trường hợp bị stop do quá tải tài nguyên Ram hay lý do nào đó chưa xác định thì chúng ta có thể áp dụng cách tạo Cron như bài viết này.
Hướng dẫn tạo Script
Bước 1: SSH vào máy chủ Linux của bạn
Để tạo Cron khởi động Mysql trên Linux việc đầu tiên chúng ta cần làm là SSH hoặc truy cập VPS hoặc máy chủ của bạn với quyền root trước. Nếu bạn chưa biết cách SSH vào VPS hoặc Server của bạn thì bạn có thể tham khảo bài viết hướng dẫn sau:
Sau khi đã SSH thành công chúng ta tiếp tục với bước 2 để tiếp tục cấu hình.
Bước 2: Tạo script check trạng thái và khởi động Mysql
Các bạn vui lòng làm theo lần lượt các lệnh bên dưới để tạo đường dẫn cũng như thêm nội dung script (các bạn có thể thay thế đường dẫn, tên file/folder tùy ý).
- Tạo đường dẫn chứa file script
mkdir /root/auto
vi /root/auto/autostart-mysql.sh
Giải thích lệnh bên trên:
– Lệnh 1: Tạo thư mục auto tại /root
– Lệnh 2: Tạo file autostart-mysql.sh tại /root/auto
- Thêm nội dung bên dưới vào File đã tạo
Sau khi tạo File autostart-mysql.sh xong, các bạn tiến hành chỉnh sửa và dán nội dung script bên dưới vào file
Để xác định được đang sử dụng mysqld hay mariadb thì bạn có thể sử dụng lệnh bên dưới để xem
ss -tlnp | grep 3306 # Hoặc: netstat -nlp | grep 3306 (cũ)
Nếu sử dụng MySQL thì dùng script sau:
if [ ! "$(systemctl status mysql.service | awk 'NR==3 {print $2}')" == "active" ]; then
/bin/systemctl start mysql.service
exit
fi
Nếu sử dụng MariaDB thì dùng script sau
if [ ! "$(/bin/systemctl status mariadb.service | awk 'NR==3 {print $2}')" == "active" ]; then
systemctl start mariadb.service
exit
fi
Dưới đây là ví dụ khi thêm nội dung script vào file autostart-mysql.sh. Thêm xong các bạn nhớ Save lại.

- Phân quyền cho File autostart-mysql.sh
chmod +x /root/auto/autostart-mysql.sh
Bước 3: Tạo Cron để thiết lập thời gian chạy script
Lưu ý: Bạn không nên thiết lập thời gian chạy Cron quá ngắn (dưới 5 phút) , vì sẽ dễ làm quá tải tài nguyên và gây lỗi hệ thống.
Ví dụ ở đây mình sẽ thiết lập thời gian cứ 10 phút script sẽ được chạy một lần để check trạng thái Mysql, nếu trạng thái bị stop thì sẽ tự động Start lại. Thì các bạn thiết lập Cron nhanh bằng cách sử dụng lệnh
(crontab -u root -l ; echo "*/10 * * * * /bin/bash /root/auto/autostart-mysql.sh") | crontab -u root -
systemctl restart crond
Giải thích lệnh trên:
– Lệnh 1: Thiết lập Cron chạy script 10 phút chạy check 1 lần.
– Lệnh 2: Khởi động lại dịch vụ Crond
Như vậy mình đã hướng dẫn các bạn chi tiết cách tạo Cron tự động kiểm tra trạng thái và khởi động lại Mysql nếu bị stop. Việc này giúp website của bạn không bị gián đoạn quá lâu trong một số trường hợp các bạn không thể theo dõi máy chủ của mình 24/24. Hy vọng bài viết này hữu ích với các bạn, chúc các bạn thực hiện thành công.
Lưu ý cho AlmaLinux/RHEL
Nếu bạn sử dụng AlmaLinux, Rocky Linux hoặc RHEL, cần lưu ý rằng dịch vụ MySQL thường được thay thế bằng MariaDB. Do đó, bạn cần thay đổi tên service trong script:
- Thay
systemctl restart mysqlbằngsystemctl restart mariadb - Thay
systemctl status mysqlbằngsystemctl status mariadb
Ví dụ script tương ứng trên AlmaLinux:
#!/bin/bash
systemctl is-active --quiet mariadb
if [ $? -ne 0 ]; then
systemctl restart mariadb
echo "$(date): MariaDB đã được khởi động lại" >> /var/log/autostart-mariadb.log
fi
Đồng thời, dịch vụ cron trên AlmaLinux/RHEL sử dụng tên crond (giống như trong bài viết), nên lệnh systemctl restart crond vẫn giữ nguyên.
Script nâng cao: restart + ghi log + gửi Telegram
Script cơ bản ở trên chỉ restart MySQL/MariaDB mà không thông báo gì. Dưới đây là phiên bản nâng cao: ghi log + gửi cảnh báo qua Telegram mỗi khi phải restart.
#!/bin/bash
# Auto-restart MySQL/MariaDB + Telegram alert
# Đặt tại: /root/auto/autostart-mysql.sh
# === CẤU HÌNH ===
SERVICE="mysql" # Ubuntu: mysql | AlmaLinux: mariadb
TELEGRAM_TOKEN="" # Để trống nếu không cần Telegram
TELEGRAM_CHAT_ID=""
LOG_FILE="/var/log/autostart-mysql.log"
# === KIỂM TRA ===
if ! systemctl is-active --quiet "$SERVICE"; then
# Service đang stop → restart
systemctl start "$SERVICE"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
HOSTNAME=$(hostname)
if systemctl is-active --quiet "$SERVICE"; then
MSG="✅ [$TIMESTAMP] $SERVICE đã được khởi động lại trên $HOSTNAME"
else
MSG="❌ [$TIMESTAMP] KHÔNG THỂ khởi động $SERVICE trên $HOSTNAME"
fi
# Ghi log
echo "$MSG" >> "$LOG_FILE"
# Gửi Telegram (nếu có config)
if [ -n "$TELEGRAM_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then
curl -s "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" -d "chat_id=${TELEGRAM_CHAT_ID}&text=${MSG}" > /dev/null 2>&1
fi
fi
💡 AlmaLinux/Rocky: Đổi SERVICE="mysql" thành SERVICE="mariadb". Cron service trên AlmaLinux tên là crond, Ubuntu tên là cron.
Cron cho script nâng cao (check mỗi 5 phút):
# Ubuntu
(crontab -l ; echo "*/5 * * * * /bin/bash /root/auto/autostart-mysql.sh") | crontab -
systemctl restart cron
# AlmaLinux/Rocky
(crontab -l ; echo "*/5 * * * * /bin/bash /root/auto/autostart-mysql.sh") | crontab -
systemctl restart crond
Tổng kết
Script auto-restart MySQL/MariaDB là giải pháp nhanh để giảm downtime khi database bị crash. Tuy nhiên đây chỉ là biện pháp tạm thời. Nếu MySQL liên tục bị stop, bạn cần tìm nguyên nhân gốc: OOM killer (thiếu RAM), disk đầy, hoặc config sai. Xem log tại /var/log/mysql/error.log (Ubuntu) hoặc /var/log/mariadb/mariadb.log (AlmaLinux) để debug.
Có thể bạn cần xem thêm
- Shell Scripting cơ bản trên Linux - Tự động hóa tác vụ VPS
- Logging, Monitoring và IDS trên Linux VPS - auditd, AIDE và Wazuh
- Deploy WordPress + MySQL + phpMyAdmin bằng Docker Compose
- Checklist bảo mật VPS Linux - 15 bước thiết yếu
- Troubleshooting VPS Linux - Cách xủ lý sự cố VPS phổ biến
- Systemd và quản lý service trên Linux VPS
Về tác giả
Thạch Phạm
Đồng sáng lập và Giám đốc điều hành của AZDIGI. Có hơn 15 năm kinh nghiệm trong phổ biến kiến thức liên quan đến WordPress tại thachpham.com, phát triển website và phát triển hệ thống.