PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Automatycznie usuwaj tabele i indeksy starsze niż 90 dni

Przypis/ZRZECZENIE SIĘ:
To zły pomysł, ponieważ czas tworzenia tabeli nie jest w 100% niezawodny, ponieważ tabela mogła zostać wewnętrznie usunięta i ponownie utworzona z powodu operacji na tabeli, takich jak CLUSTER.

Poza tym możesz uzyskać czas utworzenia w ten sposób (zakładając przykładową nazwę tabeli 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')

Sekret polega na użyciu pg_stat_file w odpowiednim pliku tabeli.

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

Zgodnie z komentarzem w tym poście PostgreSQL:czas utworzenia tabeli nie jest to w 100% niezawodne, ponieważ tabela mogła zostać wewnętrznie usunięta i ponownie utworzona z powodu operacji na tabeli, takich jak CLUSTER.

Również wzór

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

wydaje się być błędny, ponieważ na moim komputerze wszystkie tabele z różnych baz danych mają ten sam identyfikator bazy danych i wygląda na to, że folder został zastąpiony dowolnym numerem węzła, więc musisz znaleźć folder, którego numer jest najbliższy numerowi twojej tabeli identyfikator i-węzła (maksymalna nazwa folderu, gdzie identyfikator folderu <=identyfikator_in-węzła_tabeli i nazwa folderu to liczba)

Wersja uproszczona wygląda tak:

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

Następnie możesz użyć information_schema i cte, aby uprościć zapytanie, lub utworzyć własny widok:

;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 

(wszystkie tabele utworzone za pomocą schematu nhibernate tworzą, więc mniej więcej ten sam czas na wszystkich tabelach na zrzucie ekranu jest poprawny).

W przypadku ryzyka i skutków ubocznych użyj mózgu i / lub zapytaj lekarza lub farmaceutę;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Railsy + błędy PostGIS przy migracji bazy danych

  2. Korzystanie z klauzuli EXCEPT w PostgreSQL

  3. Auto-inkrementacja PostgreSQL wzrasta przy każdej aktualizacji

  4. Konwersja liczby całkowitej na Enum w PostgreSQL

  5. jak emulować ignorowanie wstawiania i aktualizację zduplikowanych kluczy (sql merge) za pomocą postgresql?