तालिका के अंतिम संशोधित समय का कोई विश्वसनीय, आधिकारिक रिकॉर्ड नहीं है। कई कारणों से रफ़िलीनोड का उपयोग करना गलत है:
राइट्स को शुरू में राइट-हेड लॉग (वाल) में दर्ज किया जाता है, फिर lazily to heap (टेबल फाइलें)। एक बार रिकॉर्ड होने के बाद, Pg इसे ढेर में लिखने के लिए जल्दी नहीं करता है, और यह अगले सिस्टम चेकपॉइंट तक भी नहीं लिखा जा सकता है;
बड़ी तालिकाओं में कई कांटे होते हैं, आपको सभी कांटों की जांच करनी होगी और नवीनतम टाइमस्टैम्प चुनना होगा;
एक साधारण SELECT
संकेत-बिट सेटिंग के कारण अंतर्निहित तालिका में लेखन गतिविधि उत्पन्न कर सकता है;
ऑटोवेकम और अन्य रखरखाव जो उपयोगकर्ता को दिखाई देने वाले डेटा को नहीं बदलते हैं, अभी भी संबंध फाइलों को संशोधित करता है;
कुछ ऑपरेशन, जैसे vaccum full
, रिलफेनोड को बदल देंगे। यह वह जगह नहीं हो सकती है जहां आप उम्मीद करते हैं कि आप उचित ताला न लगाकर समवर्ती रूप से देखने की कोशिश कर रहे हैं।
कुछ विकल्प
आप विश्वसनीयता की जरूरत नहीं है, तो आप संभवतः में जानकारी का उपयोग कर सकते हैं pg_stat_database
और pg_stat_all_tables
। ये आपको अंतिम आँकड़े रीसेट करने का समय दे सकते हैं, और अंतिम आँकड़े रीसेट होने के बाद से गतिविधि आँकड़े । यह आपको नहीं बताता है कि सबसे हाल की गतिविधि कब थी, केवल यह कि यह आखिरी आँकड़े रीसेट के बाद से था, और उस आँकड़े के रीसेट होने से पहले क्या हुआ, इसके बारे में कोई जानकारी नहीं है। तो यह सीमित है, लेकिन यह पहले से ही वहां है।
इसे मज़बूती से करने का एक विकल्प यह है कि प्रत्येक तालिका के लिए अंतिम-संशोधित समय वाली तालिका को अद्यतन करने के लिए ट्रिगर का उपयोग किया जाए। ध्यान रखें कि ऐसा करने से तालिका के सभी लेखन क्रमबद्ध हो जाएंगे , संक्षिप्तता को नष्ट कर देंगे । यह हर लेन-देन के लिए उचित ओवरहेड भी जोड़ देगा। मैं इसकी अनुशंसा नहीं करता।
उपयोग करने के लिए थोड़ा कम भयानक विकल्प है LISTEN
और NOTIFY
। PostgreSQL और LISTEN
घटनाओं के लिए एक बाहरी डेमॉन प्रक्रिया कनेक्ट करें । जब कोई तालिका बदलता है, तो तालिका को अधिसूचित पेलोड के रूप में तालिका में ON INSERT OR UPDATE OR DELETE
भेजने के लिए ट्रिगर्स का उपयोग करें NOTIFY
। लेन-देन शुरू होने पर ये भेजे जाते हैं। आपका डेमन परिवर्तन सूचनाओं को जमा कर सकता है और आलसी उन्हें डेटाबेस में एक मेज पर वापस लिख सकता है। यदि सिस्टम क्रैश हो जाता है, तो आप सबसे हाल के संशोधनों के अपने रिकॉर्ड को खो देते हैं, लेकिन यह ठीक है, यदि आप क्रैश के बाद शुरू कर रहे हैं, तो आप सभी तालिकाओं को बस संशोधित मानते हैं।
समवर्ती मुद्दों की सबसे खराब स्थिति से बचने के लिए आप बदले में एक टाइमस्टैम्प को before insert or update or delete or truncate on tablename for each statement execute
ट्रिगर का उपयोग करके लॉग कर सकते हैं , जो कि एक पैरामीटर के रूप में संबंध ओआईडी लेने के लिए सामान्यीकृत है। यह एक (relation_oid, timestamp)
जोड़ी को एक परिवर्तन-लॉगिंग तालिका में सम्मिलित करेगा । फिर आपके पास एक अलग कनेक्शन पर एक सहायक प्रक्रिया होती है, या समय-समय पर आपके ऐप द्वारा कॉल की जाती है, नवीनतम जानकारी के लिए उस तालिका को एकत्रित करें, इसे हाल के परिवर्तनों के सारांश तालिका में मर्ज करें, और लॉग तालिका को काट दें। सुनो / अधिसूचित दृष्टिकोण पर इसका एकमात्र लाभ यह है कि यह दुर्घटना की जानकारी नहीं खोता है - लेकिन यह बहुत कम कुशल भी है।
एक और दृष्टिकोण एक सी विस्तार समारोह लिखने के लिए हो सकता है कि का उपयोग करता है (उदाहरण के लिए) ProcessUtility_hook
, ExecutorRun_hook
, आदि जाल तालिका परिवर्तन और lazily अद्यतन आँकड़े करने के लिए। मैंने यह देखने के लिए नहीं देखा कि यह कितना व्यावहारिक होगा; स्रोतों में विभिन्न _hook विकल्पों पर एक नज़र डालें।
सबसे अच्छा तरीका यह होगा कि इस जानकारी को रिकॉर्ड करने के लिए सांख्यिकी कोड को पैच किया जाए और कोर में शामिल करने के लिए PostgreSQL को एक पैच सबमिट किया जाए। सिर्फ कोड लिखकर शुरू न करें; एक बार अपने विचार को बढ़ाएं-एक बार जब आप इसके बारे में सोच लें कि इसे करने के लिए एक अच्छी तरह से परिभाषित तरीका है (यानी कोड को पढ़कर शुरू करें, तो "मैं कैसे करूं ..." पूछकर पोस्ट न करें)। अंतिम-अपडेट किए गए समय को जोड़ना अच्छा हो सकता है pg_stat_...
, लेकिन आपको उस समुदाय को समझाना होगा, जो ओवरहेड के लायक था या इसे वैकल्पिक रूप से ट्रैक करने का एक तरीका प्रदान करता है - और आपको आँकड़े रखने के लिए कोड लिखना होगा और एक पैच सबमिट करें , क्योंकि केवल वही व्यक्ति जो यह सुविधा चाहता है, वह इससे परेशान होने वाला है।
मैं यह कैसे करूँगा
अगर मुझे ऐसा करना था, और इसे ठीक से करने के लिए एक पैच लिखने का समय नहीं था, तो मैं शायद ऊपर बताए गए सुनो / सूचित दृष्टिकोण का उपयोग करूंगा।
PostgreSQL 9.5 प्रतिबद्ध टाइमस्टैम्प के लिए अद्यतन
अपडेट : PostgreSQL 9.5 ने टाइमस्टैम्प बनाया है । यदि आपने उन्हें postgresql.conf
(और अतीत में भी ऐसा किया है) सक्षम किया है, तो आप अंतिम संशोधित समय xmin
को अनुमानित करने के लिए पंक्ति के लिए प्रतिबद्ध टाइमस्टैम्प की जांच कर सकते हैं । यह केवल एक सन्निकटन है क्योंकि यदि सबसे हालिया पंक्तियों को हटा दिया गया है तो उन्हें गिना नहीं जाएगा।
इसके अलावा, प्रतिबद्ध टाइमस्टैम्प रिकॉर्ड केवल एक सीमित समय के लिए रखे जाते हैं। इसलिए यदि आप यह बताना चाहते हैं कि जब एक तालिका जो संशोधित नहीं है, तो संशोधित की गई है, तो उत्तर प्रभावी रूप से "डननो, थोड़ी देर पहले" होगा।