मैं सभी कनेक्शन (सत्र) को छोड़ना चाहता हूं जो वर्तमान में एक विशिष्ट PostgreSQL डेटाबेस के लिए खोले जाते हैं, लेकिन सर्वर को फिर से शुरू किए बिना या अन्य डेटाबेस से कनेक्शन को डिस्कनेक्ट किए बिना।
मैं उसे कैसे कर सकता हूँ?
मैं सभी कनेक्शन (सत्र) को छोड़ना चाहता हूं जो वर्तमान में एक विशिष्ट PostgreSQL डेटाबेस के लिए खोले जाते हैं, लेकिन सर्वर को फिर से शुरू किए बिना या अन्य डेटाबेस से कनेक्शन को डिस्कनेक्ट किए बिना।
मैं उसे कैसे कर सकता हूँ?
जवाबों:
यहाँ StackOverflow पर इसी तरह के सवाल का मेरा जवाब है ।
Postgresql के आपके संस्करण के आधार पर, आप बग में भाग सकते हैं, जो कि pg_stat_activity
गिराए गए उपयोगकर्ताओं से सक्रिय कनेक्शन को छोड़ देता है। ये कनेक्शन pgAdminIII के अंदर भी नहीं दिखाए गए हैं।
यदि आप स्वचालित परीक्षण कर रहे हैं (जिसमें आप उपयोगकर्ता भी बनाते हैं) तो यह एक संभावित परिदृश्य हो सकता है।
इस मामले में आपको प्रश्नों पर वापस लौटने की आवश्यकता है जैसे:
SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_get_activity(NULL::integer)
WHERE datid=(SELECT oid from pg_database where datname = 'your_database');
इस तरह की क्वेरी में मदद करनी चाहिए (डेटाबेस को 'db' नाम दिया गया है):
select pg_terminate_backend(pid) from pg_stat_activity where datname='db';
pid
कहा जाता है procpid
, इसलिए यदि आप 9.2 से अधिक पुराने पोस्टग्रेज के संस्करण का उपयोग कर रहे हैं, तो आप निम्नलिखित प्रयास कर सकते हैं:
select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';
हालाँकि आपको अन्य उपयोगकर्ताओं को डिस्कनेक्ट करने के लिए सुपरयुसर होना होगा।
यह भी उपयोगी हो सकता है REVOKE CONNECT ON DATABASE FROM PUBLIC
या कुछ इसी तरह, और फिर GRANT
यह बाद में।
इसका उपयोग क्लाइंट कनेक्शन से डेटाबेस को "मुक्त" करने के लिए किया जा सकता है, ताकि आप उदाहरण के लिए इसका नाम बदल सकें:
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;
विदित हो कि इससे आपके क्लाइंट ऐप्स को समस्यात्मक व्यवहार हो सकता है। लेन-देन का उपयोग करने के कारण डेटा की वास्तविक मात्रा पर पर्दा नहीं डाला जाना चाहिए।