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

Slip automatisk tabeller og indekser ældre end 90 dage

Sidenote/DISCLAIMER:
Dette er en dårlig idé, da tabeloprettelsestidspunktet ikke er 100 % pålideligt, fordi bordet kan være blevet internt droppet og genskabt på grund af operationer på bordet, såsom CLUSTER.

Bortset fra det, kan du få oprettelsestiden som denne (forudsat eksempel-tabel-navn på 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')

Hemmeligheden er at bruge pg_stat_file på den respektive tabelfil.

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

Som i kommentaren i dette indlæg PostgreSQL:Tid til oprettelse af tabel dette er ikke 100 % pålideligt, fordi tabellen kan være blevet slettet internt og genskabt på grund af operationer på bordet, såsom CLUSTER.

Også mønsteret

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

ser ud til at være forkert, da alle tabeller fra forskellige databaser på min maskine har samme database-id, og det ser ud til at mappen er blevet erstattet med et eller andet vilkårligt inodenummer, så du skal finde den mappe, hvis nummer er tættest på din tabels inode-id (maks. mappenavn, hvor mappe-id <=tabel_inode_id og mappenavn er numerisk)

Forenklet version ser sådan ud:

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

Så kan du bruge information_schema og cte til at gøre forespørgslen enkel, eller oprette din egen visning:

;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 tabeller oprettet med nhibernate skema oprettes, så den mere eller mindre samme tid på alle tabeller på skærmbilledet er korrekt).

For risiko og bivirkninger, brug din hjerne og/eller spørg din læge eller apotek;)



  1. postgresql indeks på streng kolonne

  2. Django distinct virker ikke

  3. node.js synkron mysql-forespørgsel

  4. C# opretter forbindelse til en postgres-database