2009-08-30 20 views
6

Mysql 5. * ve MyISAM tablolarıyla Django 1.1 kullanıyorum.Django: Veritabanınızı öldürmekten uzun sorguları nasıl durdurabilirsiniz?

Verilerimden bazıları, veri kümemde aykırı değerler için bir TON zaman alabilir. Bunlar tabloları kilitler ve siteyi kapatır. Diğer zamanlarda, bazı kullanıcılar bu işlemi yapmadan önce isteği iptal eder ve bazı sorgular "Hazırlık" aşamasında tüm diğer sorguları kilitler.

Tüm köşe durumlarını izlemeye çalışacağım, ancak güvenlik ağına sahip olmak güzel, bu yüzden site aşağı inmiyor.

Bunu nasıl önleyebilirim? Maksimum sorgu sürelerini ayarlayabilir miyim?

+0

Veri kümesinde aykırı değer nedir? – hughdbrown

+0

Normal sayıda başarıdan veya web üzerinde çok fazla sayıda takma addan daha büyük olan bir kullanıcı. –

cevap

1

Ne yazık ki MySQL bundan kaçınmanın kolay bir yoludur. Yaygın bir yöntem temel olarak tüm çalışan süreçleri her X saniyede bir kontrol eden (“uzun” olduğunu düşündüğünüze göre) ve gördüklerini çok uzun süre öldüren bir betik yazmaktır. Bununla birlikte, en azından bazı temel arıza teşhislerini, MySQL'de log_slow_queries ayarlayarak, 10 saniyeden uzun süren tüm sorguları bir günlüğe yazdırabilirsiniz. Amaçlarınız için "yavaş" olarak nitelendirdiğiniz şey için çok uzunsa, eşiği değiştirmek için long_query_time değerini 10'dan başka bir değere ayarlayabilirsiniz.

+1

* iç çek * bundan korkuyordum. Bu iş için önerdiğiniz herhangi bir betik var mı? –

+0

Bunu yapmak için herhangi bir betik buldunuz mu? – lamplighter

0

Bir sorgulamayı iptal etmenin tek güvenilir yolu kill command. Daha az sert bir önlem, bağlantıyı kapatmaktır (ve yenisini yeniden açar); Bu, istemciye send some output'u dener girmez sorguları sonlandırır.

+1

Bunu django'da nasıl algılayabilirim?Ne zaman öldürmek zorunda olduğunu görmek için her saniyeyi kontrol eden bir cronjob almamayı tercih ederim ... –

0

Sorguların ne olduğunu biliyor musunuz? Belki de SQL'i optimize edebilir veya tablolarınıza bazı indeksler koyabilirdiniz?

+0

Elbette, soru üzerinde çalışıyorum. DB'yi öldüren 4'ü buldum. Ama bir güvenlik ağı istiyorum, böylece DB'mi kilitleyebilecek ve siteyi öldürebilecek herhangi bir sorgu yok. –

1

Bir Django DB çoğaltma uygulaması yapıyorum ve aynı çıkmazı yaşıyorum, ağ gecikme süresi uzarsa bazen WAN'da sorgular bazen görünebilir.

576780 Reçete

http://code.activestate.com/recipes/576780/ Gönderen: Zaman aşımı herhangi çağrılabilir ait (neredeyse) herhangi çağrılabilir

bir süre oluşturun sınırlı sürümü için. Örneğin, f işlevini t saniyesi ile sınırlamak için, ilk olarak f zaman sınırlı bir sürümünü oluşturun.

from timelimited import * 

f_t = TimeLimited(f, t) 

Sonra yerine f(...) çağırmak, örneğin dosyaya aşağıdaki gibi kullanın

try: 
    r = f_t(...) 
except TimeLimitExpired: 
    r = ... # timed out 

gibi f_t kullanın:

def _run_timed_query(cursor, log_msg, timeout, query_string, *query_args): 
    """Run a timed query, do error handling and logging""" 
    import sys 
    import traceback 
    from timelimited import * 

    try: 
     return TimeLimited(cursor.execute, timeout)(query_string, *query_args) 
    except TimeLimitExpired: 
     logger_ec.error('%s; Timeout error.' % log_msg) 
     raise TimeLimitExpired 
    except: 
     (exc_type, exc_info, tb) = sys.exc_info() 
     logger_ec.error('%s; %s.' % (log_msg, traceback.format_exception(exc_type, exc_info, None)[0])) 
     raise exc_type 
0

Kullanım InnoDB Tablolar, onlar row-locking yerine table-locking yok.

+0

Bunu yaptım, ama çoğunlukla okuyorum ve InnoDB, sorgu yükümün büyüklüğünde bir yavaşlama sırasıydı :( –

0

En azından canlı veritabanınıza karşı çalıştırmamak için böyle sorgular yazmamalısınız. Mysql, sizi öldüren sorguları tanımlamak için kullanabileceğiniz bir "yavaş sorgu" parametrisine sahiptir. Çoğu zaman, bu yavaş sorgular ya arabalı ya da yeni bir indeks ya da iki tane tanımlayarak hızlandırılabilir.

İlgili konular