WordPress kullananların baş belasıdır Mysql servisi! Birazcık ziyaretçi sayımız yükselsin hemen stop olur. Sonrasında ise web sitemize giren ziyaretçilerimiz “Veritabanı bağlantısı kurulurken hata oluştu” hatası alırlar. Velhasıl kelam bu hata sonucunda SSH’dan sunucuya bağlanıp, mysql’i tekrar start etmemiz gerekiyor.
Hele ki yetersiz kayaklara sahip bir sunucunuz varsa (ucuz etin yahnisi) maalesef ki bu hata sıklıkla karşınıza çıkabilir. Diğer bir yandan kullandığınız tema içerisinde çok fazla sorgu vardır ve içerik fazla olunca (database büyük olunca) öyle ahım şahım ziyaretçi sayısına sahip olmadan da bu hata ile karşılaşabilirsiniz. Kesin çözüm iyi bir hosting, idare edecek çözüm ise aşağıdaki gibi .)
Şöyle bir tane basit bir Bash Script yazsak ve Crontab üzerinde her dakika çalıştırsak, gitse kontrol etse mysql servisini? Stop olduğunu gördüğü zaman otomatik olarak servisi başlatsa? Üstüne üstlük bir de bize e-posta gönderse ne güzel olurdu değil mi?
Bir arkadaşımın sunucusu aynen bu durumdaydı. Her seferinde de bilgisayar başında olamadığı için sıkıntı yaşamaya devam ediyordu. Aşağıdaki gibi bir Bash Script ile sorununu çözdük.
Aşağıdaki Bash Script’i Crontab üzerinde bir dakika zamanlı çalıştırdığınız zaman, script mysql servisini kontrol eder, eğer stop durumdaysa start edip size e-posta gönderir. Eğer ki servis start olmazsa yani başka bir sorun varsa ve tekrar çalışmıyorsa mail gönderip size servisin patladığını belirtiyor.
Yapacağımız iş çok basit!
Birinci adımda /etc/ dizini altına mysql_kontrol.sh isminde bir dosya oluşturup, aşağıdaki kodu içerisine yapıştırıyoruz.
cd ../etc
nano mysql_kontrol.sh
Aşağıdaki kodu yapıştırdıktan sonra CTRL X ile çıkıyor ve “Yes” yaparak kayıt ediyoruz. İkinci adımda ise dosyayı çalıştırabilir bir hale getirmemiz gerekiyor bunun için,
chmod +x mysql_kontrol.sh
komutunu kullanarak dosyamızı çalıştırılabilir hale getiriyoruz. Son adımda ise Crontab üzerinde dosyamızı zamanlıyoruz ve dakikada bir çalışmasını sağlıyoruz.
export VISUAL=nano; crontab -e
Komutu ile Crontab’ı açıyoruz ve içerisine aşağıdaki kodu yazıyoruz.
*/1 * * * * /etc/mysql_kontrol.sh
Sonrasında CTRL X ile kayıt edip çıkış yapabiliriz. Artık Bash Script hazır hale geldi. Bundan sonra küçük bir test yapabiliriz. SSH komut satırına…
service mysql stop
yazarsanız mysql servisi duracaktır. Bir dakika sonra mysql_kontrol.sh dosyamız devreye girecek, Mysql servisinin çalışmadığını görecek ve servisi tekrar çalıştırıp size e-posta ile bildirim yollayacak. Bir dakika kadar bekledikten sonra komut satırına
service mysql status
yazarak, servisin başladığını görebilirsiniz.
mysql_kontrol.sh dosyamızın içeriği;
Üçüncü satırda servisin ismi yer alıyor. Mysql yerine httpd kullanabilir aynı işlemi Apache veya başka bir servis için kullanabilirsiniz. Dördüncü satırda ise e-posta adresiniz yer alıyor. Lütfen kendi e-posta adresiniz ile değiştirin. E-postalar bana gelmesin.
#!/bin/bash
### Servis Otomatik Başlasın TEAkolik
service=mysql
email=[email protected]
### Ayarlar bu kadar basit
if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo "$service is running"
else
/sbin/service $service start
if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
subject="$service Servisini Otomatik Başlattım!"
echo "$service Servisi Durdu! Otomatik olarak tekrar başlattım!" | mail -s "$subject" $email
else
subject="$service Servisi Patladı! Yardım Lazım!"
echo "$service Servisi patladı. Çalıştırmayı Denedim Çalışmıyor." | mail -s "$subject" $email
fi
fi
“Servisi otomatik başlattım” e-postası gelirse sorun yok demektir. Eğer “mysql Servisi Patladı! Yardım Lazım!” e-postası geldiyse, script mysql servisini başlatamıyor demektir. Bu da sorunun başka bir şeyden kaynaklandığını gösterir. Bir bilene danışabilir veya /var/log/ klasöründen error_log kayıtlarını inceleyebilirsiniz.
Hadi kolay gelsin…
Güncel Linux dağıtımlarında ‘service’ komutundan sonuç alamazsanız ‘systemctl start/restart/stop/status servisinadi.service şeklinde kullanabilirsiniz.
Aynı şekilde, ‘mysql’ komutu da çalışmayabilir, bu durumda mysql’in server uygulaması olarak kabul edebileceğimiz ‘mysqld’ servis adıyla işleme devam edebilirsiniz, 3. satırda gerekli değişiklik yapıldığında sorunsuz çalışacaktır.
Elinize sağlık. Ek bilgi olması açısından sunucu üzerine monit kurarak da istediğiniz servisi izleyebilir ve servis durduğunda yeniden başlatılmasını sağlayabilirsiniz.
Eline sağlık. Bu dertten bir ara ben de çok çektim ve çareyi Medium kullanmakta buldum. Script gerçekten çözüm mü? Kapanmasını sağlayan şey neyse orada da bir önlem almak gerek. MySQL’in bu kadar beceriksiz bir veritabanı olduğuna pek inanmıyorum.
Zamanında ben bu problemi yaşadığımda, belli birkaç IP’den sürekli sorgu yapıldığını görmüştüm, onların request yapmasını engelleyerek -bir nebze- çözülmüştü. Ama esas sorun hala orada, yani yine çok kullanıcı gelirse o veritabanı duracak. Bir diğer problem, sunucumda swap alanı yoktu, swap alanı eklemek de yine -bir nebze- rahatlatmıştı.
Ama sorun hala ortada. Daha sonrasında senin de belirttiğin gibi temamdaki veritabanı sorgularının pek optimize olmadığını tespit etmiştim. Temayı da değiştirip, özelleştirdim, böylece veritabanının kapanma olasılığını düşürmüştüm. Ve elbette jetpack ile caching olmazsa olmazımız.
Tüm bunları yapıldıktan sonra senin script güzel bir önlem olur. Tekrar eline sağlık.