सवाल PostgreSQL त्रुटि: वसूली के साथ संघर्ष के कारण कथन रद्द करना


स्टैंडबाय मोड में PostgreSQL डीबी पर कोई क्वेरी चलाते समय मुझे निम्न त्रुटि मिल रही है। त्रुटि जो त्रुटि का कारण बनती है 1 महीने के लिए ठीक काम करती है लेकिन जब आप 1 महीने से अधिक समय तक त्रुटि परिणाम पूछते हैं।

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

हल करने के तरीके पर कोई सुझाव? धन्यवाद


76
2018-01-29 21:15


मूल




जवाब:


हॉट-स्टैंडबाय सर्वर पर चलने वाले प्रश्न कुछ हद तक मुश्किल हैं - यह असफल हो सकता है, क्योंकि कुछ आवश्यक पंक्तियों को पूछताछ के दौरान प्राथमिक पर अद्यतन या हटाया जा सकता है। एक प्राथमिक के रूप में यह नहीं पता कि माध्यमिक पर एक प्रश्न शुरू हो गया है, ऐसा लगता है कि यह अपनी पंक्तियों के पुराने संस्करण (वैक्यूम) को साफ कर सकता है। फिर माध्यमिक को इस सफाई को फिर से चलाने के लिए है, और इन पंक्तियों का उपयोग करने वाले सभी प्रश्नों को जबरन रद्द करना होगा।

लंबे प्रश्नों को और अधिक बार रद्द कर दिया जाएगा।

आप प्राथमिक पर एक दोहराने योग्य पठन लेनदेन शुरू करके इस पर काम कर सकते हैं जो एक डमी क्वेरी करता है और फिर निष्क्रिय क्वेरी पर चलने पर निष्क्रिय रहता है। इसकी उपस्थिति प्राथमिक पर पुराने पंक्ति संस्करणों के निर्वात को रोक देगा।

इस विषय और अन्य कामकाज पर अधिक समझाया गया है हॉट स्टैंडबाय - प्रश्न पूछने के संघर्ष दस्तावेज में खंड।


48
2018-01-29 23:51



PostgreSQL 9.1+ के उपयोगकर्ताओं के लिए: देखें eradmanव्यावहारिक समाधान के लिए नीचे का जवाब। - Zoltán


मास्टर पर निष्क्रिय लेनदेन शुरू करने की कोई आवश्यकता नहीं है। Postgresql-9.1 में इस समस्या को हल करने का सबसे सीधा तरीका सेटिंग द्वारा है

hot_standby_feedback = on

इससे मास्टर लंबे समय से चलने वाले प्रश्नों के बारे में जागरूक हो जाएगा। वहाँ से डॉक्स:

पहला विकल्प पैरामीटर hot_standby_feedback सेट करना है, जो रोकता है   हाल ही में मृत पंक्तियों को हटाने से वैक्यूम और इतने साफ-सफाई संघर्ष नहीं होते हैं।

यह डिफ़ॉल्ट क्यों नहीं है? यह पैरामीटर प्रारंभिक के बाद जोड़ा गया था कार्यान्वयन और यह एकमात्र तरीका है कि एक स्टैंडबाय मास्टर को प्रभावित कर सकता है।


56
2018-02-10 19:34



यह परम स्टैंडबाय पर सेट किया जाना चाहिए। - Steve Kehlet
इस मामले में मास्टर के लिए कुछ नुकसान हैं गर्म स्टैंडबाय-प्रतिक्रिया - Eugene Liskovets
मेरी प्रतिक्रिया जांचें, यह एक अच्छा अभ्यास नहीं लगता है - Gilles Quenot


जैसा कि कहा गया यहाँ के बारे में hot_standby_feedback = on :

खैर, इसका नुकसान यह है कि स्टैंडबाय मास्टर को फहरा सकता है,   जो कुछ लोगों के लिए भी आश्चर्यजनक हो सकता है

तथा यहाँ:

Max_standby_streaming_delay की सेटिंग के साथ? इससे बेहतर मैं   डिफॉल्ट hot_standby_feedback पर डिफ़ॉल्ट से -1 तक। इस तरह क्या   आप स्टैंडबाय पर केवल स्टैंडबाय को प्रभावित करते हैं


तो मैंने जोड़ा

max_standby_streaming_delay = -1

और नहीं pg_dump हमारे लिए त्रुटि, न ही मास्टर ब्लोट :)


37
2017-10-22 13:58



@ लिनार्ड, यह मेरे लिए काम किया। मैंने इस कॉन्फ़िगर को गुलाम के postgresql.conf पर जोड़ा, फिर दास को पुनरारंभ किया। - Ardee Aram
आप निश्चित रूप से इस तरह से unbounded प्रतिकृति अंतराल प्राप्त कर सकते हैं। और यदि आप प्रतिकृति को मास्टर से जोड़ने के लिए एक प्रतिकृति स्लॉट का उपयोग कर रहे हैं, जिसके परिणामस्वरूप मास्टर पर अत्यधिक xlog प्रतिधारण हो सकता है, तो यह वास्तव में केवल व्यवहार्य है यदि आप WAL संग्रह का उपयोग कर रहे हैं। - Craig Ringer
एडब्ल्यूएस आरडीएस पर यह कैसे सेट करें? - Kris MP
@KrisMP psql का प्रयोग करें - Yehonatan
पैरामीटर समूह में @ KrisMP - docs.aws.amazon.com/AmazonRDS/latest/UserGuide/... - r3m0t


स्पर्श करने की कोई ज़रूरत नहीं है hot_standby_feedback। जैसा कि अन्य ने उल्लेख किया है, इसे स्थापित करना on मास्टर bloat कर सकते हैं। एक गुलाम पर लेनदेन खोलने की कल्पना करो और इसे बंद नहीं करें।

इसके बजाय, सेट करें max_standby_archive_delay तथा max_standby_streaming_delay कुछ सौ मूल्य के लिए:

# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s

इस तरह 900 सेकंड से कम अवधि के साथ दासों पर पूछताछ रद्द नहीं की जाएगी। यदि आपके वर्कलोड को लंबे प्रश्नों की आवश्यकता है, तो बस इन विकल्पों को उच्च मान पर सेट करें।


15
2017-12-05 19:33





हॉट स्टैंडबाय दास सर्वर पर तालिका डेटा संशोधित किया जाता है जबकि एक लंबी चल रही क्वेरी चल रही है। एक समाधान (PostgreSQL 9.1+) यह सुनिश्चित करने के लिए कि तालिका डेटा संशोधित नहीं किया गया है, प्रतिलिपि को निलंबित करना और क्वेरी के बाद फिर से शुरू करना है:

select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume

4
2017-10-05 08:56



इसके लिए सुपरसुर अधिकारों की आवश्यकता है। तो यह कुछ मामलों में एक समाधान नहीं हो सकता है। - Joao Baltazar