2010-07-06 12 views
15

मैं PostgreSQL में एक स्क्रिप्ट जो हर रात डंप से परीक्षण डेटाबेस पुनर्स्थापित करता है। डेटाबेस को एप सर्वर और कनेक्शन पूल के साथ प्रक्रियाओं द्वारा एक्सेस किया जाता है जो हर समय कुछ कनेक्शन जीवंत रहता है।PostgreSQL: अस्थायी रूप से अक्षम कनेक्शन

तो स्क्रिप्ट my_temp_database में डंप पुनर्स्थापित करता है। तो फिर यह my_database करने के लिए my_old_database करने के लिए my_database, my_temp_database नाम बदलने चाहिए, और अंततः my_old_database छोड़ देते हैं।

my_database से मैं सभी क्लाइंट, सुपरसियर या नहीं डिस्कनेक्ट कैसे कर सकता हूं, ताकि इसका नाम बदला जा सके? मैं अस्थायी रूप से उन्हें पुनः कनेक्ट करने से कैसे रोक सकता हूं?

वहाँ मैं क्या जरूरत है करने के लिए एक बेहतर तरीका है?

उत्तर

23

डेटाबेस 'applogs' नए कनेक्शन के रूप में स्वीकार नहीं कर चिह्नित करने के लिए:

update pg_database set datallowconn = false where datname = 'applogs'; 

एक और संभावना को रद्द करने के लिए ग्राहक भूमिका (रों) के लिए डेटाबेस पर पहुँच 'कनेक्ट' होगा।

डेटाबेस से

डिस्कनेक्ट उपयोगकर्ताओं = बैकएंड मार डालते हैं। तो "applogs" डेटाबेस से अन्य सभी उपयोगकर्ताओं को डिस्कनेक्ट करने, उदाहरण के लिए:

select pg_terminate_backend(procpid) 
from pg_stat_activity 
where datname = 'applogs' and procpid <> pg_backend_pid(); 

एक बार जब आप उन लोगों में से दोनों किया है, आप केवल 'applogs' से जुड़ा उपयोगकर्ता हैं। यद्यपि बैकएंड वास्तव में डिस्कनेक्ट करने से पहले देरी हो सकती है?

+0

हा, मैं चाहता हूँ यह 8.3 में काम किया। –

+0

8.3 में आप 'कोशिश कर सकते हैं pg_stat_activity से pg_terminate_backend (पीआईडी) का चयन करें;' –

+0

@araqnid comand "अद्यतन datallowconn सेट = false जहां datname = 'applogs' pg_database," एक जादू की तरह काम करता है! "डाटाबेस पर कनेक्ट कनेक्ट करें" मेरे लिए काम नहीं करता है! उत्तर प्रदेश! उत्तर प्रदेश! उत्तर प्रदेश! उत्तर प्रदेश! उत्तर प्रदेश! उत्तर प्रदेश! –

7

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

ALTER DATABASE your_db CONNECTION LIMIT 0; 
0

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

यह एक पुरानी 8.3 Postgres पर ठीक काम किया:

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name'; 
0

शुरू PostgreSQL 9.5 हम अंत में कर सकते हैं:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false; 
संबंधित मुद्दे