MySQL

2008-10-28 24 views
18

में उपयोगकर्ता लॉगिन के आधार पर कनेक्शन टाइमआउट कैसे सेट करें मेरे पास वर्तमान में नींद की स्थिति में 100 से अधिक कनेक्शन हैं।MySQL

कुछ कनेक्शन नींद की स्थिति में रहना चाहिए (और बंद न करें) क्योंकि यह स्थायी कनेक्शन है लेकिन कुछ अन्य (एक अलग उपयोगकर्ता नाम के साथ) कुछ PHP स्क्रिप्ट से हैं और मैं उन्हें बहुत तेज़ी से समय-समय पर करना चाहता हूं।

क्या प्रति उपयोगकर्ता एक प्रतीक्षा_टाउटआउट सेट करना संभव है? और यदि हां, कैसे?

उत्तर

27

कोई प्रति उपयोगकर्ता टाइमआउट कॉन्फ़िगरेशन नहीं है, लेकिन आप गतिशील रूप से wait_timeout मान सेट कर सकते हैं। यही है, किसी दिए गए उपयोगकर्ता के रूप में कनेक्शन बनाने के बाद, आप उस उपयोगकर्ता के सत्र के लिए इच्छित समय सीमा को बदलने के लिए एक कथन जारी कर सकते हैं।

mysql कमांड लाइन ग्राहक में निम्नलिखित प्रयोग का प्रयास करें:

mysql> SHOW VARIABLES LIKE 'wait_timeout'; 

... 28800 (अर्थात 8 घंटे) से पता चलता है, जो डिफ़ॉल्ट wait_timout है।

mysql> SET SESSION wait_timeout = 60; 
mysql> SHOW VARIABLES LIKE 'wait_timeout'; 

... चलता 60.

तो फिर तुम, सत्र छोड़ सकते फिर से कनेक्ट, और फिर डिफ़ॉल्ट wait_timeout 28800. तो यह वर्तमान सत्र के दायरे तक ही सीमित रहा है।

आप एक दूसरी विंडो भी खोल सकते हैं और एक अलग MySQL क्लाइंट सत्र शुरू कर सकते हैं, यह साबित करने के लिए कि एक सत्र में wait_timeout को बदलने से अन्य समवर्ती सत्र प्रभावित नहीं होते हैं।

0

मैं mysql.user तालिका की जाँच की और यह नहीं दिखता है इसके लिए एक सेटिंग है की तरह:

+-----------------------+-----------------------------------+------+-----+---------+-------+ 
| Field     | Type        | Null | Key | Default | Extra | 
+-----------------------+-----------------------------------+------+-----+---------+-------+ 
| Host     | char(60)       | NO | PRI |   |  | 
| User     | char(16)       | NO | PRI |   |  | 
| Password    | char(41)       | NO |  |   |  | 
| Select_priv   | enum('N','Y')      | NO |  | N  |  | 
| Insert_priv   | enum('N','Y')      | NO |  | N  |  | 
| Update_priv   | enum('N','Y')      | NO |  | N  |  | 
| Delete_priv   | enum('N','Y')      | NO |  | N  |  | 
| Create_priv   | enum('N','Y')      | NO |  | N  |  | 
| Drop_priv    | enum('N','Y')      | NO |  | N  |  | 
| Reload_priv   | enum('N','Y')      | NO |  | N  |  | 
| Shutdown_priv   | enum('N','Y')      | NO |  | N  |  | 
| Process_priv   | enum('N','Y')      | NO |  | N  |  | 
| File_priv    | enum('N','Y')      | NO |  | N  |  | 
| Grant_priv   | enum('N','Y')      | NO |  | N  |  | 
| References_priv  | enum('N','Y')      | NO |  | N  |  | 
| Index_priv   | enum('N','Y')      | NO |  | N  |  | 
| Alter_priv   | enum('N','Y')      | NO |  | N  |  | 
| Show_db_priv   | enum('N','Y')      | NO |  | N  |  | 
| Super_priv   | enum('N','Y')      | NO |  | N  |  | 
| Create_tmp_table_priv | enum('N','Y')      | NO |  | N  |  | 
| Lock_tables_priv  | enum('N','Y')      | NO |  | N  |  | 
| Execute_priv   | enum('N','Y')      | NO |  | N  |  | 
| Repl_slave_priv  | enum('N','Y')      | NO |  | N  |  | 
| Repl_client_priv  | enum('N','Y')      | NO |  | N  |  | 
| Create_view_priv  | enum('N','Y')      | NO |  | N  |  | 
| Show_view_priv  | enum('N','Y')      | NO |  | N  |  | 
| Create_routine_priv | enum('N','Y')      | NO |  | N  |  | 
| Alter_routine_priv | enum('N','Y')      | NO |  | N  |  | 
| Create_user_priv  | enum('N','Y')      | NO |  | N  |  | 
| ssl_type    | enum('','ANY','X509','SPECIFIED') | NO |  |   |  | 
| ssl_cipher   | blob        | NO |  |   |  | 
| x509_issuer   | blob        | NO |  |   |  | 
| x509_subject   | blob        | NO |  |   |  | 
| max_questions   | int(11) unsigned     | NO |  | 0  |  | 
| max_updates   | int(11) unsigned     | NO |  | 0  |  | 
| max_connections  | int(11) unsigned     | NO |  | 0  |  | 
| max_user_connections | int(11) unsigned     | NO |  | 0  |  | 
+-----------------------+-----------------------------------+------+-----+---------+-------+ 
37 rows in set (0.00 sec) 

आप MySQLi या पीडीओ का उपयोग कर रहे हैं, इस पर निर्भर करता है, अपने PHP MySQL कनेक्शन या तो लटका चाहिए जब अनुरोध करता है, या अपाचे प्रक्रिया के लिए पूल में साझा किया जाता है।

$ पीडीओ = नए पीडीओ ($ dsn, उपयोगकर्ता $, $ पास, सरणी:

उदाहरण के लिए, पीडीओ के साथ, लगातार कनेक्शन बंद करने के लिए (मुझे लगता है कि यह डिफ़ॉल्ट है), के साथ अपने DB से कनेक्ट (पीडीओ :: ATTR_PERSISTENT => झूठा));

आप अपनी स्क्रिप्ट लगातार कनेक्शन का उपयोग करना चाहते हैं, लेकिन आप भी कई स्लीप मोड में अपने डेटाबेस के लिए खुला कनेक्शन, आप कॉन्फ़िगर करने के बारे में सोचना चाहिए है, तो अपने अपाचे के MaxServers, MaxSpareServers, MinSpareServers और StartServers इतना है कि इतने सारे नहीं आसपास जब लटका उनकी जरूरत नहीं है।

2

एक और संभावना: MySQL इंटरैक्टिव क्लाइंट्स के लिए गैर-इंटरैक्टिव क्लाइंट्स के लिए दो अलग-अलग टाइमआउट चर, wait_timeout और interactive_timeout का समर्थन करता है।

इंटरैक्टिव और गैर-इंटरैक्टिव क्लाइंट्स के बीच का अंतर बस यह लगता है कि आपने कनेक्ट होने पर CLIENT_INTERACTIVE विकल्प निर्दिष्ट किया है या नहीं।

मुझे नहीं पता कि यह आपकी मदद करता है, क्योंकि आपको mysql_real_connect() को client_flag पैरामीटर में उस विकल्प को पास करने की आवश्यकता है। मुझे यकीन नहीं है कि आप किस भाषा या इंटरफ़ेस का उपयोग कर रहे हैं, इसलिए मुझे नहीं पता कि यह आपको इस कनेक्शन ध्वज को निर्दिष्ट करने की अनुमति देता है या नहीं।

वैसे भी आपको लगता है कि ग्राहक ध्वज पारित कर सकते हैं, और आप केवल उन दो अलग अलग प्रकार की जरूरत है, तो आप MySQL सर्वर config में अलग wait_timeout और interactive_timeout कॉन्फ़िगर कर सकता है, और फिर कम मूल्य के साथ एक का उपयोग करें जब आप एक चाहते हैं तत्काल समय के लिए सत्र दिया गया।

0

http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html

यह pt-मारने के लिए प्रति उपयोगकर्ता कनेक्शन को मारने के लिए संभव है। आप इसे शेड्यूल कर सकते हैं या इसे संभालने के लिए पृष्ठभूमि नौकरी सेट कर सकते हैं।

5

आप अपने my.conf में निम्न चर स्थापित करना चाहिए:

[mysqld] 
interactive_timeout=180 
wait_timeout=180 

wait_timeoutस्वचालित कनेक्शन के लिए समय समाप्त है (मेरी राय 30 से अधिक एक वेब सर्वर पर बहुत अधिक है)।
interactive_timeout निष्क्रिय सत्र के लिए कंसोल इंटरैक्शन टाइमआउट है।

+0

कई (सबसे?) वेब सर्वर कनेक्शन पूलिंग का उपयोग करें। इस मामले में, 180 शायद बहुत कम है। –

2

आप Connector/J का उपयोग करते हैं, तो आप sessionVariables ग्राहक की JDBC URL में तो जैसे उपयोग कर सकते हैं: jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600

अन्य भाषाओं के लिए अन्य कनेक्टर्स शायद इसी की अनुमति देगा।

0

जब भी कोई उपयोगकर्ता लॉग इन करता है तो init_connect निष्पादित किया जाएगा, इसलिए हम छोटे केस स्टेटमेंट लिख सकते हैं और उपयोगकर्ता के आधार पर मूल्य निर्धारित कर सकते हैं। कृपया ध्यान दें कि सुपर उपयोगकर्ता के लिए init_connect निष्पादित नहीं किया जाएगा।

mysql> SET GLOBAL init_connect="SET @@wait_timeout = CASE WHEN CURRENT_USER() LIKE '[email protected]%' THEN '30' ELSE @@wait_timeout END";