PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Automatisches Löschen von Tabellen und Indizes, die älter als 90 Tage sind

Nebenbemerkung/HAFTUNGSAUSSCHLUSS:
Das ist eine schlechte Idee, da die Erstellungszeit der Tabelle nicht 100 % zuverlässig ist, da die Tabelle möglicherweise intern gelöscht und aufgrund von Operationen auf der Tabelle, wie z. B. CLUSTER, neu erstellt wurde.

Ansonsten bekommt man die Erstellungszeit so (angenommen Beispiel-Tabellenname von 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')

Das Geheimnis besteht darin, pg_stat_file auf die entsprechende Tabellendatei zu verwenden.

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

Laut Kommentar in diesem Beitrag PostgreSQL:Tabellenerstellungszeit dies ist nicht 100 % zuverlässig, da die Tabelle möglicherweise intern gelöscht und aufgrund von Operationen an der Tabelle, wie z. B. CLUSTER, neu erstellt wurde.

Auch das Muster

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

scheint falsch zu sein, da auf meinem Rechner alle Tabellen aus verschiedenen Datenbanken dieselbe Datenbank-ID haben und es scheint, als ob der Ordner durch eine beliebige Inode-Nummer ersetzt wurde, also müssen Sie den Ordner finden, dessen Nummer Ihrer Tabelle am nächsten kommt Inode-ID (maximaler Ordnername, wobei Ordner-ID <=Tabellen-Inode_ID und Ordnername numerisch ist)

Vereinfachte Version geht so:

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

Dann können Sie information_schema und cte verwenden, um die Abfrage zu vereinfachen, oder Ihre eigene Ansicht erstellen:

;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 

(alle Tabellen erstellt mit nhibernate schema create, also ist die mehr oder weniger gleiche Zeit auf allen Tabellen auf dem Screenshot korrekt).

Zu Risiken und Nebenwirkungen lass dich beraten und/oder frage deinen Arzt oder Apotheker;)