2009-06-30 10 views
21

मैंने phpPgAdmin इंटरफेस के माध्यम से एक बड़ी PostgreSQL तालिका पर एक अद्यतन कथन चलाया। यह बहुत समय के लिए भाग गया क्योंकि यह बहुत लंबा था।संभावित पोस्टग्रेस पंक्ति ताले कैसे जारी करें?

अब मैं उस तालिका से कुछ पंक्तियां अपडेट कर सकता हूं लेकिन सभी नहीं। कुछ पंक्तियों को अपडेट करने का प्रयास लटका होगा।

पंक्तियों को बंद कर दिया गया है? मैं इन पंक्तियों को अद्यतन करने की अनुमति कैसे दे सकता हूं?

उत्तर

20

पोस्टग्रेएसक्यूएल का कौन सा संस्करण आप चल रहे हैं? निम्नलिखित 8.1.8 या बाद में मानता है (यह पहले के संस्करणों पर भी लागू हो सकता है, मुझे नहीं पता)।

मुझे लगता है कि आपका मतलब है कि phpPgAdmin का समय समाप्त हो गया है - PostgreSQL बैकएंड तब तक ले जाएगा जब तक कोई क्वेरी/अपडेट पूरा नहीं होता है। उस स्थिति में, यह संभव है कि मूल सत्र अभी भी जिंदा है और अद्यतन क्वेरी अभी भी चल रही है। मैं निम्न क्वेरी मशीन है कि PostgreSQL सर्वर प्रक्रिया होस्ट करता है, पर (chapter 24 of the PostgreSQL docs से लिया गया) चलाने की सलाह देते देखने के लिए कि सत्र अभी भी जीवित है:

ps auxwww|grep ^postgres 

कई पंक्तियों दिखाई देनी चाहिए: 1 postmaster मास्टर की प्रक्रिया के लिए, और "लेखक", "आंकड़े बफर", और "आंकड़े संग्रहकर्ता" प्रक्रियाओं के लिए प्रत्येक 1। कोई भी शेष रेखाएं डीबी कनेक्शन की सेवा करने वाली प्रक्रियाओं के लिए हैं। इन पंक्तियों में उपयोगकर्ता नाम और डेटाबेस नाम होगा।

उम्मीद है कि, आप देख सकते हैं कि आपने जिस सत्र में मूल अद्यतन किया है वह अभी भी लटक रहा है या नहीं। यद्यपि सिद्धांत में आप सिस्टम दृश्य pg_stat_activity से SELECT आईएन द्वारा अधिक विस्तृत जानकारी प्राप्त कर सकते हैं, डिफ़ॉल्ट रूप से PostgreSQL को सबसे उपयोगी फ़ील्ड (जैसे current_query और query_start) को पॉप्युलेट करने के लिए सेट नहीं किया गया है। भविष्य में इसे सक्षम करने के लिए अध्याय 24 देखें।

यदि आप देखते हैं कि सत्र अभी भी है, तो इसे मार दें। उपयोगकर्ता को प्रक्रिया चलाने के दौरान लॉग इन करने की आवश्यकता होगी (आमतौर पर postgres) या ऐसा करने के लिए रूट - यदि आप स्वयं सर्वर नहीं चलाते हैं, तो अपने डीबीए को यह करने के लिए प्राप्त करें।

एक और बात: एक तालिका में पंक्तियों को अद्यतन करने के लिए, PostgreSQL ताले का उपयोग से बचाता है। इसके बजाए, यह प्रत्येक लेखन लेनदेन को डीबी का एक नया "संस्करण" बनाने की अनुमति देता है, जो लेनदेन के दौरान "वर्तमान संस्करण" बन जाता है, बशर्ते यह अन्य लेनदेन के दौरान किए गए अपडेट के साथ संघर्ष न करे। तो मुझे संदेह है कि आप जो "लटकते हुए" देख रहे हैं वह किसी और चीज के कारण होता है - हालांकि, मुझे यकीन नहीं है। (क्या आपने स्पष्ट चीजों की जांच की है, जैसे डीबी युक्त डिस्क विभाजन भरा हुआ है?)

+0

उत्कृष्ट, यह काम किया, धन्यवाद। ध्यान दें कि जब मैंने उस समस्या को मार दिया जो समस्या पैदा कर रहा था, जिसने कुछ अन्य प्रक्रियाओं को चलाने की अनुमति दी जो लॉक को रिलीज़ करने की प्रतीक्षा कर रहे थे। इससे कुछ और समस्याएं हुईं। जब मैंने पहली समस्या प्रक्रिया को मारने से पहले ps auxwww | grep^postgres चलाया तो मुझे "प्रतीक्षा" चिह्नित प्रक्रियाओं को मारना चाहिए था। – Liam

+0

खुशी मैं मदद कर सकता हूं :) –

+2

"यदि आप देखते हैं कि सत्र अभी भी है, तो इसे मार दें।" - नए लोगों के लिए, यह कहां कहता है कि 'पोस्टग्रेस 15398 ... लेनदेन में निष्क्रिय' या जो कुछ भी और पुटी में '15398 मार डालो' टाइप करें। – Noumenon

0

मैंने कभी पोस्ट्रेस्क्ल के साथ काम नहीं किया है, लेकिन अगर यह दूसरों के समान है तो मैं कहूंगा कि आपको ताले रखने वाले लेनदेन को कनेक्शन/अंत करना होगा।

46

ताले देखना संभव है।

CREATE OR REPLACE VIEW public.active_locks AS 
SELECT t.schemaname, 
    t.relname, 
    l.locktype, 
    l.page, 
    l.virtualtransaction, 
    l.pid, 
    l.mode, 
    l.granted 
    FROM pg_locks l 
    JOIN pg_stat_all_tables t ON l.relation = t.relid 
    WHERE t.schemaname <> 'pg_toast'::name AND t.schemaname <> 'pg_catalog'::name 
    ORDER BY t.schemaname, t.relname; 

तो फिर तुम सिर्फ देखने से का चयन करें::

SELECT * FROM active_locks; 

और साथ यह मारने:

SELECT pg_cancel_backend('%pid%'); 

यहाँ यह थोड़ा सीधे pg_locks का उपयोग करने से आसान बनाने के लिए एक दृश्य है

अन्य समाधान: http://wiki.postgresql.org/wiki/Lock_Monitoring

+2

पोस्टग्रेस में 'active_locks' नाम के साथ कोई दृश्य या तालिका नहीं है। क्या आप शायद 'pg_locks' मतलब है? –

+0

आप सही हैं, हमारे डेटाबेस में एक कस्टम दृश्य था, मैंने जवाब संपादित किया। – Chris

+0

मेरे मामले में, आपके 'pg_cancel_backend' को qeury के साथ संयोजन में: http://stackoverflow.com/a/10317371/301277 ने मुझे सभी "भूल गए" ताले को हटाने की अनुमति दी। धन्यवाद! –

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