Mulai ulang otomatis mysql ketika mati

15

Saya memiliki server rackspace yang telah saya sewa untuk menjalankan proyek pribadi saya. Karena saya murah, ia memiliki 256 MB RAM dan jujur ​​tidak dapat menangani banyak. Kadang-kadang, ketika ada peningkatan tajam dalam lalu lintas, server memutuskan untuk mulai membunuh proses dan tampaknya mysqld adalah yang populer untuk mematikannya. Saya mencoba mengunjungi situs saya dan disambut dengan pesan bahwa ada kesalahan dalam membuat koneksi database. Pemeriksaan log mengungkapkan bahwa mysqld terbunuh karena kurangnya memori.

Karena saya masih miskin seperti kemarin dan tidak ingin meng-upgrade RAM VM rackspace saya, apakah ada cara saya bisa mengatakannya untuk secara otomatis me-restart mysqld ketika mati?

Saya punya pemikiran untuk menggunakan sesuatu seperti crontab, tetapi sayangnya, saya juga tidak tahu apa yang harus saya lakukan di sana. Saya kira saya adalah produk dari generasi "Linux di desktop Anda" karena saya dapat melakukan banyak hal di desktop dan laptop saya (yang menjalankan Linux hampir secara eksklusif), tetapi masih kurang banyak keterampilan administrasi server untuk Linux.

Server menjalankan CentOS 6.3

Los Frijoles
sumber
distro apa? Saya pikir pemula akan melakukan ini di ubuntu
Journeyman Geek
Aduh. Lupa menyebutkan detail itu: CentOS
Los Frijoles
eh mungkin ingin memasukkan versi juga
Journeyman Geek
Bukan untuk mengurangi pertanyaan, tetapi mungkin solusi jangka panjang adalah menghindari kondisi itu sebagai gantinya :) Jika Anda hanya ingin VPS sederhana yang tidak dikelola untuk proyek pribadi Anda, Anda mungkin dapat menarik harga yang baik pada kotak yang lebih besar dari penyedia yang berspesialisasi dalam low end. Saya telah melakukan ini dengan sangat puas. Ada banyak tempat untuk menemukan penyedia VPS tersebut, misalnya lowendtalk.com.
John Chadwick

Jawaban:

16

Ini bukan solusi bersih, jelas akan lebih baik untuk menghindari masalah sejak awal. Lagi pula, saya tidak yakin bagaimana CentOS mengelola layanan tetapi saya pikir itu menggunakan service. Jika demikian, Anda dapat memeriksa apakah mysqllayanan berjalan dengan

/sbin/service mysql status

Perintah ini akan berhasil keluar jika mysqlsedang berjalan dan mengembalikan status keluar 0 jika saya tidak. Karena itu Anda dapat memulai layanan jika tidak berjalan dengan perintah ini:

/sbin/service mysql status || service mysql start

Anda dapat menambahkan baris ini ke /etc/crontabuntuk meluncurkan perintah ini setiap menit:

* * * * * /sbin/service mysql status || service mysql start
terdon
sumber
6

Ini sedikit mengganggu.

mysqld selalu direstart oleh mysqld_safe karena ada loop tak terbatas di bawahmysqld_safeuntuk memeriksa shutdown abnormal. Jika kesalahan terlalu parah, bahkanmysqld_safetidak akan dapat memulai kembalimysqldpada percobaan berikutnya.

Mengingat situasi yang mysqld_safedirancang untuk itu, mungkin bukan ide yang baik untuk memaksa mysqldmemulai jika mysqld_safetoh akan menolaknya.

Anda harus menemukan log kesalahan di my.cnf itu akan berada di bawah

[mysqld]
log-error=log-filename

atau

[mysqld_safe]
log-error=log-filename

Baca file teks (mungkin dengan menjalankan tail -30 log-filename) dan temukan sumber dari pemrosesan mysqld yang dimatikan.

RolandoMySQLDBA
sumber
Menarik ... melihat log saya itu mengatakan bahwa mysqld telah dimulai kembali, tetapi kemudian kira-kira 1-2 jam kemudian akan mengatakan bahwa proses berakhir. Setelah itu, catatan selanjutnya adalah mulai manual saya. Mungkin konfigurasi mysqld_safe saya salah?
Los Frijoles
3

Dalam upaya brute force untuk menjaga semuanya dan berjalan pada VPS memori rendah, saya menggunakan modifikasi jawaban terdom untuk memeriksa dan me-restart MySQL.

/sbin/service mysqld status || service mysqld restart

Saya perlu berubah mysqluntuk mysqldmembuatnya bekerja. Tanpa itu saya akan mendapatkan kesalahan, " ERROR! MySQL is running but PID file could not be found".

Pada sistem CentOS 7.2 saya, /sbin/servicedialihkan ke /bin/systemctl status, jadi perintah berikut ini lebih cepat dijalankan.

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

Saya akhirnya menambahkan baris berikut ke root crontab sistem. Ia memeriksa setiap menit jika MySQL berjalan dan mengarahkan stdout ke nol. Memulai layanan tidak akan menghasilkan apa pun kecuali terjadi kesalahan, jadi tidak perlu menambahkan pengalihan nol pada perintah terakhir.

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

Pipa ganda ||berarti ORdan akan menjalankan perintah ke-2 jika perintah pertama gagal. (Mengembalikan kode keluar lebih besar dari nol.)

Ini seperti mengatakan, "Jalankan perintah 1, atau , jika perintah 1 gagal, jalankan perintah 2".

Ini tidak seperti amper ganda dan &&yang seperti mengatakan, "Jalankan perintah 1, dan , hanya jika perintah 1 berhasil, jalankan perintah 2".

Mike J
sumber
1

Berikut ini adalah dari jonnyreeves.co.uk :


Dan pelakunya adalah php-fpm! Google cepat menemukan pelanggan Wordpress lain menderita gejala yang sama; sarannya adalah men-tweak konfigurasi php-fpm pool (/etc/php-fpm.d/www.conf) dan mengubah konfigurasi pm. Perubahan utama adalah pindah dari pm = dynamicke pm = ondemanddengan pm.max_childrennilai 5(berdasarkan mengamati ~ 5% penggunaan memori per pekerja). Setelah mengubah konfigurasi saya me-restart semua layanan dan memeriksa penggunaan memori.

service php-fpm restart
service nginx restart
service mariadb restart

Setelah memulai kembali penggunaan memori secara dramatis lebih rendah.

AdrianoFerrari
sumber