2009-07-29 20 views
19

मैं GoDaddy (linux) द्वारा होस्ट की गई साइट के लिए MySQL 5.0 का उपयोग कर रहा हूं।MySQL त्रुटि "बहुत सारे कनेक्शन"

मैं अपने वेब ऐप पर कुछ परीक्षण कर रहा था, और अचानक मैंने देखा कि पेज वास्तव में धीरे-धीरे रीफ्रेश कर रहे थे। आखिरकार, एक लंबे इंतजार के बाद, मुझे एक पृष्ठ पर मिला जो "MySQL त्रुटि, बहुत सारे कनेक्शन ..." के आधार पर कुछ कहता है, और यह मेरी config.php फ़ाइल को इंगित करता है जो डेटाबेस से कनेक्ट होता है।

यह अभी मुझे डेटाबेस से कनेक्ट कर रहा है, कोई अन्य उपयोगकर्ता नहीं। मेरे प्रत्येक पृष्ठ पर, मैं शीर्ष पर config.php फ़ाइल शामिल करता हूं, और पृष्ठ के अंत में mysql कनेक्शन बंद करता हूं। बीच में कई प्रश्न हो सकते हैं। मुझे डर है कि मैं mysql कनेक्शन को बंद नहीं कर रहा हूं (mysql_close())।

हालांकि, जब मैं क्वेरी चलाने के बाद उन्हें बंद करने का प्रयास करता हूं, तो मुझे पृष्ठ पर कनेक्शन त्रुटियां मिलती हैं। मेरे पेज PHP और HTML हैं। जब मैं कोई प्रश्न बंद करने का प्रयास करता हूं, ऐसा लगता है कि अगला वाला कनेक्ट नहीं होगा। कनेक्ट करने के लिए बंद होने के बाद मुझे config.php फिर से शामिल करना होगा?

यह त्रुटि मुझे डरा रही है क्योंकि 2 सप्ताह में, लगभग 84 लोग इस वेब एप्लिकेशन का उपयोग शुरू करते हैं।

धन्यवाद।

संपादित करें:

यहाँ मेरी पेज के कुछ छद्म कोड है:

require_once('../scripts/config.php'); 

<?php 
    mysql_query.. 

    if(this button is pressed){ 
     mysql_query... 
    } 
    if(this button is pressed){ 
     mysql_query... 
    } 
    if(this button is pressed){ 
     mysql_query... 
    } 
?> 
some html.. 
.. 
.. 
.. 
.. 
<?php 
    another mysql_query... 
?> 
some more html.. 
.. 
.. 
<?php mysql_close(); ?> 

मैं लगा कि इस तरह से, हर बार पेज खुलता है, कनेक्शन खोलता है, और फिर कनेक्शन बंद कर देता है जब पेज लोड हो रहा है।

ठीक है, तो मैं बस बंद फोन GoDaddy के साथ मिल गया: तब, कनेक्शन फिर से जब किसी पृष्ठ पर एक बटन क्लिक करता है, और इतने पर ...

संपादित खोलता है। जाहिर है, मेरे इकोनोमी पैकेज के साथ, मैं एक समय में 50 कनेक्शन तक सीमित हूं। हालांकि मेरी समस्या आज ही मुझे साइट तक पहुंचने के साथ हुई, उन्होंने कहा कि उन्हें पहले कुछ सर्वर समस्याएं थीं। हालांकि, यह देखते हुए कि मेरे वेब ऐप के लिए 84 उपयोगकर्ता कैसे हैं, मुझे शायद "डीलक्स" में अपग्रेड करना चाहिए, जो एक समय में 100 कनेक्शन की अनुमति देता है। किसी दिए गए दिन, लगभग 30 उपयोगकर्ता एक समय में मेरी साइट तक पहुंच सकते हैं, इसलिए मुझे लगता है कि 100 एक सुरक्षित शर्त होगी। क्या आप लोग सहमत हैं?

+0

कुछ कोड पेस्ट करें। – Dirk

+4

यह पागल लग सकता है, लेकिन यह देखने के लिए कि क्या वास्तव में केवल प्रति पृष्ठ लोड को बुलाया जा रहा है, अपने कनेक्शन विधि पर किसी प्रकार का काउंटर डालने का प्रयास करें। मुझे एक ही समस्या थी जहां मैं वास्तव में इसे समझने के बिना हर क्वेरी के लिए एक नया कनेक्शन बना रहा था। एक शॉट के लायक हो सकता है। –

+0

@ माइक बी महान सुझाव, मैं निश्चित रूप से यह कोशिश करूँगा। – littleK

उत्तर

28

साझा-होस्टिंग प्रदाता आम तौर पर एक ही उपयोगकर्ता के लिए एक साथ थोड़ी सी कनेक्शन की अनुमति देते हैं।

क्या अपने कोड करता है:

  • MySQL सर्वर
  • करने के लिए एक कनेक्शन खोलने यह सामान (पेज पैदा करने) है कर
  • पृष्ठ के अंत में कनेक्शन बंद।

अंतिम चरण में, जब पेज के अंत में किया अनिवार्य नहीं है: (के हवाले से mysql_close के मैनुअल):

mysql_close (का उपयोग करते हुए) आम तौर पर आवश्यक नहीं है, के रूप में गैर-लगातार खुले लिंक स्क्रिप्ट के निष्पादन के अंत में स्वचालित रूप से बंद हो जाते हैं।

लेकिन ध्यान दें कि आप शायद लगातार कनेक्शन वैसे भी उपयोग नहीं करना चाहिए ...

दो सुझाव:

  • उपयोग (आप के लिए पहले से ही ठीक) mysql_pconnectकी mysql_connect इनसीड
  • सेट mysql_connect का चौथा पैरामीटर झूठी (पहले से ही आपके लिए ठीक है, क्योंकि यह डिफ़ॉल्ट मान है): (मैन्युअल उद्धरण):

दूसरी कॉल एक ही तर्क के साथ mysql_connect() के लिए किया जाता है, तो कोई नई कड़ी स्थापित किया जाएगा, लेकिन इसके बजाय, पहले से ही खोला लिंक की लिंक पहचानकर्ता लौटा दी जाएगी।

new_link पैरामीटर इस व्यवहार को संशोधित करता है और mysql_connect() हमेशा एक नई लिंक को खोलने के लिए बनाता है, भले ही mysql_connect() ही मानकों के साथ पहले कहा जाता था।



क्या समस्या का कारण बन सकता है, तो?

शायद आप समानांतर (उदाहरण के लिए अपने ब्राउज़र में एकाधिक टैब का उपयोग करके) में कई पृष्ठों तक पहुंचने का प्रयास कर रहे हैं,, जो एक ही समय में वेबसाइट का उपयोग कर कई उपयोगकर्ताओं को अनुकरण करेगा?

यदि आपके पास एक ही समय में साइट का उपयोग करने वाले कई उपयोगकर्ता हैं और mysql_connect के बीच कोड और कनेक्शन बंद होने में बहुत समय लगता है, तो इसका मतलब यह होगा कि एक ही समय में कई कनेक्शन खोले जा रहे हैं ... और आप सीमा तक पहुंचें :-(

फिर भी, क्योंकि आप आवेदन के एकमात्र उपयोगकर्ता हैं, क्योंकि आपके पास 200 एक साथ कनेक्शन की अनुमति है, इस पर कुछ अजीब चल रहा है ...



ठीक है, के बारे में "बहुत अधिक कनेक्शन" और "max_connections" ...

अगर मैं सही ढंग से याद, max_connections कनेक्शन की संख्या को सीमित नहीं करता सोच आप MySQL सर्वर पर खुल सकता है, लेकिन कनेक्शन की कुल संख्या जो उस सर्वर पर खोला जा सकता है, किसी के द्वारा इसे से कनेक्ट कर रहा है।

का हवाला देते हुए Too many connections पर MySQL के प्रलेखन:

आप एक बहुत अधिक कनेक्शन त्रुटि मिलती है जब आप mysqld सर्वर से कनेक्ट करने का प्रयास करें, इसका मतलब है कि सभी कनेक्शन उपलब्ध अन्य ग्राहकों द्वारा उपयोग में हैं ।

अधिकतम कनेक्शन कनेक्शन सिस्टम चर द्वारा नियंत्रित कनेक्शन की संख्या है। इसका डिफ़ॉल्ट मान 100 है। यदि आपको अधिक कनेक्शन का समर्थन करने की आवश्यकता है, तो आपको इस चर के लिए एक बड़ा मान सेट करना चाहिए।

तो, वास्तव में, समस्या आप और न ही अपने कोड (जो ठीक लग रहा है, वास्तव में) से नहीं आते हो सकता है: यह "बस" हो सकता है कि आप केवल एक है कि MySQL सर्वर से कनेक्ट करने की कोशिश कर नहीं कर रहे हैं (याद रखें, "साझा होस्टिंग"), और वहाँ बहुत सारे लोग एक ही समय में इसे का उपयोग कर रहे हैं कि ...

... और अगर मैं सही हूँ और यह कि है, वहाँ कुछ भी नहीं आप कर सकते हैं समस्या को हल करने के लिए करें: जब तक उस सर्वर पर बहुत से डेटाबेस/उपयोगकर्ता हैं और max_connection 200 पर सेट है, तो आप पीड़ित रहेंगे ...


एक sidenote के रूप: वापस GoDaddy के लिए जा रहा उन्हें उस के बारे में पूछ से पहले, यह अच्छा होगा अगर किसी को मान्य हो सकता है मैं तो बस क्या कहा ^^

+0

बहुत अच्छी प्रतिक्रिया के लिए धन्यवाद! मुझे डर था कि यह मेरे नियंत्रण से कुछ हो सकता है ... मुझे यह सुनकर खुशी हो रही है कि मेरा कोड ठीक है, लेकिन मैं सोच रहा था कि क्या यह किसी भी mysql wrapper class को बनाने में मदद करेगा जो डीबी से कनेक्ट होगा, एक क्वेरी चलाएगा, और फिर कनेक्शन बंद कर देगा? मैंने फैसला किया कि मैं कोशिश कर सकता हूं लेकिन बाहर, लेकिन आपकी प्रतिक्रिया के आधार पर, ऐसा लगता है कि MySQL कनेक्शन को बंद करना समस्या नहीं हो सकती है ... – littleK

+0

मैंने अभी एक ईडीआईटी पोस्ट की है जिसमें गोडाडी के साथ मेरी बातचीत है। – littleK

+0

Upg केवल 84 उपयोगकर्ताओं के लिए इस तरह से दौड़ना मुझे लगता है कि मुझे थोड़ा अधिक लगता है (84 उपयोगकर्ता इतना ज्यादा नहीं हैं; वेबसाइटों की संख्या में उससे अधिक उपयोगकर्ता हैं, और उस तरह की समस्या नहीं है) ... अगर उन्हें अपने सर्वर में समस्याएं आ रही हैं, तो आपको यह देखने के लिए थोड़ा इंतजार करना चाहिए कि अब चीजें कैसे हैं, अब –

2

सुनिश्चित करें कि आप लगातार कनेक्शन का उपयोग नहीं कर रहे हैं। यह आमतौर पर एक बुरा विचार है ..

यदि आपको वह मिल गया है .. सबसे अधिक आपको अपाचे प्रक्रियाओं के रूप में उतने ही कनेक्शन का समर्थन करने की आवश्यकता होगी। क्या आप max_connections सेटिंग को बदल सकते हैं?

+0

मैं लगातार कनेक्शन का उपयोग नहीं कर रहा हूं। मैं max_connections सेटिंग को संशोधित नहीं कर सकता, लेकिन GoDaddy के अनुसार: "हम प्रति MySQL उपयोगकर्ता को 200 एक साथ कनेक्शन की अनुमति देते हैं।" – littleK

+0

यदि आपके पास 200 से अधिक अपाचे प्रक्रिया नहीं है, तो यह सत्यापित होगा (जैसा कि अन्य पोस्टर का उल्लेख है) कि आप प्रति अनुरोध 1 से अधिक कनेक्शन नहीं बना रहे हैं। – Evert

2

क्या आप पूरी तरह से सुनिश्चित हैं कि डेटाबेस सर्वर पूरी तरह से आपके लिए समर्पित है?

रूटबेस के रूप में डेटाबेस पर लॉग ऑन करें और यह देखने के लिए कि कौन सा जुड़ा हुआ है, "शो प्रोसेसलिस्ट" का उपयोग करें। आदर्श रूप से यह देखने के लिए अपने मॉनीटरिंग सिस्टम में इसे हुक करें कि समय के साथ कितने कनेक्शन हैं और बहुत सारे हैं तो चेतावनी दें।

अधिकतम डेटाबेस कनेक्शन my.cnf में कॉन्फ़िगर किया जा सकता है, लेकिन स्मृति या पता स्थान से बाहर निकलने के लिए बाहर देखो।

+0

@MarkR दुर्भाग्य से, मैं यह नहीं कर सकता। मैं गोडाडी का उपयोग कर रहा हूं लिनक्स होस्टिंग, इसलिए मेरे पास समर्पित या वर्चुअल सर्वर नहीं है, इसलिए मैं रूट के रूप में लॉग इन नहीं कर सकता ... – littleK

2

आप खोल पहुँच है, तो उपयोग netstat को देखने के लिए कितने सॉकेट आपके डेटाबेस में खोले जाते हैं और वे कहां से आते हैं।

लिनक्स, प्रकार पर:

netstat -n -a |grep 3306 

खिड़कियों पर, टाइप करें:

netstat -n -a |findstr 3306 
+0

मैं ऐसा करने में सक्षम था हालांकि, मुझे नहीं पता कि परिणामों की व्याख्या कैसे करें (किसी भी सार्थक निष्कर्ष पर आना)। मैंने उन्हें निम्नलिखित लिंक पर पोस्ट किया, क्या आप एक नजर डालेंगे? जब मैंने नेटस्टैट किया था तो मुझे अपनी साइट में लॉग इन किया गया था ... http://www.cs.scranton.edu/~behrk2/netstat_results.rtf धन्यवाद! – littleK

3

मैं इस (http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/)

समाधान मैं था के साथ काम कर के बारे में 18 महीने के लिए किया था (जो आप पर लागू होगा) अंत में:

  1. MySQLTuner के अनुसार डेटाबेस को ट्यून करें।
  2. टेबल साप्ताहिक पद से इस post

Defragmenting बैश पटकथा पर आधारित को Defragment:

#!/bin/bash 

# Get a list of all fragmented tables 
FRAGMENTED_TABLES="$(mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME 
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND 
Data_free > 0` | grep -v '^+' | sed 's,t,.,')" 

for fragment in $FRAGMENTED_TABLES; do 
    database="$(echo $fragment | cut -d. -f1)" 
    table="$(echo $fragment | cut -d. -f2)" 
    [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database; 
    OPTIMIZE TABLE $table;" > /dev/null 2>&1 
done 
+0

आपका एनआर 1 लिंक 404 है। क्या यह संसाधन था? https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl –

+0

@JPHellemons धन्यवाद, मैंने लिंक तय कर दिया है - mysqltuner.com आपके द्वारा उल्लिखित एक पर रीडायरेक्ट करता है। यदि रीडायरेक्ट फिर से बदल जाता है तो मैंने इसे mysqltuner.com के रूप में छोड़ दिया है – icc97

1

समाधान कर सकता है इनमें से किसी एक, मैं इस पार एक MCQA परीक्षण में आया था, यहां तक ​​कि मैंने किया समझ में नहीं आया कि कौन सा सही है!

क्रम में "= 200 सेट GLOBALmax_connections"

उपयोग हमेशा mysql_connect() फ़ंक्शन my.cnf "सेट-चर = max_connections = 200"

आदेश निष्पादित में सेट करें mysql सर्वर से कनेक्ट करने

उपयोग हमेशा mysql_pconnect() क्रम में समारोह mysql सर्वर से कनेक्ट करने

0

Followings संभव समाधान हैं:

1) mysql में वैश्विक चर सेट करके अधिकतम कनेक्शन सेटिंग बढ़ाएं।

set global max_connection=200; 

नोट: यह सर्वर लोड में वृद्धि होगी।

2) खाली अपने कनेक्शन पूल के रूप में नीचे:

FLUSH HOSTS;

3) अपने processList की जाँच करें और विशिष्ट processlist मारने अगर आप उनमें से किसी नहीं करना चाहती।


आप इस उल्लेख कर सकते हैं: -

article link

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