Tự động khởi động lại mysql khi nó chết


15

Tôi có một máy chủ rackspace mà tôi đã thuê để chạy các dự án cá nhân của tôi. Vì tôi rẻ, nó có 256Mb RAM và thực sự không thể xử lý nhiều. Thỉnh thoảng, khi lưu lượng truy cập tăng mạnh, máy chủ quyết định bắt đầu giết các quy trình và có vẻ như mysqld là một thứ phổ biến để nó giết. Tôi cố gắng truy cập trang web của mình và nhận được thông báo rằng có lỗi khi thiết lập kết nối cơ sở dữ liệu. Kiểm tra các bản ghi cho thấy mysqld đã bị giết do thiếu bộ nhớ.

Vì tôi vẫn còn nghèo như ngày hôm qua và không muốn nâng cấp RAM của máy ảo rack của mình, có cách nào để tôi có thể tự động khởi động lại mysqld khi nó chết không?

Tôi có ý nghĩ sử dụng thứ gì đó như crontab, nhưng than ôi, tôi cũng không biết chính xác nên làm gì ở đó. Tôi đoán tôi là sản phẩm của thế hệ "Linux trên máy tính để bàn của bạn" vì tôi có thể làm hầu hết mọi thứ trên máy tính để bàn và máy tính xách tay của mình (chạy Linux gần như độc quyền), nhưng vẫn thiếu nhiều kỹ năng quản trị máy chủ cho Linux.

Máy chủ chạy CentOS 6.3


cái gì? Tôi nghĩ rằng những người mới bắt đầu sẽ làm điều này trên Ubuntu
Journeyman Geek

Rất tiếc. Quên đề cập đến chi tiết đó: CentOS
Los Frijoles

Hở. có thể muốn bao gồm cả phiên bản nữa
Journeyman Geek

Không làm mất đi câu hỏi, nhưng có lẽ một giải pháp lâu dài sẽ là tránh điều kiện thay vào đó :) Nếu bạn chỉ muốn một VPS không được quản lý đơn giản cho các dự án cá nhân của mình, bạn có thể có được một mức giá tốt trên một hộp lớn hơn từ một nhà cung cấp chuyên về cấp thấp. Tôi đã làm điều này với sự hài lòng tuyệt vời. Có nhiều nơi để tìm các nhà cung cấp VPS như vậy, ví dụ lowendtalk.com.
John Chadwick

Câu trả lời:


16

Đây không phải là một giải pháp sạch, rõ ràng sẽ tốt hơn để tránh vấn đề ngay từ đầu. Dù sao, tôi không chắc chắn cách CentOS quản lý dịch vụ nhưng tôi nghĩ nó sử dụng service. Nếu vậy, bạn có thể kiểm tra xem mysqldịch vụ có chạy không

/sbin/service mysql status

Lệnh này sẽ thoát thành công nếu mysqlđang chạy và trả về trạng thái thoát không 0 nếu tôi không. Do đó, bạn có thể bắt đầu dịch vụ nếu nó không chạy bằng lệnh này:

/sbin/service mysql status || service mysql start

Bạn có thể thêm dòng này /etc/crontabđể khởi chạy lệnh này mỗi phút:

* * * * * /sbin/service mysql status || service mysql start


6

Đây là một chút đáng lo ngại.

mysqld luôn được khởi động lại bởi mysqld_safe vì có một vòng lặp vô hạn ở phía dướimysqld_safeđể kiểm tra các lần tắt máy bất thường. Nếu lỗi quá nghiêm trọng, thậm chímysqld_safesẽ không thể khởi động lạimysqldvào các lần thử tiếp theo.

Với tình huống đó mysqld_safeđược thiết kế cho, có thể không nên mysqldbắt đầu nếu mysqld_safekhông từ chối nó.

Bạn cần xác định vị trí nhật ký lỗi trong my.cnf nó sẽ nằm dưới

[mysqld]
log-error=log-filename

hoặc là

[mysqld_safe]
log-error=log-filename

Đọc tệp văn bản (có thể bằng cách chạy tail -30 log-filename) và tìm nguồn tắt của quá trình xử lý mysqld đang tắt.


Thật thú vị ... nhìn vào nhật ký của tôi, nó nói rằng mysqld đã được khởi động lại, nhưng sau đó khoảng 1-2 giờ sau nó sẽ nói rằng quá trình kết thúc. Sau đó, bản ghi tiếp theo là bắt đầu bằng tay của tôi. Có lẽ tôi đã cấu hình mysqld_safe sai?
Los Frijoles

3

Trong một nỗ lực vũ phu để duy trì mọi thứ và chạy trên VPS bộ nhớ thấp, tôi đã sử dụng một sửa đổi câu trả lời của terdom để kiểm tra và khởi động lại MySQL.

/sbin/service mysqld status || service mysqld restart

Tôi cần phải thay đổi mysqlđể mysqldlàm cho nó hoạt động. Không có nó tôi sẽ nhận được lỗi, " ERROR! MySQL is running but PID file could not be found".

Trên hệ thống CentOS 7.2 của tôi, /sbin/servicechuyển hướng đến /bin/systemctl status, vì vậy lệnh sau sẽ nhanh hơn để thực thi.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

Tôi đã kết thúc việc thêm dòng sau vào crontab gốc của hệ thống. Nó kiểm tra mỗi phút nếu MySQL đang chạy và chuyển hướng thiết bị xuất chuẩn thành null. Bắt đầu dịch vụ sẽ không xuất bất cứ thứ gì trừ khi có sự cố, do đó không cần thêm chuyển hướng null vào lệnh cuối cùng.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

Ống đôi ||có nghĩa ORvà sẽ thực thi lệnh thứ 2 nếu lệnh đầu tiên không thành công. (Trả về mã thoát lớn hơn 0.)

Giống như nói, "Chạy lệnh thứ 1 hoặc , nếu lệnh thứ 1 không thành công, hãy chạy lệnh thứ 2".

Điều này không giống như các ký hiệu kép và &&giống như nói: "Chạy lệnh thứ 1 , chỉ khi lệnh thứ 1 thành công, hãy chạy lệnh thứ 2".


1

Sau đây là từ jonnyreeves.co.uk :


Và thủ phạm là php-fpm! Một google nhanh chóng tìm thấy một khách hàng Wordpress khác bị các triệu chứng tương tự; lời khuyên là điều chỉnh cấu hình nhóm php-fpm (/etc/php-fpm.d/www.conf) và điều chỉnh cấu hình pm. Thay đổi chính là chuyển từ pm = dynamicsang pm = ondemandvới pm.max_childrengiá trị 5(dựa trên việc quan sát ~ 5% mức sử dụng bộ nhớ cho mỗi công nhân). Sau khi thay đổi cấu hình, tôi khởi động lại tất cả các dịch vụ và kiểm tra việc sử dụng bộ nhớ.

service php-fpm restart
service nginx restart
service mariadb restart

Sau khi khởi động lại, việc sử dụng bộ nhớ thấp hơn đáng kể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.