PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Автоматично премахване на таблици и индекси, по-стари от 90 дни

Странична бележка/ОТКАЗ ОТ ОТГОВОРНОСТ:
Това е лоша идея, тъй като времето за създаване на таблица не е 100% надеждно, тъй като таблицата може да е била вътрешно премахната и пресъздадена поради операции върху таблицата, като например CLUSTER.

Освен това можете да получите времето за създаване по този начин (приемайки име на примерна-таблица на t_benutzer ):

--select datname, datdba from pg_database;
--select relname, relfilenode from pg_class where relname ilike 't_benutzer';

    -- (select relfilenode::text from pg_class where relname ilike 't_benutzer')




SELECT 
    pg_ls_dir
    ,
    (
        SELECT creation
        FROM pg_stat_file('./base/'
            ||
            (
                    SELECT 
                        MAX(pg_ls_dir::bigint)::text 
                    FROM pg_ls_dir('./base') 
                    WHERE pg_ls_dir <> 'pgsql_tmp' 
                    AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
            )
            || '/' || pg_ls_dir
        )
    ) as createtime 
FROM pg_ls_dir(
    './base/' || 
    (
        SELECT 
            MAX(pg_ls_dir::bigint)::text 
        FROM pg_ls_dir('./base') 
        WHERE pg_ls_dir <> 'pgsql_tmp' 
        AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer') 
    ) 
) 

WHERE pg_ls_dir = (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')

Тайната е да използвате pg_stat_file в съответния файл с таблица.

-- http://www.greenplumdba.com/greenplum-dba-faq/howtofindtablecreationdateingreenplum


select 
    pg_ls_dir
    , 
    (
        select 
            --size 
            --access
            --modification 
            --change
            creation 
            --isdir
        from pg_stat_file(pg_ls_dir)
    ) as createtime 
from pg_ls_dir('.'); 

Според коментар в тази публикация PostgreSQL:Време за създаване на таблица това не е 100% надеждно, защото таблицата може да е била вътрешно премахната и пресъздадена поради операции върху таблицата, като например CLUSTER.

Също и моделът

/main/base/<database id>/<table filenode id> 

изглежда грешно, тъй като на моята машина всички таблици от различни бази данни имат един и същ идентификатор на база данни и изглежда, че папката е заменена с произволен номер на inode, така че трябва да намерите папката, чийто номер е най-близо до тази на вашата таблица inode id (макс. име на папка, където folderid <=table_inode_id и името на папката е числово)

Опростената версия изглежда така:

SELECT creation 
FROM pg_stat_file(
    './base/'
    ||
    (
        SELECT 
        MAX(pg_ls_dir::bigint)::text 
        FROM pg_ls_dir('./base') 
        WHERE pg_ls_dir <> 'pgsql_tmp' 
        AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
    )
    || '/' || (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
)

След това можете да използвате information_schema и cte, за да опростите заявката, или да създадете свой собствен изглед:

;WITH CTE AS
(
    SELECT 
        table_name 

        ,
        (
            SELECT 
                MAX(pg_ls_dir::bigint)::text 
            FROM pg_ls_dir('./base') 
            WHERE pg_ls_dir <> 'pgsql_tmp' 
            AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name)
        ) as folder 

        
        ,(SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name) filenode
        
    FROM information_schema.tables
    WHERE table_type = 'BASE TABLE'
    AND table_schema = 'public'
)

SELECT 
    table_name 
    ,(
        SELECT creation 
        FROM pg_stat_file(
            './base/' || folder || '/' || filenode 
        )
    ) as creation_time
FROM CTE 

(всички таблици, създадени с nhibernate schema create, така че повече или по-малко същото време за всички таблици на екранната снимка е правилно).

За риск и странични ефекти използвайте мозъка си и/или попитайте Вашия лекар или фармацевт;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на .pgpass от Apache libphp5.so

  2. Общ преглед на PostgreSQL кеширане на заявки и балансиране на натоварването

  3. Как да актуализирам таблица от свързваща таблица?

  4. PGError:ГРЕШКА:агрегатите не са разрешени в клаузата WHERE на AR заявка на обект и неговите has_many обекти

  5. Агрегиране по средна стойност в SQL