"Enter"a basıp içeriğe geçin

MySQL Veritabanı Zamanaşımı (Timeout) Ayarları

MySQL veritabanı, belli durumlarda bir süre bekleyerek istemciyle etkileşimin olup olmadığına bakar. Bu bekleme süresi zaman aşımı (timeout) olarak adlandırılır. Bu zaman aşımı süreleri my.cnf konfigürasyon dosyası üzerinden ya da sql komut satırından değiştirilebilir. my.cnf dosyasını linux tabanlı sunucularda

sudo nano /etc/mysql/my.cnf

komutu ile düzenleyebilirsiniz.

MySQL sunucusunda zaman aşımı çoğunlukla kapalı bir bağlantı üzerinden MySQL’e bir komut gönderildiğinde oluşur. Ayrıca boşta kalma (idle) zaman aşımı nedeniyle bağlantı MySQL sunucusu tarafından kapatılmış olabilir; ancak çoğu durumda bir istemci uygulamada var olan hata (bug) ya da güvenlik duvarında, yönlendiricide vs. var olan bir sorundan da meydana gelebilir.

Bir MySQL sunucudaki zaman aşımı ayar parametrelerini şöyle sıralayabiliriz:

  • wait_timeout
  • interactive_timeout
  • connect_timeout

wait_timeout

Sunucunun, etkileşimli olmayan bir bağlantıyı kapatmadan önce etkin olması için beklediği saniye cinsinden süredir. Durumsuz (stateless) PHP ortamları için, 60 saniye veya daha kısa bir zaman aşımı yeterli olurken, Java, dotNET vs. gibi bağlantı havuzu kullanan uygulamaların wait_timeout değerini bağlantı havuzu ayarlarıyla eşleşecek şekilde ayarlaması gerekir. Varsayılan olarak 8 saat = 28800 saniye yeterlidir. Ancak pratikte, bir güvenlik kontrolü olarak wait_timeout değerini uygulama bağlantı havuzunun beklenen bağlantı ömründen biraz daha uzun olacak şekilde yapılandırmak yerinde olacaktır. wait_timeout değerini ayarlamak için my.cnf içine

wait_timeout=28800

girdisini eklemeniz gerekir.

wait_timeout değerini MySQL sunucu çalışırken de değiştirebilirsiniz. Böylece sunucuyu yeniden başlatmak zorunda kalmazsınız ve hizmet kesintisi yaşamazsınız. Sunucu çalışırken değeri değiştirmek için SQL komut satırındayken

set global wait_timeout=60

komutunu girin. Yeni oluşturulan tüm oturumlar bu değeri baz alacaktır. Eğer diğer oturumları etkilemeden, sadece ilgili oturum için wait_timeout değeri belirlemek isterseniz

set session wait_timeout=3600

komutunu kullanabilirsiniz. Bu değeri yüksek bir değere ayarlarsanız yoğun çalışan bir sunucuda TIME_WAIT durumunda bekleyen birçok bağlantı görebilirsiniz.

interactive_timeout

Sunucunun, etkileşimli bağlantılar için bağlantıyı kapatmadan önce etkinlik için beklediği saniye cinsinden süredir. Etkileşimli bir istemci, mysql_real_connect() için CLIENT_INTERACTIVE seçeneğini kullanan bir istemci olarak tanımlanır. Etkileşimli zaman aşımı, herhangi bir web uygulaması bağlantısını etkilemez. Pratikte yüksek etkileşim zaman aşımına karşı düşük bekleme süresi en uygunudur. Bu değer my.cnf içinden

interactive_timeout=28800

girdisi ile değiştirilebilir.

connect_timeout

Mysqld sunucusunun kötü el sıkışma ile yanıt vermeden önce bir bağlantı paketi için beklediği saniye cinsinden süredir. Varsayılan değeri 10 saniyedir. Örneğin bu değer 30 saniye ise 30 saniye içinde oturum açamazsanız (kimlik doğrulayamazsanız) mysqld sizi reddedecektir. Eğer istemciler sık sık “Lost connection to MySQL server at ‘XXX’, system error: errno” şeklinde hata alıyorsa connect_timeout değerini artırarak bu sorun giderilebilir. Bu değeri ayarlamak için my.cnf içine

connect_timeout=1800

girdisi eklenebilir ya da sql komut satırından etkileşimli olarak

set global connect_timeout=1800

komutu verilerek ayarlanabilir.

Genelde connect_timeout ve wait_timeout karıştırılır. wait_timeout, bir bağlantının boşta kalma durumunda ne kadar süre tutulacağıdır. connect_timeout ise bir bağlantının yapılması için ne kadar süre bekleneceğidir.

Kaynaklar

  • Stack Exchange – serverfault.com
  • Digital Ocean – digitalocean.com
  • Rackspace Community – docs.rackspace.com
  • Stack Exchange / Database Administrators – dba.stackexchange.com

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir