2012-12-18 33 views
7

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

यदि मैं सही ढंग से समझता हूं, ऑटोवैक्यूम टुपल्स में लात और विश्लेषण और पुनर्गठन करेगा, तो प्रदर्शन कम होगा जब कम रिकॉर्ड मौजूद थे।

वास्तविक डिस्क स्थान, जारी नहीं किया जाएगा अगर मैं सही ढंग से समझ, के बाद से है कि केवल एक वैक्यूम पूर्ण के साथ होता है, और कहा कि autovacuum से शुरू हो रहा नहीं है।

तो मैं एक स्वचालित प्रक्रिया के बारे में सोच रहा था जो ऐसा करेगा।

मुझे ब्लोट दृश्य मिला जो http://wiki.postgresql.org/wiki/Show_database_bloat पर nagios check_postgres द्वारा उपयोग किया जाता है।

क्या यह दृश्य अच्छा है? क्या मैं समझने में सही हूं कि tbloat है> 2, यह एक वैक्यूम पूर्ण का उपयोग कर सकता है? और यदि ibloat बहुत अधिक है, तो यह REINDEX का उपयोग कर सकता है?

दैनिक बैच नौकरी के रूप में चलाने के लिए निम्नलिखित नौकरी पर कोई टिप्पणी? केवल-विश्लेषण

  • select tablename from bloatview order by tbloat desc limit 1
  • vacuumdb -f -t tablename mydatabase
  • select tablename, iname from bloatview order by ibloat desc limit 1
  • reindexdb -t tablename -i iname mydatabase
  • जरुर साथ

    • vacuumdb -Z mydatabase #vacuum, मैं अभी भी में एक अच्छा पर्ल स्क्रिप्ट में लपेट की जरूरत है crontab (हम उबंटू 12 का उपयोग कर रहे हैं), या postgresql कुछ प्रकार है शेड्यूलर का मैं यह कर सकता था?

      या यह कुल ओवरकिल है और क्या यह एक बहुत ही सरल प्रक्रिया है?

    +0

    वैक्यूमडब-जेड शायद आवश्यक नहीं है, ऑटोवाक्यूम विश्लेषण को अद्यतित रखने का एक बहुत अच्छा काम करता प्रतीत होता है। – greyfairer

    उत्तर

    4

    आप शायद डॉन ' टी की जरूरत नहीं है। यह एक बार ऐसा करना अच्छा होता है - पहली संग्रह नौकरी के बाद आपको अपनी डिस्क स्पेस वापस मिल जाएगी लेकिन उसके बाद आपका दैनिक संग्रह नौकरी और ऑटोवाक्यूम मृत ट्यूपल्स ब्लोट को रोक देगा।

    इसके अलावा vacuum full के बजाय cluster table_name using index_name; analyze table_name चलाने के लिए अक्सर बेहतर होता है।यह एक सूचकांक के अनुसार पंक्तियों को फिर से व्यवस्थित करेगा। इस तरह से संबंधित तालिका पंक्तियों को डिस्क पर भौतिक रूप से बंद किया जा सकता है, जो डिस्क की मांग को सीमित कर सकता है (क्लासिक डिस्क ड्राइव पर महत्वपूर्ण, एसएसडी पर काफी हद तक अप्रासंगिक) और आपके सामान्य प्रश्नों के लिए कई पढ़े जा सकते हैं।

    और याद रखें कि vacuum full और cluster दोनों टेबल चलाने के दौरान अनुपयोगी बना देंगे।

    +0

    संकेत के लिए धन्यवाद। हमने जिस सफाई प्रक्रिया को पेश किया है, उसे रात में कुछ घंटों तक दौड़ने के लिए निर्धारित किया जाएगा, लेकिन कुछ ग्राहकों को समाप्त होने से पहले कई रात लगेंगे। मैं मानता हूं कि क्लीनअप पूरी तरह से समाप्त होने तक प्रतीक्षा करना बेहतर है, और फिर निर्धारित समय के दौरान केवल एक बार वैक्यूम पूर्ण या क्लस्टर करें। केवल हमें 200 इंस्टॉलेशन पसंद हैं जिन्हें हमें इसके लिए शेड्यूल करने की आवश्यकता है, यही कारण है कि हम इसके लिए कुछ स्वचालन चाहते हैं। CLUSTER पर संकेत के लिए धन्यवाद। – greyfairer

    +0

    पोस्टग्रेस्क्ल 9.0 से और 'वैक्यूम पूर्ण' पर उपरोक्त अनुकूलन ने इसे करने का उचित तरीका बना दिया। (देखें: https://wiki.postgresql.org/wiki/VACUUM_FULL#CLUSTER) –

    3

    ठीक है, मैंने इसके माध्यम से अपना रास्ता काम किया।

    मैं सरलीकृत/में विभाजित करने के लिए दृश्य पर फिर से काम दो निम्नलिखित:

    CREATE OR REPLACE VIEW 
        bloat_datawidth AS 
    SELECT 
        ns.nspname AS schemaname, 
        tbl.oid AS relid, 
        tbl.relname, 
        CASE 
         WHEN every(avg_width IS NOT NULL) 
         THEN SUM((1-null_frac)*avg_width) + MAX(null_frac) * 24 
         ELSE NULL 
        END AS datawidth 
    FROM 
        pg_attribute att 
    JOIN 
        pg_class tbl 
    ON 
        att.attrelid = tbl.oid 
    JOIN 
        pg_namespace ns 
    ON 
        ns.oid = tbl.relnamespace 
    LEFT JOIN 
        pg_stats s 
    ON 
        s.schemaname=ns.nspname 
    AND s.tablename = tbl.relname 
    AND s.inherited=false 
    AND s.attname=att.attname 
    WHERE 
        att.attnum > 0 
    AND tbl.relkind='r' 
    GROUP BY 
        1,2,3; 
    

    और

    CREATE OR REPLACE VIEW 
        bloat_tables AS 
    SELECT 
        bdw.schemaname, 
        bdw.relname, 
        bdw.datawidth, 
        cc.reltuples::bigint, 
        cc.relpages::bigint, 
        ceil(cc.reltuples*bdw.datawidth/current_setting('block_size')::NUMERIC)::bigint AS expectedpages, 
        100 - (cc.reltuples*100*bdw.datawidth)/(current_setting('block_size')::NUMERIC*cc.relpages) AS bloatpct 
    FROM 
        bloat_datawidth bdw 
    JOIN 
        pg_class cc 
    ON 
        cc.oid = bdw.relid 
    AND cc.relpages > 1 
    AND bdw.datawidth IS NOT NULL; 
    

    और क्रॉन जॉब:

    #!/bin/bash 
    
    MIN_BLOAT=65 
    MIN_WASTED_PAGES=100 
    LOG_FILE=/var/log/postgresql/bloat.log 
    DATABASE=unity-stationmaster 
    SCHEMA=public 
    
    if [[ "$(id -un)" != "postgres" ]] 
    then 
    echo "You need to be user postgres to run this script." 
    exit 1 
    fi 
    
    TABLENAME=`psql $DATABASE -t -A -c "select relname from bloat_tables where bloatpct > $MIN_BLOAT and relpages-expectedpages > $MIN_WASTED_PAGES and schemaname ='$SCHEMA' order by wastedpages desc limit 1"` 
    
    if [[ -z "$TABLENAME" ]] 
    then 
    echo "No bloated tables." >> $LOG_FILE 
    exit 0 
    fi 
    
    vacuumdb -v -f -t $TABLENAME $DATABASE >> $LOG_FILE