2009-05-22 9 views
17

मैं एक postgreSQL डेटाबेस के साथ काम कर रहा हूं जो बैचों में अपडेट हो जाता है। मुझे पता होना चाहिए कि पिछली बार डेटाबेस (या डेटाबेस में एक तालिका) को अद्यतन या संशोधित किया गया है, या तो करेगा।मुझे पिछली बार कैसे मिलेगा कि PostgreSQL डेटाबेस अद्यतन किया गया है?

मैंने देखा कि postgeSQL फोरम पर किसी ने सुझाव दिया था कि लॉगिंग का उपयोग करने के लिए और उस समय के लिए अपने लॉग पूछें। यह मेरे लिए काम नहीं करेगा क्योंकि मेरे पास क्लाइंट कोडबेस पर नियंत्रण नहीं है।

MySQL PostgreSQL बनाम:

उत्तर

22

आप हर बार एक सम्मिलित/अपडेट करने पर किया जाता है चलाने के लिए एक trigger लिख सकते हैं एक विशेष मेज। सामान्य उपयोग पंक्ति के "बनाए गए" या "last_updated" कॉलम को वर्तमान समय पर सेट करना है, लेकिन यदि आप मौजूदा तालिकाओं को नहीं बदलना चाहते हैं तो आप केंद्रीय स्थान में समय भी अपडेट कर सकते हैं।

इसलिए उदाहरण के लिए एक विशिष्ट तरीका निम्नलिखित में से एक है:

CREATE FUNCTION stamp_updated() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$ 
BEGIN 
    NEW.last_updated := now(); 
    RETURN NEW; 
END 
$$; 
-- repeat for each table you need to track: 
ALTER TABLE sometable ADD COLUMN last_updated TIMESTAMP; 
CREATE TRIGGER sometable_stamp_updated 
    BEFORE INSERT OR UPDATE ON sometable 
    FOR EACH ROW EXECUTE PROCEDURE stamp_updated(); 

फिर अंतिम अद्यतन समय लगता है, तो आप प्रत्येक तालिका आप ट्रैक कर रहे "मैक्स (LAST_UPDATED)" का चयन और सबसे बड़ी लेने की जरूरत उन में से, जैसे:

SELECT MAX(max_last_updated) FROM (
    SELECT MAX(last_updated) AS max_last_updated FROM sometable 
    UNION ALL 
    SELECT MAX(last_updated) FROM someothertable 
) updates 

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

-- get timestamp of row with highest id 
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1 

ध्यान दें कि यह की आईडी काफी अनुक्रमिक नहीं किया जा रहा मामले में थोड़े से गलत परिणाम दे सकते हैं, लेकिन आप कितना सटीकता की आवश्यकता है? (ध्यान रखें कि लेन-देन का मतलब है कि पंक्तियां आपके लिए बनाए जाने के लिए एक अलग क्रम में दिखाई दे सकती हैं।)

प्रत्येक तालिका में 'अपडेट किए गए' कॉलम जोड़ने से बचने के लिए एक वैकल्पिक दृष्टिकोण अद्यतन करने के लिए केंद्रीय तालिका होना है में timestamps उदाहरण के लिए:।

CREATE TABLE update_log(table_name text PRIMARY KEY, updated timestamp NOT NULL DEFAULT now()); 
CREATE FUNCTION stamp_update_log() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$ 
BEGIN 
    INSERT INTO update_log(table_name) VALUES(TG_TABLE_NAME); 
    RETURN NEW; 
END 
$$; 
-- Repeat for each table you need to track: 
CREATE TRIGGER sometable_stamp_update_log 
AFTER INSERT OR UPDATE ON sometable 
FOR EACH STATEMENT EXECUTE stamp_update_log(); 

यह आपको हर तालिका अद्यतन के लिए एक पंक्ति के साथ एक मेज दे देंगे: आप तो बस कर सकते हैं:

SELECT MAX(updated) FROM update_log 

अंतिम अद्यतन समय प्राप्त करने के लिए। (यदि आप चाहें तो आप टेबल से इसे विभाजित कर सकते हैं)। यह तालिका निश्चित रूप से बढ़ती रहती है: या तो 'अपडेटेड' पर एक इंडेक्स बनाएं (जिसे नवीनतम एक तेज़ तेज़ बनाना चाहिए) या समय-समय पर इसे छोटा कर दें यदि यह आपके उपयोग के मामले में फिट बैठता है, (उदाहरण के लिए टेबल पर एक विशेष लॉक लें, नवीनतम अपडेट समय प्राप्त करें, फिर यदि आप समय-समय पर जांच कर रहे हैं कि परिवर्तन किए गए हैं तो इसे छोटा करें)।

एक वैकल्पिक दृष्टिकोण- जो फोरम पर लोगों का मतलब हो सकता है- डेटाबेस कॉन्फ़िगरेशन में 'log_statement = mod' सेट करना है (या तो क्लस्टर के लिए वैश्विक रूप से, या डेटाबेस या उपयोगकर्ता को ट्रैक करने के लिए) तो डेटाबेस को संशोधित करने वाले सभी बयान सर्वर लॉग में लिखे जाएंगे। आपको सर्वर लॉग को स्कैन करने के लिए डेटाबेस के बाहर कुछ लिखना होगा, उन तालिकाओं को फ़िल्टर करना होगा जिनमें आप रुचि नहीं रखते हैं आदि।

4

ऐसा लगता है कि आप pg_stat_database का प्रयोग कर एक लेन-देन संख्या प्राप्त करने के लिए कर सकते हैं और अगर यह अगले करने के लिए एक बैकअप रन से बदल जाता है की जाँच - this dba.se answer और अधिक जानकारी के

के लिए टिप्पणियों को देखने के
0

आपको एक "अविश्वसनीय में एक संग्रहीत प्रक्रिया लिख ​​सकते हैं भाषा "(उदाहरण के लिए plpythonu): यह पोस्टग्रेस" बेस "निर्देशिका में फ़ाइलों तक पहुंच की अनुमति देता है। संग्रहीत प्रक्रिया में इन फ़ाइलों के बड़े पैमाने पर mtime लौटें।

लेकिन यह केवल अस्पष्ट है, क्योंकि वैक्यूम इन फ़ाइलों और माइट को बदल देगा।

3

मुझे जैक के दृष्टिकोण पसंद हैं। आप तालिका आँकड़े क्वेरी और आवेषण, अपडेट, हटाए गए की संख्या और इसलिए पता कर सकते हैं:

select n_tup_upd from pg_stat_user_tables where relname = 'YOUR_TABLE'; 

हर अद्यतन मन में से 1.

नंगे गिनती में वृद्धि होगी इस विधि व्यवहार्य है आप एक है जब एकल डीबी कई उदाहरणों के लिए शायद अलग दृष्टिकोण की आवश्यकता होगी।