PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Eliminar automaticamente tabelas e índices com mais de 90 dias


Sidenote/DISCLAIMER:
Esta é uma má idéia, já que o tempo de criação da tabela não é 100% confiável, porque a tabela pode ter sido descartada e recriada internamente devido a operações na tabela, como CLUSTER.


Além disso, você pode obter o tempo de criação assim (assumindo o nome da tabela de exemplo de 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')

O segredo é usar pg_stat_file no respectivo arquivo de tabela.
-- 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('.'); 

Conforme comentário neste post PostgreSQL:tempo de criação da tabela isso não é 100% confiável, porque a tabela pode ter sido descartada e recriada internamente devido a operações na tabela, como CLUSTER.

Também o padrão
/main/base/<database id>/<table filenode id> 

parece estar errado, pois na minha máquina, todas as tabelas de bancos de dados diferentes têm o mesmo id de banco de dados e parece que a pasta foi substituída por algum número de inode arbitrário, então você precisa encontrar a pasta cujo número está mais próximo da sua tabela ID do inode (max foldername onde folderid <=table_inode_id e foldername é numérico)

A versão simplificada fica assim:
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')
)

Em seguida, você pode usar information_schema e cte para simplificar a consulta ou criar sua própria visualização:
;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 



(todas as tabelas criadas com o esquema nhibernate criam, portanto, o tempo mais ou menos igual em todas as tabelas na captura de tela está correto).

Para riscos e efeitos colaterais, use seu cérebro e/ou pergunte ao seu médico ou farmacêutico;)