वीपीएस पर चलने वाले mysql में बहुत अधिक कनेक्शन और घातक त्रुटि कैसे हल करें


9

मैं अपने लिनक्स सर्वर पर एक एप्लीकेशन PHPlist चला रहा हूं, साथ में 12 PHP स्क्रिप्ट चला रहा हूं, जिनमें से प्रत्येक एक MySQL कनेक्शन खोलता है। अब जब मैं PHPlist एक्सेस करता हूं तो अक्सर यह त्रुटि दिखाई देती है:

घातक त्रुटि: क्षमा करें, सर्वर वर्तमान में बहुत व्यस्त है, कृपया बाद में पुनः प्रयास करें।

जब मैं phpMyAdmin तक पहुंचने का प्रयास कर रहा हूं, तो यह मुझे # 1040 त्रुटि दिखाता है। मेरी PHP स्क्रिप्ट का आउटपुट जो cronनौकरियों से चलता है:

PHP चेतावनी: mysqli_connect (): (HY000 / 1040): बहुत सारे कनेक्शन

मैं phpMyAdmin के साथ सर्वर पर LAMP स्टैक का उपयोग कर रहा हूं; topटर्मिनल शो में उत्पादन mysqld100-130% सीपीयू का उपयोग कर। जब मैं इस समस्या का निवारण करने की कोशिश कर रहा हूं तो मुझे कुछ सुराग मिले:

  • बढ़ाएं max_connection चर: मैं 200 का उपयोग कर रहा हूं (डिफ़ॉल्ट रूप से 100)
  • ओपन टेबल कैश: 512 (डिफ़ॉल्ट रूप से 400)

सेट करने के लिए बहुत सारे चर हैं, लेकिन मैं यह निर्धारित नहीं कर सकता कि कौन से विशिष्ट हैं, मुझे कुछ संदर्भ मिल रहे हैं: बहुत सारे कनेक्शन और http://dev.mysql.com/doc/refman/5.5/en/table-cache। एचटीएमएल

लेकिन मेरे उपयोग के अनुसार स्मृति को कैसे बढ़ाया जाए और मेरे लिए अधिकतम स्मृति क्या है।

अपने सर्वर पर मैं लगभग 12 PHP स्क्रिप्ट, ईमेल भेजने के लिए PHPlist आवेदन और उपयोगकर्ता पंजीकरण के लिए एक प्रमुख डेटाबेस का उपयोग कर रहा हूं।

कृपया इस समस्या को हल करने में मेरी मदद करें।

जवाबों:


12

सबसे पहले आपको इस क्वेरी को चलाने की आवश्यकता है:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

यह उन सभी उपयोगकर्ताओं को सूचीबद्ध करेगा जिनके पास सुपर विशेषाधिकार है । अधिकांश उपयोगकर्ता जो एप्लिकेशन-संबंधित डीबी प्रसंस्करण करते हैं, उन्हें इस विशेषाधिकार की आवश्यकता नहीं होती है। MySQL प्रलेखन के अनुसार , सुपर विशेषाधिकार वाले लोग निम्नलिखित कार्य कर सकते हैं:

  • प्रतिकृति निर्देशांक को नियंत्रित करने के लिए CHANGE मास्टर चलाएँ
  • mysqladmin killअन्य खातों से संबंधित धागे को मारने या मारने के लिए
  • बाइनरी लॉग्स को व्यवस्थित रूप से हटाने के लिए PURGE BINARY LOGS
  • वैश्विक सिस्टम चर को संशोधित करने के लिए सेट ग्लोबल का उपयोग करके कॉन्फ़िगरेशन परिवर्तन करें
  • mysqladmin डीबग कमांड
  • लॉगिंग को सक्षम या अक्षम करना
  • अद्यतन करना भले ही * read_only * सिस्टम चर सक्षम हो
  • दास सर्वर पर प्रतिकृति शुरू करना और रोकना
  • संग्रहीत कार्यक्रमों और विचारों के DEFINER विशेषता में किसी भी खाते की विशिष्टता
  • यहाँ आपके PROBLEM के लिए सबसे महत्वपूर्ण एक है:: यदि आप कनेक्शन सीमा को अधिकतम_कनेक्ट सिस्टम चर द्वारा नियंत्रित किया जाता है, तो भी (एक बार) कनेक्ट करने के लिए आपको सक्षम करता है।

आपको रूट @ लोकलहोस्ट के रूप में लॉगिन करना होगा और सुपर विशेषाधिकार को इस प्रकार बदलना होगा:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

एक बार ऐसा करने के बाद, जब भी सभी उपयोगकर्ता mysql कनेक्शन को भरते हैं, केवल root@localhostलॉगिन कर सकते हैं। सब के बाद, अगर हर कोई और उसकी दादी का सुपर विशेषाधिकार था, तो यह root@localhostकभी भी हर किसी के आगे जुड़ने से रोक देगा। यदि max_connections 200 पर है और आपको mysqld को पुनरारंभ किए बिना इसे 300 तक बढ़ाने की आवश्यकता है, तो आप गतिशील रूप से इस आदेश के साथ max_connections बढ़ा सकते हैं :

mysql> SET GLOBAL max_connections = 300;

यह अधिक कनेक्शनों को तुरंत प्रभावी बनाने की अनुमति देगा, लेकिन केवल मनमाने ढंग से संख्या को बढ़ाएँ नहीं। आपको यह सुनिश्चित करना होगा कि वृद्धि को समायोजित करने के लिए mysql के पास पर्याप्त रैम है।

गुफा: यदि आप डायनामिक रूप से अधिकतम 300 तक बदलते हैं, तो कृपया इसे /etc/my.cnf में डालें

[mysqld]
max_connections=300

आप अपने MySQL DB सर्वर पर mysqltuner.pl चला सकते हैं। यदि आपके पास यह नहीं है, तो निम्न कार्य करें:

cd
wget mysqltuner.pl
perl mysqltuner.pl

प्रदर्शन मेट्रिक्स के तहत तीसरी पंक्ति में यह है

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

5.4M प्रति थ्रेड देखें? यह max_connections द्वारा गुणा किया जाता है। इस उदाहरण में, यह लगभग 10.8G RAM होगा। इसलिए, हर बार जब आप अधिकतम_कनेक्ट करते हैं, तो आपको mysqltuner.pl चलाना चाहिए और जांचें कि क्या आप बहुत अधिक मेमोरी के लिए ओएस दबा रहे हैं।

किसी भी स्थिति में, जिनके पास SUPER विशेषाधिकार हैं, ऐसे उपयोगकर्ताओं को डीबी कनेक्शंस के साथ बाढ़ की स्थिति को कम करने का अवसर देते हैं।


perl mysqltuner.pl की कोशिश करते समय मुझे यह त्रुटि मिली "डेबियन रखरखाव खाते से लॉगिन क्रेडेंशियल्स का उपयोग करने का प्रयास किया गया, लेकिन वे विफल रहे।"
शशांक

मैं अपने स्थानीय ubuntu सर्वर पर यह कोशिश कर रहा हूं, यह अधिकतम मेमोरी उपयोग दिखाता है, लेकिन मेरे vps पर, यह विफलता दिखाता है और मैं phpmyadmin में लॉगिन नहीं कर सकता, लेकिन mysql टर्मिनल में सफलतापूर्वक लॉगिन कर सकता हूं
Shashank

यह cmd wget mysqltuner.pl, index.html डाउनलोड किया है, लेकिन यह एक पर्ल फ़ाइल थी, इसलिए मैंने इसे mysqltuner.pl में बदल दिया और अगले cmd perl mysqltuner.plने काम किया।
MotsManish

2
  1. वैश्विक चर max_connectionsMySQL के समवर्ती कनेक्शन की अधिकतम संख्या निर्धारित करता है। सुनिश्चित करें कि आपके पास इस चर के लिए एक उच्च मूल्य है। आप इस मान को 300 या 400 तक बढ़ा सकते हैं और इस सेटिंग के बाद MySQL को पुनः आरंभ करने का प्रयास कर सकते हैं।
  2. अपने एप्लिकेशन को ऐसे डिज़ाइन करें कि एक MySQL कनेक्शन को बहुत कम समय के लिए खुला रखा जाए।
  3. आपको यह भी जांचना चाहिए कि क्लाइंट कोड लगातार कनेक्शन (जैसे mysql_pconnect ()) का अनुचित तरीके से उपयोग नहीं कर रहा है।

Flush status;इस मान को कम करने के लिए MySQl सर्वर पर कमांड निष्पादित करें।

मुझे उम्मीद है कि ये सुझाव मदद करेंगे।


0

जांचें कि क्या आपकी डिस्क भरी हुई है, यह उसी त्रुटि का कारण बन सकता है:

df -h

आपको प्रत्येक विभाजन पर शेष स्थान दिखाएगा, आपको संभवतः रूट विभाजन /(या / var / मामले में आपके पास एक अतिरिक्त विभाजन होने की जाँच करनी होगी ):

df -h /
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.