2010-07-09 13 views
13

विकास सर्वर पर मैं अप्रयुक्त डेटाबेस को हटाना चाहता हूं। यह समझने के लिए कि मुझे यह जानने की ज़रूरत है कि डेटाबेस अभी भी किसी के द्वारा उपयोग किया जाता है या नहीं।PostgreSQL डेटाबेस की अंतिम पहुंच/संशोधन दिनांक कैसे प्राप्त करें?

क्या दिया गया डेटाबेस, स्कीमा या टेबल की अंतिम पहुंच या संशोधन तिथि प्राप्त करने का कोई तरीका है?

+2

प्रतिबद्ध सभी दृष्टिकोण है कि ऑपरेटिंग परीक्षण पर भरोसा करते हैं सिस्टम फ़ाइल संशोधन समय गलत है, http://dba.stackexchange.com/a/58246/7788 –

उत्तर

9

आप तालिका की फ़ाइल के अंतिम संशोधन समय की जांच करके इसे कर सकते हैं। PostgreSQL में, हर तालिका में एक या अधिक ओएस फ़ाइलों अनुरूप, इस तरह:

select relfilenode from pg_class where relname = 'test'; 

relfilenode तालिका "परीक्षण" तो फिर आप डेटाबेस की निर्देशिका में फ़ाइल मिल सकता है की फ़ाइल का नाम है।

अपने परीक्षण वातावरण में

:

cd /data/pgdata/base/18976 

ls -l -t | head 

पिछले आदेश का मतलब है सभी फाइलों को अंतिम संशोधन समय द्वारा आदेश दिया लिस्टिंग।

+0

यह भी बेहतर है। धन्यवाद! –

+6

'वैक्यूम' गतिविधि, संकेत-बिट सेटिंग इत्यादि के कारण आपको झूठी सकारात्मक चीज़ें मिलेंगी। –

1

मुझे लगता है कि आपको कुछ लॉग विकल्प सक्रिय करना चाहिए। आप postgreSQL here पर लॉगिंग के बारे में जानकारी प्राप्त कर सकते हैं।

+0

I देखें उम्मीद कर रहा था कि psql के साथ ऐसा करने का तरीका है। हालांकि, आपकी टिप स्क्रिप्ट में भी उपयोग की जा सकती है। अगर सबकुछ विफल रहता है तो मैं लॉग फाइलों का उपयोग करूंगा। धन्यवाद! –

+0

लॉग फ़ंक्शन से 'चयन' के माध्यम से संशोधित तालिका जैसी चीजें नहीं दिखाएंगे। ऐसा लगता है कि इस उपयोग के मामले के लिए ठीक रहेगा, लेकिन यह वास्तविक संशोधन समय की तलाश करने वाले लोगों के लिए काम नहीं करेगा। –

+0

http://dba.stackexchange.com/a/58246/7788 – user637338

1

मेरी टेबल के संशोधन दिनांक पाने के लिए मेरे रास्ते:

अजगर समारोह

CREATE OR REPLACE FUNCTION py_get_file_modification_timestamp(afilename text) 
    RETURNS timestamp without time zone AS 
$BODY$ 
    import os 
    import datetime 
    return datetime.datetime.fromtimestamp(os.path.getmtime(afilename)) 
$BODY$ 
    LANGUAGE plpythonu VOLATILE 
    COST 100; 

एसक्यूएल क्वेरी

SELECT 
    schemaname, 
    tablename, 
    py_get_file_modification_timestamp('*postgresql_data_dir*/*tablespace_folder*/'||relfilenode) 
FROM 
    pg_class 
INNER JOIN 
    pg_catalog.pg_tables ON (tablename = relname) 
WHERE 
    schemaname = 'public' 

मुझे यकीन है कि नहीं कर रहा हूँ अगर वैक्यूम कर सकते हैं गंदगी इस aproach तरह बातें , लेकिन मेरे परीक्षणों में यह उन तालिकाओं को प्राप्त करने के लिए एक बहुत ही सटीक तरीका है जो कम से कम, INSERT/UPDATE परिचालनों पर उपयोग नहीं किए जाते हैं।

+3

यह मुख्य प्रश्न पर मेरी टिप्पणी में लिंक्ड पोस्ट में दिए गए कारणों के लिए गलत है। –

7

ऐसा करने के लिए कोई अंतर्निहित तरीका नहीं है - और all the approaches that check the file mtime described in other answers here are wrong। एकमात्र विश्वसनीय विकल्प प्रत्येक तालिका में ट्रिगर्स जोड़ना है जो एक ही परिवर्तन-इतिहास तालिका में परिवर्तन रिकॉर्ड करता है, जो बेहद अक्षम है और इसे पीछे से नहीं किया जा सकता है।

यदि आप केवल "डेटाबेस उपयोग किए गए" बनाम "डेटाबेस का उपयोग नहीं किया गया" के बारे में परवाह करते हैं तो आप संभावित रूप से CSV- प्रारूप डेटाबेस लॉग फ़ाइलों से इस जानकारी को एकत्र कर सकते हैं। "संशोधित" बनाम "संशोधित नहीं" का पता लगाना बहुत कठिन है; SELECT writes_to_some_table(...) पर विचार करें।

आप वर्ष गतिविधि का पता लगाने की जरूरत नहीं है, तो आप pg_stat_database, जो गतिविधि रिकॉर्ड के बाद से पिछले आँकड़े रीसेट उपयोग कर सकते हैं। उदा .:

-[ RECORD 6 ]--+------------------------------ 
datid   | 51160 
datname  | regress 
numbackends | 0 
xact_commit | 54224 
xact_rollback | 157 
blks_read  | 2591 
blks_hit  | 1592931 
tup_returned | 26658392 
tup_fetched | 327541 
tup_inserted | 1664 
tup_updated | 1371 
tup_deleted | 246 
conflicts  | 0 
temp_files  | 0 
temp_bytes  | 0 
deadlocks  | 0 
blk_read_time | 0 
blk_write_time | 0 
stats_reset | 2013-12-13 18:51:26.650521+08 

तो मैं देख सकता हूँ कि वहाँ इस डीबी पर गतिविधि नहीं हुई क्योंकि पिछले आंकड़े रीसेट है। हालांकि, मुझे आंकड़ों को रीसेट करने से पहले क्या हुआ, इसके बारे में कुछ भी नहीं पता, इसलिए यदि मेरे पास आधे घंटे पहले आंकड़े रीसेट होने के बाद शून्य गतिविधि दिखाई दे रही थी, तो मुझे कुछ भी उपयोगी नहीं पता था।

3

PostgreSQL 9.5 हमें अंतिम संशोधित प्रतिबद्धता को ट्रैक करने दें।

  1. चेक ट्रैक करने पर या निम्न क्वेरी

    show track_commit_timestamp; 
    
  2. का उपयोग कर बंद है अगर यह "ऑन" लौट कदम किसी और 3 को संशोधित postgresql.conf जाना

    cd /etc/postgresql/9.5/main/ 
    vi postgresql.conf 
    

    बदलें
    track_commit_timestamp = off 
    

    करने के लिए

    track_commit_timestamp = on 
    

    रीबूट प्रणाली

    दोहराएँ कदम 1.

  3. उपयोग ट्रैक करने के लिए निम्न क्वेरी पिछले

    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME; 
    
    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME where COLUMN_NAME=VALUE; 
    
संबंधित मुद्दे