PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Elimina automaticamente tabelle e indici più vecchi di 90 giorni

Note a margine/DISCLAIMER:
Questa è una cattiva idea, poiché il momento di creazione della tabella non è affidabile al 100%, perché la tabella potrebbe essere stata eliminata internamente e ricreata a causa di operazioni sulla tabella, come CLUSTER.

A parte questo, puoi ottenere il tempo di creazione in questo modo (assumendo nome-tabella di esempio di 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')

Il segreto è usare pg_stat_file sul rispettivo file di tabella.

-- 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('.'); 

Come da commento in questo post PostgreSQL:tempo di creazione della tabella questo non è affidabile al 100%, perché la tabella potrebbe essere stata eliminata internamente e ricreata a causa di operazioni sulla tabella, come CLUSTER.

Anche il modello

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

sembra essere sbagliato, poiché sulla mia macchina, tutte le tabelle di database diversi hanno lo stesso ID database e sembra che la cartella sia stata sostituita con un numero di inode arbitrario, quindi è necessario trovare la cartella il cui numero è più vicino a quello della tabella inode id (nome cartella massimo dove id cartella <=table_inode_id e nome cartella è numerico)

La versione semplificata funziona così:

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')
)

Quindi puoi utilizzare information_schema e cte per semplificare la query o creare la tua vista:

;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 

(tutte le tabelle create con lo schema nhibernate vengono create, quindi più o meno la stessa ora su tutte le tabelle nello screenshot è corretta).

Per rischi ed effetti collaterali, usa il cervello e/o chiedi al tuo medico o farmacista;)