PostgreSQL: Czas ostatniego dostępu do tabeli

10

Jestem odpowiedzialny za dużą bazę danych PostgreSQL z kilkadziesiąt tabelami. Podejrzewam, że do wielu z tych tabel nigdy nie ma dostępu.

Jaki jest najlepszy sposób sprawdzenia, kiedy ostatnio uzyskiwano dostęp do określonego stołu? Myślałem o dodanie spust DELETE, INSERTa UPDATE, ale mam nadzieję, że jest bardziej efektywny sposób.

Adam Matan
źródło
Nie możesz utworzyć wyzwalaczaselect . Czy rozważałeś logowanie ?
Jack mówi, że spróbuj topanswers.xyz
Dzięki, poprawione. Rozwiązaniem może być rejestrowanie, ale baza danych jest intensywnie używana i dzienniki prawdopodobnie zajmą dużo miejsca na dysku.
Adam Matan

Odpowiedzi:

9

pg_catalog.pg_statio_all_tables jest twoim przyjacielem. Wszystko, co musisz zrobić, to okresowo sprawdzać tabele pg_statio_all_tables. Zmiana statystyk ~ aktywna tabela, niezmienne statystyki ~ potencjalnie nieużywana tabela. Uważaj tylko, aby nikt nie select pg_stat_reset () ;monitorował.

Na przykład:

test_1=# create table test_stats (col1 integer);
CREATE TABLE

test_1=# select * from pg_catalog.pg_statio_all_tables 
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |              0 |             0 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Wstawki:

test_1=# insert into test_stats (col1) select generate_series( 1, 10000000);
INSERT 0 10000000

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |          44260 |      10088481 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Wybiera:

test_1=# select count (*) from test_stats where col1 between 10000 and 50000;
 count 
-------
 40001
(1 row)

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |          85560 |      10091429 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Usuwa:

test_1=# delete from test_stats where col1 between 10000 and 50000;
DELETE 40001

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |         155075 |      10136163 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

aktualizacja-- 2011-09-01

Dalsze testy wskazują, że vacuumwydaje się, że nieco zwiększa wartości w tabelach pg_statio_all_tables, co jest niefortunne dla zamierzonego zastosowania. Chociaż vacuumnie używa pg_statio_all_tables bezużyteczne, sprawia, że ​​interpretacja wyników jest nieco bardziej niewyraźna.

Być może lepszym miejscem do monitorowania jest pg_catalog.pg_stat_all_tables (przynajmniej z nowszymi wersjami Pg). Patrzę na wersję 8.4, która ma liczbę wstawionych, odczytanych, zaktualizowanych i usuniętych krotek - ISTR 8.2 nie ma tego wszystkiego i nie wiem o 8.3, więc YMMV zależy od wersji Pg, którą jesteś za pomocą.

Trzecią opcją (dla czynności wstawiania, aktualizacji i usuwania) jest oglądanie znaczników czasowych plików w katalogu $ PGDATA / base / $ datid. Nazwa pliku powinna być odwzorowana na OID tabeli, abyś mógł użyć jej do identyfikacji tabel, które nie otrzymują wstawek, aktualizacji lub usunięć. Niestety nie dotyczy to tabel, które wciąż są wybierane, a korzystanie z obszarów tabel spowoduje dodatkowe komplikacje (ponieważ pliki te nie będą w katalogu $ PGDATA / base / $ datid). Znaczniki czasu nie zostaną zaktualizowane, dopóki wszelkie oczekujące zmiany nie zostaną usunięte, ale jeśli plik nie zmienił się od miesięcy, szanse na oczekującą zmianę są prawdopodobnie niewielkie.

gsiems
źródło
3

Możesz uzyskać informacje o ostatniej zmianie w tabeli xmin, np .:

select max(xmin::text::bigint) from t;

Ale musisz być świadomy modulo, wraparound i zamrożonych xidów . Nie ma żadnego sposobu na przekonwertowanie tego na „czas”, ale jeśli teraz uchwycisz wartość swoich tabel, a następnie porównasz później, możesz uzyskać listę tabel, które uległy zmianie

Jack mówi, że spróbuj topanswers.xyz
źródło