sql >> Base de Datos >  >> RDS >> PostgreSQL

Eliminar automáticamente tablas e índices con más de 90 días

Nota al margen/EXENCIÓN DE RESPONSABILIDAD:
Esta es una mala idea, dado que el momento de la creación de la tabla no es 100 % confiable, ya que la tabla puede haberse descartado y recreado internamente debido a operaciones en la tabla, como CLUSTER.

Aparte de eso, puede obtener el tiempo de creación de esta manera (suponiendo que el nombre de la tabla de ejemplo 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')

El secreto es usar pg_stat_file en el archivo de tabla respectivo.

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

Según el comentario en esta publicación PostgreSQL:tiempo de creación de la tabla esto no es 100% confiable, porque la tabla puede haber sido eliminada y recreada internamente debido a operaciones en la tabla, como CLUSTER.

También el patrón

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

parece estar mal, ya que en mi máquina, todas las tablas de diferentes bases de datos tienen la misma identificación de base de datos, y parece que la carpeta ha sido reemplazada con un número de inodo arbitrario, por lo que necesita encontrar la carpeta cuyo número es más cercano al de su tabla ID de inodo (nombre de carpeta máximo donde ID de carpeta <=table_inode_id y nombre de carpeta es numérico)

La versión simplificada dice así:

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

Luego puede usar information_schema y cte para simplificar la consulta o crear su propia 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 

(todas las tablas creadas con nhibernate schema create, por lo que el tiempo más o menos igual en todas las tablas en la captura de pantalla es correcto).

Para riesgos y efectos secundarios, use su cerebro y/o pregunte a su médico o farmacéutico;)