हरोकू पोस्टग्रैस - त्रिशंकु क्वेरी (लेनदेन में निष्क्रिय) को समाप्त करें


99

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

select * from pg_stat_activity

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

<IDLE> in transaction

current_query_text कॉलम में।

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

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


1
हो सकता है कि इस सवाल का जवाब "मैं कैसे अपनी खुद की क्वेरी को समाप्त करूं जब पोस्टग्रेज सर्वर पर न तो रूट एक्सेस हो और न ही डेटाबेस तक सुपरसुसर पहुंच"। यह वास्तव में एक बहुत अच्छा प्रश्न लगता है ... और मुझे इसका उत्तर नहीं पता है।
टोबेकेन

जवाबों:


138

यह एक सामान्य पोस्टग्रेज उत्तर है, और हरोकू के लिए विशिष्ट नहीं है


(इस सवाल का सरल-बेवकूफ़ जवाब हो सकता है ... बस पोस्टग्रेजल को फिर से शुरू करें। मान लें कि यह वांछनीय नहीं है या विकल्प नहीं है ...)

इस sql को चलाकर PID खोजें:

SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;

(क्वेरी को पोस्टग्रेज के संस्करण पर निर्भर होने की आवश्यकता हो सकती है - अंततः, बस pg_stat_activity से * का चयन करें)। आप पहले (बाएं) कॉलम में pid पाएंगे, और पहली (शीर्ष) पंक्ति वह क्वेरी होने की संभावना है जिसे आप समाप्त करना चाहते हैं। मुझे लगता है कि नीचे पिड 1234 है।

जब तक यह आपकी या आपके पास सुपर उपयोगकर्ता की पहुंच हो, तब तक आप SQL के माध्यम से एक क्वेरी रद्द कर सकते हैं (अर्थात शेल एक्सेस के बिना)।

select pg_cancel_backend(1234);

यह 1234-क्वेरी को रद्द करने के लिए "मैत्रीपूर्ण" अनुरोध है, और कुछ भाग्य के साथ यह थोड़ी देर बाद गायब हो जाएगा। आखिरकार, यह अधिक कुशल है:

select pg_terminate_backend(1234);

यदि आपके पास शेल एक्सेस और रूट है या अनुमतियाँ पोस्ट करता है, तो आप इसे शेल से भी कर सकते हैं। "रद्द" करने के लिए कोई भी कर सकता है:

kill -INT 1234

और "समाप्त" करने के लिए, बस:

kill 1234

ऐसा न करें:

kill -9 1234

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


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


मैंने कोई फायदा न होने के लिए pg_cancel_backend की कोशिश की। मेरे पास शेल एक्सेस नहीं है और मैं सुपरसुसर नहीं हूं, इसलिए मैं
alan

आप कौन से संस्करण का उपयोग कर रहे हैं? (संकेत:) select version()। क्या आपको उपयोग करते समय कोई त्रुटि संदेश मिलता है pg_cancel_backend?
टोबेकेन

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

1
यह पता चला है कि प्रक्रियाओं को pg_cancel_backend द्वारा रद्द किया जा रहा था, लेकिन प्रश्न अभी भी थोड़ी देर के लिए pg_stat_activity में दिखाते हैं
alan

शायद यह हरोकू के लिए विशिष्ट है। जहाँ तक मैं देख सकता हूँ, साधारण पोस्टगर्ज़ के तहत एक अटक प्रक्रिया को मारने के लिए वास्तव में सुपरयुसर होना आवश्यक है (मैं sss ,ssss withsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssss ss s s s s s s ss ss ss ss ss ss ss ss s s s ss ss ss ss ss sss s s s s s s s s s s s s s s s s s s (pg_sleep (3600) ’’ के साथ परीक्षण कर रहा हूं, और मुझे see OR त्रुटि ’’: संकेत करने के लिए सुपरयुसर होना चाहिए। अन्य सर्वर प्रक्रियाएं ")। हालांकि, फिर "लेनदेन में निष्क्रिय" एक समान नहीं है।
तोबिकेन

36

इसे इस्तेमाल करे:

select pg_terminate_backend(pid int)

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


कृपया अपने उत्तर में अपना पीडा कैसे प्राप्त करें
पर्वतारोहण करें

19

आप 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


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

-3

हम इसे एक क्वेरी में प्राप्त करने के लिए निम्नलिखित का उपयोग कर सकते हैं:

SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';

यह सभी चल रहे प्रश्नों को मार देगा, तो एक के रूप में अच्छी तरह से फिर से शुरू हो सकता है। xact_start और सीमा 1 द्वारा आदेश दें, और मैं सहमत हो सकता हूं ... लेकिन फिर, मैं अंधाधुंध हत्या करने से पहले सूची को देखना पसंद करूंगा।
तोबिक्सन

इस बारे में क्या? SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';
AFN
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.