2016-09-20 3 views
6

मैंने हाल ही में एक एप्लिकेशन को विरासत में मिला है जो PostgreSQL का उपयोग करता है और मैं डेटाबेस में रिकॉर्ड सहेजने से संबंधित समस्याओं का निवारण कर रहा हूं।मैं PostgreSQL लॉग में लेनदेन कैसे ट्रैक करूं?

मुझे पता है कि PostgreSQL मुझे log_line_prefix में %x के विशेष मूल्य सहित लॉग में लेनदेन आईडी रिकॉर्ड करने की अनुमति देता है। मैंने जो देखा, वह यह है कि लेनदेन के भीतर होने वाला पहला बयान हमेशा शून्य से लॉग हो जाता है।

अगर मैं psql में निम्न कार्रवाई,

begin; 
insert into numbers (1); 
insert into numbers (2); 
commit; 

क्वेरी लॉग शामिल होंगे निम्नलिखित प्रविष्टियों:

2016-09-20 03:07:40 UTC 0 LOG: statement: begin; 
2016-09-20 03:07:53 UTC 0 LOG: statement: insert into numbers values (1); 
2016-09-20 03:07:58 UTC 689 LOG: statement: insert into numbers values (2); 
2016-09-20 03:08:03 UTC 689 LOG: statement: commit; 

मेरे लॉग प्रारूप %t %x है और जैसा कि आप देख सकते हैं, लेन-देन आईडी पहले सम्मिलन कथन के लिए 0 है, लेकिन जब मैं दूसरा डालने निष्पादित करता हूं तो यह 68 9 में बदल जाता है।

कोई भी बता सकता है कि लेनदेन शुरू करने के बाद क्यों PostgreSQL पहले कथन पर सही लेनदेन आईडी लॉग नहीं करता है? या अगर मैं यह गलत कर रहा हूं, तो लॉग फ़ाइल को देखकर एक ही लेनदेन का हिस्सा कौन सा प्रश्न पहचानने का एक और विश्वसनीय तरीका है?

उत्तर

8

कथन प्रारंभ होने के बाद लेनदेन आईडी असाइन की जाती है, इसलिए log_statement इसे कैप्चर नहीं करता है। BEGIN एक लेनदेन आईडी असाइन नहीं करता है, यह पहली लेखन ऑपरेशन तक देरी हो रही है।

इसके बजाय आभासी txid का उपयोग करें, जिसे तत्काल असाइन किया गया है। प्लेसहोल्डर %v है। ये तुरंत सौंपा गया है, लेकिन लगातार नहीं हैं और बैकएंड-स्थानीय हैं।

मुझे यह लॉग इन करने में उपयोगी लगता है। Txid क्योंकि यह xmin और xmax सिस्टम कॉलम सामग्री आदि से मेल खाता है; लेनदेन में किए गए संचालन को समूहबद्ध करने में मेरी मदद करने के लिए vtxid।

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