2012-07-02 6 views
60

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

select * from pg_stat_activity 

प्रविष्टियों में से एक

<IDLE> in transaction 
current_query_text कॉलम में

है।

नतीजतन, मैं उस तालिका को नहीं छोड़ सकता जो समाप्त होने वाली क्वेरी द्वारा लिखी जा रही थी। मैंने pg_cancel_backend (N) का उपयोग करने का प्रयास किया है और यह सच है लेकिन कुछ भी नहीं होने लगता है।

मैं इस प्रक्रिया को कैसे समाप्त कर सकता हूं ताकि मैं तालिका छोड़ सकूं?

+1

हो सकता है कि सवाल "जब postgres सर्वर और न ही डेटाबेस के लिए सुपर उपयोगकर्ता पहुँच के लिए न तो रूट पहुँच होने कैसे मैं अपने ही क्वेरी समाप्त है" के लिए rephrased किया जाना चाहिए। यह वास्तव में एक बहुत अच्छा सवाल लगता है ... और मुझे जवाब नहीं पता। – tobixen

उत्तर

89

यह एक सामान्य उत्तर है, और उसकेोकू के लिए विशिष्ट नहीं है। आम तौर पर, किसी क्वेरी को रद्द करने के लिए उपयोगकर्ता को पोस्टग्रेस सर्वर या पोस्टग्रेज़ डेटाबेस में सुपरसियर एक्सेस की आवश्यकता हो सकती है - ऐसा लगता है कि एक नियमित उपयोगकर्ता अपनी डीबीए या सिसडमिन को सहायता के लिए अपनी डीबीए या सिसडमिन पूछे बिना अपनी क्वेरी प्रक्रिया को मार नहीं सकता


इस एसक्यूएल चलाकर पीआईडी ​​खोजें:

SELECT procpid,* from pg_stat_activity 
WHERE current_query<>'<IDLE>' ORDER BY xact_start; 

आप पहली बार (बाएं) कॉलम में procpid मिल जाएगा, और पहले (ऊपर) पंक्ति क्वेरी आप 'होने की संभावना है डी समाप्त करना पसंद है। मुझे लगता है कि पिड नीचे 1234 है।

आप एसक्यूएल के माध्यम से क्वेरी रद्द कर सकते हैं (यानी खोल उपयोग के बिना, लेकिन आप शायद डेटाबेस के लिए सुपर उपयोगकर्ता पहुंच की आवश्यकता है):

select pg_cancel_backend(1234); 

यह "सॉफ्ट" तरीका है ... क्वेरी नहीं होगा तुरंत गायब हो जाओ।

kill -INT 1234 

अगर वह मदद नहीं करता है, का उपयोग करें:

select pg_terminate_backend(1234); 

आप खोल पहुँच है, तो आप भी खोल से यह कर सकते हैं:

अगर आप जल्दी में हैं, तो यह एक कोशिश
kill 1234 

नहीं है:

kill -9 1234 

... जो अक्सर पूरे पोस्टग्रेस सर्वर में आग लगने का परिणाम होगा, फिर आप पोस्टग्रेस को पुनरारंभ भी कर सकते हैं। Postgres बहुत मजबूत है, इसलिए डेटा दूषित नहीं किया जाएगा, लेकिन मैं का उपयोग कर "को मारने -9" किसी भी मामले ;-)


में के खिलाफ की सलाह देते हैं "लेन-देन में निष्क्रिय" का मतलब है कि लेन-देन नहीं था एक "प्रतिबद्ध" या "रोलबैक" के साथ समाप्त हुआ, जिसका अर्थ है कि एप्लिकेशन छोटी है या लेनदेन संबंधी डेटाबेस के साथ काम करने के लिए ठीक तरह से डिज़ाइन नहीं किया गया है। दीर्घकालिक "लेनदेन में निष्क्रिय" से बचा जाना चाहिए, क्योंकि यह भी प्रमुख प्रदर्शन समस्याओं का कारण बन सकता है।आप here पा सकते हैं इस बारे में

select pg_terminate_backend(pid int) 

अधिक:

+0

मैंने कोई फायदा नहीं हुआ pg_cancel_backend की कोशिश की। मेरे पास खोल का उपयोग नहीं है और मैं एक सुपरसुर नहीं हूं इसलिए मैं pg_terminate_backend – alan

+0

का उपयोग कर सिगकिल नहीं भेज सकता हूं, आप किस पोस्टग्रेस का उपयोग कर रहे हैं? (संकेत: 'संस्करण का चयन करें() ')। क्या आपको 'pg_cancel_backend' का उपयोग करते समय कोई त्रुटि संदेश मिलता है? – tobixen

+0

ने खुद को pg_cancel_backend का उपयोग करने का प्रयास किया, इसलिए त्रुटि संदेश "अन्य सर्वर प्रक्रियाओं को सिग्नल करने के लिए सुपरसियर होना चाहिए" ... जिसका अर्थ है कि स्पष्ट रूप से आपको सर्वर पर रूट पहुंच या कुछ पोस्टग्रेस सुपर उपयोगकर्ता (यानी पोस्टग्रेस) के माध्यम से डीबी एक्सेस की आवश्यकता होगी उपयोगकर्ता) अपनी खुद की क्वेरी को मारने के लिए। यही कारण है कि – tobixen

33

इस प्रयास करें। सिस्टम द्वारा प्रक्रिया को मारने की तुलना में यह इस समस्या का 'क्लीनर' समाधान होना चाहिए।

+7

यह समाधान है। pg_cancel_backend अक्सर काम नहीं करता है लेकिन * समाप्त * चाल है। –

+0

कृपया अपने उत्तर को अपने उत्तर में कैसे प्राप्त करें – mountainclimber

16

आप पर ऐड-heroku-pg-extras स्थापित कर सकते हैं और प्राप्त करने के लिए निम्न आदेश चला पीआईडी: फिर

heroku pg:locks --app <your-app> 

सिर्फ कार्य करें:

heroku pg:kill <pid> --app <your-app> 

नोट: --force विकल्प के लिए इस्तेमाल किया जा सकता समस्या pg_terminate_backend जो उस क्वेरी के लिए पूरे कनेक्शन को छोड़ देता है।

heroku pg:locks कुछ भी सूची नहीं है, तो heroku pg:ps प्रयास करें।

अधिक जानकारी के लिए देखें:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall

+0

इसने मुझे इतना समय बचाया ... धन्यवाद! –

+0

बिल्कुल सही, धन्यवाद – nrowegt

+0

धन्यवाद। मैं अभी भी लेनदेन/पीआईडी ​​को समाप्त नहीं कर सकता ... हालांकि मेरे कंप्यूटर ने आयात के दौरान हार्डवेयर फ्रीज किया था और मैं पीआईडी ​​को समाप्त करने में असमर्थ हूं। :( – dimitarvp

संबंधित मुद्दे