Lỗi “The MySQL server is currently offline” là một trong những lỗi thường gặp khi quản trị máy chủ cPanel/WHM. Khi xảy ra lỗi, cPanel không thể truy vấn MySQL/MariaDB để lấy thông tin database, database user hoặc dung lượng sử dụng của từng database.
Một trường hợp đặc biệt thường gặp là MySQL vẫn hiển thị đang chạy nhưng cPanel liên tục báo database server offline. Khi kiểm tra log, có thể xuất hiện lỗi liên quan đến thư mục tạm như:
Can't create/write to file '/run/tmp/#sql_xxx.MAI'
Errcode: 2 "No such file or directory"
Hoặc:
Can't create/write to file '/run/tmp/#sql_xxx.MAI'
Errcode: 13 "Permission denied"
Nguyên nhân thường nằm ở tmpdir của MySQL/MariaDB, thư mục tạm bị mất, sai quyền hoặc systemd giới hạn quyền truy cập của dịch vụ database.
Bài viết này hướng dẫn cách kiểm tra và khắc phục lỗi The MySQL server is currently offline trên cPanel, đồng thời bổ sung các bước kiểm tra MySQL/MariaDB, InnoDB, quyền thư mục và cấu hình sau khi reboot server.
Dấu hiệu nhận biết lỗi
Khi truy cập cPanel hoặc WHM, bạn có thể gặp thông báo:
The MySQL server is currently offline
Một số trường hợp đi kèm lỗi:
adminbin Cpanel/cpmysql/DBCACHE: exit 11
Hoặc:
Error encountered while fetching data
Trong log có thể xuất hiện:
Can't create/write to file '/run/tmp/#sql_xxx.MAI'
Ví dụ:
Errcode: 2 "No such file or directory"
Điều này cho thấy MySQL/MariaDB đang cố tạo file tạm nhưng không tìm thấy thư mục được cấu hình làm tmpdir.
Một trường hợp khác:
Errcode: 13 "Permission denied"
thường cho thấy thư mục đã tồn tại nhưng user chạy MySQL/MariaDB không có quyền ghi.
Lỗi “The MySQL server is currently offline” có phải MySQL thực sự bị tắt?
Không phải lúc nào cũng vậy.
Đây là điểm cần lưu ý khi xử lý sự cố.
Có thể xảy ra trường hợp:
MySQL/MariaDB
|
| Service đang chạy
|
X Không tạo được temporary file
|
cPanel không truy vấn database được
|
cPanel báo:
The MySQL server is currently offline
Do đó, trước khi restart hoặc thay đổi cấu hình MySQL, cần kiểm tra trạng thái service và log để xác định nguyên nhân thực tế.
Bước 1: Kiểm tra trạng thái MySQL/MariaDB
Trên server cPanel, đăng nhập bằng SSH với quyền root.
Kiểm tra MariaDB:
systemctl status mariadb
Nếu server sử dụng service MySQL:
systemctl status mysqld
Có thể kiểm tra nhanh:
systemctl is-active mariadb
hoặc:
systemctl is-active mysqld
Nếu kết quả:
active
thì service đang chạy.
Tuy nhiên, service đang active không đồng nghĩa MySQL hoạt động hoàn toàn bình thường. Cần tiếp tục kiểm tra log và khả năng thực hiện truy vấn.
Bước 2: Kiểm tra MySQL có thể truy cập hay không
Thử đăng nhập:
mysql -e "SELECT VERSION();"
Hoặc:
mariadb -e "SELECT VERSION();"
Nếu lệnh trả về phiên bản MySQL/MariaDB, database server đang phản hồi.
Kiểm tra danh sách database:
mysql -e "SHOW DATABASES;"
Nếu truy vấn thất bại, cần xem log database trước khi thực hiện các thay đổi tiếp theo.
Bước 3: Kiểm tra log MySQL/MariaDB
Đây là bước rất quan trọng.
Kiểm tra journal:
journalctl -u mariadb -n 100 --no-pager
Nếu sử dụng MySQL:
journalctl -u mysqld -n 100 --no-pager
Có thể lọc các lỗi liên quan đến temporary file:
journalctl -u mariadb --no-pager | grep -iE 'tmp|permission|error'
Tìm các lỗi dạng:
Can't create/write to file
Permission denied
No such file or directory
InnoDB
Plugin initialization
Unknown storage engine
Nếu phát hiện lỗi:
Can't create/write to file '/run/tmp/...'
hãy kiểm tra thư mục /run/tmp.
Bước 4: Kiểm tra thư mục /run/tmp
Kiểm tra:
ls -ld /run/tmp
Nếu thư mục không tồn tại:
ls: cannot access '/run/tmp': No such file or directory
thì MySQL/MariaDB không thể tạo temporary file tại vị trí này.
Tạo lại thư mục:
mkdir -p /run/tmp
Đặt quyền cho thư mục temporary:
chmod 1777 /run/tmp
Kiểm tra lại:
ls -ld /run/tmp
Kết quả nên có dạng tương tự:
drwxrwxrwt
Bit t ở cuối là sticky bit, giúp ngăn user này xóa file tạm của user khác.
Bước 5: Kiểm tra user chạy MySQL/MariaDB
Kiểm tra process:
ps aux | grep '[m]ysqld'
Thông thường MySQL/MariaDB sẽ chạy bằng user:
mysql
Kiểm tra:
id mysql
Nếu MySQL sử dụng /run/tmp làm temporary directory, cần đảm bảo user mysql có quyền ghi vào thư mục này.
Có thể kiểm tra:
sudo -u mysql touch /run/tmp/mysql-test
Nếu tạo file thành công, xóa file kiểm tra:
rm -f /run/tmp/mysql-test
Nếu nhận:
Permission denied
cần xử lý lại quyền của thư mục.
Bước 6: Kiểm tra cấu hình tmpdir của MySQL
Đăng nhập MySQL:
mysql
Sau đó chạy:
SHOW VARIABLES LIKE 'tmpdir';
Hoặc:
mysqladmin variables | grep tmpdir
Ví dụ:
tmpdir /run/tmp/
Nếu MySQL đang sử dụng /run/tmp/ nhưng thư mục này bị mất hoặc cấu hình không phù hợp, đây có thể là nguyên nhân trực tiếp gây lỗi.
Bước 7: Sử dụng thư mục temporary riêng cho MySQL
Trong một số môi trường cPanel, có thể chuyển tmpdir của MySQL/MariaDB sang một thư mục riêng.
Ví dụ:
mkdir -p /home/mysqltmp
Đặt owner:
chown mysql:mysql /home/mysqltmp
Đặt quyền:
chmod 750 /home/mysqltmp
Kiểm tra:
ls -ld /home/mysqltmp
Tuy nhiên, khi đặt tmpdir bên trong /home, cần lưu ý systemd có thể áp dụng cơ chế bảo vệ Home cho dịch vụ MariaDB/MySQL.
Do đó, không nên chỉ thay đổi tmpdir mà bỏ qua cấu hình systemd.
Bước 8: Cấu hình tmpdir trong MySQL/MariaDB
Trước tiên xác định file cấu hình đang được MySQL/MariaDB sử dụng.
Có thể chạy:
mysql --help | grep -A 1 "Default options"
Trên nhiều hệ thống cPanel, cấu hình có thể nằm trong:
/etc/my.cnf
Mở file:
nano /etc/my.cnf
Trong phần:
[mysqld]
có thể cấu hình:
tmpdir=/home/mysqltmp
Sau khi thay đổi, cần kiểm tra lại cấu hình trước khi restart database.
Bước 9: Nếu sử dụng /home/mysqltmp, kiểm tra systemd ProtectHome
Nếu log xuất hiện:
Permission denied
dù quyền thư mục đã đúng, cần kiểm tra cấu hình systemd của MariaDB.
Kiểm tra:
systemctl cat mariadb
Tìm các thiết lập liên quan đến:
ProtectHome
Nếu service đang bật:
ProtectHome=true
hoặc giá trị tương tự, systemd có thể hạn chế quyền truy cập của MariaDB vào /home.
Trong trường hợp cần sử dụng thư mục nằm dưới /home, có thể tạo systemd override:
mkdir -p /etc/systemd/system/mariadb.service.d
Tạo file:
nano /etc/systemd/system/mariadb.service.d/override.conf
Nội dung:
[Service]
ProtectHome=false
Sau đó reload systemd:
systemctl daemon-reload
Không nên thay đổi ProtectHome nếu chưa xác định đây thực sự là nguyên nhân. Với môi trường production, nên ưu tiên sử dụng một thư mục temporary nằm ngoài /home nếu không có yêu cầu đặc biệt.
Bước 10: Khởi động lại MariaDB
Sau khi thay đổi cấu hình, kiểm tra cấu hình trước.
Sau đó:
systemctl restart mariadb
Kiểm tra:
systemctl status mariadb
Nếu sử dụng MySQL:
systemctl restart mysqld
Sau khi restart, kiểm tra ngay log:
journalctl -u mariadb -n 100 --no-pager
Không nên chỉ nhìn thấy:
Active: active (running)
rồi kết luận hệ thống đã hoạt động bình thường. Cần thực hiện truy vấn database để xác nhận.
Bước 11: Kiểm tra lại tmpdir
Chạy:
mysqladmin variables | grep tmpdir
Kết quả cần hiển thị đúng đường dẫn đã cấu hình.
Ví dụ:
tmpdir /home/mysqltmp
Sau đó kiểm tra quyền:
ls -ld /home/mysqltmp
Và thử tạo file bằng user mysql:
sudo -u mysql touch /home/mysqltmp/mysql-test
Nếu thành công:
rm -f /home/mysqltmp/mysql-test
Bước 12: Kiểm tra InnoDB
Nếu MySQL/MariaDB đã chạy nhưng cPanel vẫn báo lỗi, cần kiểm tra InnoDB.
Đăng nhập:
mysql
Chạy:
SHOW ENGINES;
Tìm dòng:
InnoDB
Cột Support cần có:
YES
Ví dụ:
Engine Support
InnoDB YES
Nếu InnoDB không hoạt động, nhiều website sử dụng WordPress, WooCommerce hoặc các ứng dụng PHP có thể tiếp tục gặp lỗi database dù service MySQL vẫn đang chạy.
Các lỗi InnoDB thường gặp
Trong log có thể xuất hiện:
InnoDB: Unable to create temporary file
hoặc:
Plugin initialization aborted
hoặc:
Plugin 'InnoDB' init function returned error
hoặc:
Unknown storage engine 'InnoDB'
Nếu gặp các lỗi này, không nên tự ý xóa các file ibdata, ib_logfile hoặc file dữ liệu InnoDB.
Đây là những file có thể chứa dữ liệu hoặc metadata quan trọng. Việc xóa sai có thể khiến database bị mất dữ liệu hoặc không thể khởi động.
Bước 13: Kiểm tra database sau khi sửa lỗi
Sau khi MariaDB hoạt động, kiểm tra:
mysql -e "SHOW DATABASES;"
Kiểm tra engine:
mysql -e "SHOW ENGINES;"
Kiểm tra kết nối:
mysql -e "SELECT 1;"
Kiểm tra phiên bản:
mysql -e "SELECT VERSION();"
Nếu tất cả đều hoạt động, hãy quay lại cPanel và kiểm tra phần quản lý database.
Bước 14: Kiểm tra cPanel sau khi sửa MySQL
Sau khi MySQL/MariaDB hoạt động bình thường, đăng nhập lại cPanel hoặc WHM.
Kiểm tra các chức năng:
- MySQL Databases.
- phpMyAdmin.
- Database Wizard.
- MySQL Database Usage.
- Database User.
- Database Management.
Nếu cPanel vẫn báo MySQL offline, cần kiểm tra log cPanel và trạng thái kết nối đến database thay vì tiếp tục thay đổi my.cnf.
Vì sao cPanel báo MySQL offline dù service vẫn running?
Có một số nguyên nhân phổ biến:
1. MySQL không thực hiện được truy vấn
Service vẫn chạy nhưng query bị lỗi do:
- Temporary directory.
- Permission.
- InnoDB.
- Disk đầy.
- Corrupt table.
- Resource exhaustion.
2. Thư mục tmp bị mất
Ví dụ:
/run/tmp
không tồn tại sau khi reboot hoặc bị xóa bởi quá trình dọn dẹp temporary files.
3. Sai permission
MySQL không có quyền tạo temporary file.
4. Disk đầy
Kiểm tra:
df -h
Đặc biệt cần kiểm tra:
/
/var
/tmp
/run
/home
Nếu filesystem chứa database hoặc temporary directory đầy, MySQL có thể hoạt động không ổn định.
Kiểm tra inode:
df -i
Một filesystem có thể còn dung lượng nhưng hết inode, khiến hệ thống không thể tạo file mới.
5. InnoDB gặp lỗi
Nếu InnoDB không khởi tạo được, các database sử dụng InnoDB có thể không hoạt động bình thường.
6. OOM hoặc thiếu RAM
Kiểm tra:
free -h
Kiểm tra kernel log:
dmesg | grep -iE 'oom|killed process'
Nếu mysqld bị hệ thống kill do thiếu RAM, cần xử lý nguyên nhân về memory thay vì thay đổi tmpdir.
Kiểm tra dung lượng ổ đĩa
Một trong những bước đầu tiên khi MySQL gặp lỗi nên là:
df -h
Nếu / hoặc /var đạt 100%, MySQL có thể không tạo được file tạm hoặc ghi log.
Kiểm tra thư mục lớn:
du -xh /var | sort -h | tail -20
Nếu database nằm trong /var/lib/mysql, cần đặc biệt chú ý dung lượng của filesystem này.
Không nên xóa trực tiếp file database để giải phóng dung lượng.
Kiểm tra inode
Chạy:
df -i
Nếu IUse% đạt 100%, hệ thống đã hết inode.
Khi đó dù df -h vẫn còn vài GB trống, MySQL vẫn có thể không tạo được temporary file.
Kiểm tra quyền thư mục database
Không nên thay đổi quyền database một cách tùy tiện.
Có thể kiểm tra:
ls -ld /var/lib/mysql
và:
ls -lah /var/lib/mysql | head
User/group phải phù hợp với user chạy MariaDB/MySQL.
Nếu chưa xác định chính xác quyền cần thiết, không nên chạy các lệnh chmod -R hoặc chown -R trên toàn bộ /var/lib/mysql, vì có thể làm hỏng quyền của các file database.
Kiểm tra socket MySQL
Một số trường hợp ứng dụng hoặc cPanel không kết nối được database do socket.
Kiểm tra:
mysqladmin variables | grep socket
Kiểm tra socket thực tế:
ss -lx | grep mysql
Nếu socket không tồn tại hoặc đường dẫn không khớp với ứng dụng, cần kiểm tra lại cấu hình MySQL và client.
Kiểm tra port MySQL
Nếu MySQL lắng nghe TCP:
ss -lntp | grep 3306
Thông thường database trên một server cPanel không cần mở port 3306 cho Internet.
Nếu website và MySQL cùng máy chủ, có thể sử dụng Unix socket hoặc kết nối localhost tùy cấu hình ứng dụng.
Không nên xử lý lỗi bằng cách xóa file InnoDB
Khi gặp lỗi database, một số hướng dẫn trên Internet có thể yêu cầu xóa:
ibdata1
ib_logfile*
Đây là thao tác nguy hiểm.
Nếu database đang chứa dữ liệu production, không nên xóa các file InnoDB chỉ để MySQL khởi động lại.
Trước tiên cần:
- Kiểm tra log.
- Kiểm tra backup.
- Xác định nguyên nhân.
- Kiểm tra trạng thái InnoDB.
- Thực hiện recovery theo tình trạng thực tế.
Kiểm tra MySQL sau khi reboot
Nếu lỗi liên quan đến /run/tmp, cần đặc biệt chú ý sau khi reboot server.
Khởi động lại server:
reboot
Sau khi server hoạt động trở lại, kiểm tra:
ls -ld /run/tmp
Kiểm tra MySQL:
systemctl status mariadb
Kiểm tra tmpdir:
mysqladmin variables | grep tmpdir
Kiểm tra InnoDB:
mysql -e "SHOW ENGINES;" | grep -i InnoDB
Nếu /run/tmp lại biến mất sau reboot, cần cấu hình việc tạo thư mục một cách lâu dài thay vì chỉ chạy mkdir thủ công một lần.
Cách tạo thư mục /run/tmp tự động sau reboot
Nếu hệ thống thực sự yêu cầu /run/tmp, có thể sử dụng systemd-tmpfiles để quản lý thư mục.
Tạo cấu hình:
nano /etc/tmpfiles.d/mysql-tmp.conf
Nội dung:
d /run/tmp 1777 root root -
Sau đó áp dụng:
systemd-tmpfiles --create
Kiểm tra:
ls -ld /run/tmp
Cách này phù hợp hơn việc chỉ tạo thư mục thủ công bằng mkdir, vì /run thường là filesystem runtime và nội dung có thể không tồn tại sau reboot.
Checklist xử lý lỗi “The MySQL server is currently offline”
Khi gặp lỗi, nên kiểm tra theo thứ tự:
- Kiểm tra
systemctl status mariadb. - Kiểm tra
systemctl status mysqldnếu server sử dụng MySQL. - Thử
mysql -e "SELECT 1;". - Kiểm tra log MariaDB/MySQL.
- Kiểm tra
/run/tmpnếu log báo lỗi temporary file. - Kiểm tra quyền của thư mục
tmpdir. - Kiểm tra user chạy MySQL.
- Kiểm tra giá trị
tmpdir. - Kiểm tra dung lượng bằng
df -h. - Kiểm tra inode bằng
df -i. - Kiểm tra RAM và OOM.
- Kiểm tra InnoDB bằng
SHOW ENGINES. - Kiểm tra socket MySQL.
- Kiểm tra port 3306 nếu sử dụng TCP.
- Kiểm tra cPanel sau khi database hoạt động.
- Reboot và xác nhận lỗi không quay lại.
- Không xóa file InnoDB khi chưa có phương án backup/recovery.
Kết luận
Lỗi “The MySQL server is currently offline” trên cPanel không nhất thiết có nghĩa MySQL hoặc MariaDB đã bị dừng. Trong nhiều trường hợp, database service vẫn đang chạy nhưng không thể thực hiện truy vấn hoặc tạo temporary file, khiến cPanel không thể giao tiếp bình thường với database server.
Nếu log xuất hiện lỗi:
Can't create/write to file '/run/tmp/...'
cần tập trung kiểm tra tmpdir, sự tồn tại của thư mục, permission, user chạy MySQL/MariaDB và các giới hạn của systemd.
Ngoài ra, cần kiểm tra đồng thời dung lượng ổ đĩa, inode, RAM, log database và trạng thái InnoDB. Đặc biệt, không nên xử lý lỗi bằng cách xóa trực tiếp các file dữ liệu InnoDB khi chưa xác định nguyên nhân và chưa có backup.
Một quy trình troubleshooting đúng nên bắt đầu từ service, log và khả năng query, sau đó mới thay đổi cấu hình. Cách tiếp cận này giúp hạn chế downtime và giảm nguy cơ làm mất dữ liệu database trên máy chủ production.
中文 (中国)
English

