2011-11-24 14 views
5

हाय मुझे मिनट में मेरे सर्वर पर समस्याएं आ रही हैं क्योंकि कुछ MySQL प्रश्नों को चलाने के लिए बहुत लंबा समय लग रहा है, और सर्वर पर संसाधनों को हॉगिंग कर रहा है।वैसे भी MySQL क्वेरी निष्पादन समय सीमित करने के लिए?

मैं पहले से ही प्रदर्शन में सुधार के लिए सभी प्रश्नों को अनुकूलित करने की प्रक्रिया में हूं, लेकिन जैसा कि हम mysql का उपयोग कर सर्वर पर तीसरे पक्ष के अनुप्रयोगों की उचित मात्रा का उपयोग करते हैं, मैं भविष्य के मुद्दों को रोकने के लिए एक सुरक्षा उपाय करने की उम्मीद कर रहा था ।

मैं क्या जरूरत है कुछ मैं जगह सर्वर विस्तृत में डाल सकते हैं कि सभी प्रश्नों के लिए, लेकिन और अधिक जटिल की रिपोर्ट है कि चलाने के लिए कुछ समय लगेगा कर से कुछ के लिए एक प्रति क्वेरी के आधार पर यह अधिभावी की संभावना के साथ लागू होगी।

मैं समय एक समाधान, लेकिन अभी तक कोई भाग्य को खोजने के लिए googling खर्च किया है,

आपकी मदद

+1

डेमॉन प्रक्रिया है, जो मतदान हर एक्स सेकंड 'MySQL से शो PROCESSLIST' है और लेने के सभी प्रश्नों को मारता है की स्थापना वाई सेकंड – rabudde

+0

हाँ मैं इस PHP का उपयोग जो चल रहे सभी प्रक्रियाओं और निष्पादन हो जाता है के समान दृष्टिकोण देखा की तुलना में अधिक बार और फिर आप उन्हें एक mysql कमांड के साथ मार सकते हैं। एक चालाक विचार, बहुत आश्चर्यजनक कुछ ऐसा नहीं है जो इसके खिलाफ सुरक्षा करता है। अजीब लगता है कि mysql प्रक्रियाओं को अनिवार्य रूप से हमेशा के लिए चलाएगा और प्रक्रिया में सभी सिस्टम संसाधनों को हॉग करेगा। – x9sim9

+0

.NET में बेस क्लास DbCommand में कमांडटाइमआउट प्रॉपर्टी है जो कमांड निष्पादित करने और त्रुटि उत्पन्न करने के प्रयास को समाप्त करने से पहले प्रतीक्षा समय निर्धारित करती है। – Devart

उत्तर

0

MySQL विकल्पों का उपयोग कर यह करने के लिए कोई तरीका नहीं है के लिए धन्यवाद। लेकिन आप अभी भी डेमॉन प्रक्रिया का उपयोग कर ऐसा कर सकते हैं क्योंकि @rabudde ने सलाह दी है।

इस मामले में, यदि आप प्रक्रिया को मार देते हैं तो आप लेनदेन को रद्द कर देंगे और यह रोलबैक होगा।

+1

कृपया ध्यान रखें कि वापस लेनदेन रोलिंग सर्वर पर एक महत्वपूर्ण लोड भी रख सकता है! दुर्भाग्य से यह शायद ही भविष्यवाणी की जा सकती है, लेकिन अंगूठे के नियम के रूप में आपको पता होना चाहिए कि यदि कुछ समय के लिए एक लेनदेन चल रहा है और कई रिकॉर्ड छूएगा, तो इसके रोलबैक समय में वृद्धि होगी। यह एक ही पंक्तियों के साथ कई लेन-देन (चयन करना शामिल है) होने पर भी बदतर हो जाता है। –

+0

सौभाग्य से मैं क्वेरी को निष्पादित किया जा सकता है इसलिए गैर चयन प्रश्नों को अधिक सांस लेने की अनुमति देने के लिए कुछ जगह रखेगी। टीबीएच को अभी तक INSERT/UPDATE/REPLACE से संबंधित प्रदर्शन के साथ कोई समस्या नहीं है, अब तक गलत इंडेक्स चुनने के लिए आमतौर पर MySQL चुनने के साथ चयन प्रश्न हैं, और आश्चर्यजनक रूप से फोर्स इंडेक्स (प्राथमिक) इन प्रश्नों के बारे में 9 0% तय करते हैं! – x9sim9

3

यह एक पूरी तरह से PHP समाधान है जो अब तक जो मैंने पाया है उससे सबसे सरल समाधान प्रतीत होता है।

$result = mysql_query("SHOW FULL PROCESSLIST"); 
while ($row=mysql_fetch_array($result)) 
{ 
    $process_id = $row["Id"]; 
    if ($row["Time"] > 200) 
    { 
    $sql="KILL {$process_id}"; 
    mysql_query($sql); 
    } 
} 

और हर 60 सेकंड में एक सीआरओएन स्क्रिप्ट से इसे चला रहा है।

किसी को भी इस मुद्दे के लिए एक बेहतर समाधान खोजने करता, तो कृपया मुझे पता है

3

आप 300secs से अधिक लंबे समय से चलने वाले प्रश्नों की जांच के लिए निम्न प्रक्रिया का उपयोग कर सकते हैं। घटना समय-समय पर प्रक्रिया चलाती है और सभी लंबे समय तक चलने वाले प्रश्नों को मार देती है।

CREATE PROCEDURE DBNAME.kill_long_running_queries() 
BEGIN 

    DECLARE v_qid BIGINT; 
    DECLARE v_finished INT DEFAULT 0; 
    DECLARE c_queries CURSOR FOR SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 300; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 

    OPEN c_queries; 

    l_fetch_queries: LOOP 
    FETCH c_queries INTO v_qid; 
    IF v_qid > 0 THEN 
     KILL QUERY v_qid; 
    END IF; 
    IF v_finished THEN 
     LEAVE l_fetch_queries; 
    END IF; 
    END LOOP l_fetch_queries; 
    CLOSE c_queries; 

END 

CREATE EVENT kill_long_running_queries 
ON SCHEDULE EVERY 60 SECOND 
DO CALL DBNAME.kill_long_running_queries(); 
+0

यह बहुत अच्छा काम करता है, धन्यवाद! पहले MySQL घटनाओं के बारे में कभी नहीं सुना, उन्हें सक्षम करने के लिए 'event_scheduler = 1' पंक्ति _my.cnf_ में जोड़ने की आवश्यकता है। –

संबंधित मुद्दे