2013-07-03 4 views
54

करने के लिए कुछ ऑटो कनेक्शन के डेटाबेस ड्रॉप करने में असमर्थ:Postgresql जब भी मैं डेटाबेस ड्रॉप करने मैं कोशिश क्योंकि डीबी

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

जब मैं का उपयोग करें:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

मुझे लगता है कि डीबी से संबंध समाप्त , लेकिन अगर मैं डेटाबेस छोड़ने का प्रयास करता हूं तो किसी भी तरह से कोई स्वचालित रूप से उस डेटाबेस से कनेक्ट होता है और यह त्रुटि देता है। वह क्या कर सकता है? कोई भी मुझे छोड़कर, इस डेटाबेस का उपयोग नहीं करता है।

उत्तर

54

आप भविष्य कनेक्शन रोका जा सकता है:

REVOKE CONNECT ON DATABASE thedb FROM public; 

(और संभवतः अन्य उपयोगकर्ताओं/भूमिकाओं; psql में \l+ देखें)

बाद ही आप अपना छोड़कर इस डाटाबेस को सभी कनेक्शनों को समाप्त कर सकते हैं:

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid(); 

पुराने संस्करणों pid पर procpid बुलाया गया था ताकि आप उस से निपटने के लिए होगा।

जब से तुम CONNECT अधिकार, जो कुछ भी करने के लिए कोशिश कर रहा था को निरस्त कर दिया गया है स्वत: कनेक्ट अब ऐसा करने में सक्षम होना चाहिए।

अब आप डीबी ड्रॉप करने में सक्षम हो जाएगा।

अगर आप सामान्य कार्यों के लिए सुपर उपयोगकर्ता कनेक्शन का उपयोग कर रहे हैं, लेकिन अगर आप कर रहे हैं कि आप पहले कि समस्या को ठीक करने की जरूरत है काम नहीं करेगा।

+2

देखकर आप बाद में एक ही नाम के साथ एक और डेटाबेस आयात करते हैं तो बाद, अनुदान capab कनेक्ट जनता को वापस लाने की क्षमता: 'जनता को डीडीबीएबी पर लागू करें;' – Mike

18

आप की जाँच क्या संबंध है, जहां यह से आ रहा है है। आप इसे सब कुछ देख सकते हैं:

select * from pg_stat_activity where datname = 'TARGET_DB'; 

शायद यह आपका कनेक्शन है?

+4

sudo मार -9 टर्मिनल में पीआईडी ​​परिणाम –

42

जब भी मैं डेटाबेस ड्रॉप करने की कोशिश मैं:

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

सबसे पहले आप को रद्द करने के

REVOKE CONNECT ON DATABASE TARGET_DB FROM public; 

तब का उपयोग की जरूरत है:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

यह निश्चित रूप से काम करेंगे।

4

अगर आपकी मशीन पर अन्य सेवाओं पर कोई संभावित प्रभाव, बस service postgresql restart

5

मैंने पाया इस समस्या के लिए एक समाधान इस आदेश से टर्मिनल

ps -ef | grep postgres 

मारने की प्रक्रिया में इस आदेश को चलाने का प्रयास

sudo kill -9 PID 
संबंधित मुद्दे