PostgreSQL: Letzte Zugriffszeit auf Tabelle

10

Ich bin verantwortlich für eine große PostgreSQL-Datenbank mit einigen Dutzend Tabellen. Ich vermute, dass auf viele dieser Tabellen nie zugegriffen wird.

Wie kann am besten überprüft werden, wann das letzte Mal auf eine bestimmte Tabelle zugegriffen wurde? Ich dachte daran, einen Auslöser hinzuzufügen DELETE, INSERTund UPDATE, aber ich hoffe, es gibt einen effizienteren Weg.

Adam Matan
quelle
Sie können keinen Trigger für erstellenselect . Haben Sie überlegt, sich anzumelden ?
Jack sagt, versuchen Sie topanswers.xyz
Danke, korrigiert. Die Protokollierung ist möglicherweise die Lösung, aber die Datenbank wird häufig verwendet, und Protokolle benötigen wahrscheinlich viel Speicherplatz.
Adam Matan

Antworten:

9

pg_catalog.pg_statio_all_tables ist dein Freund. Sie müssen lediglich regelmäßig pg_statio_all_tables nach den betreffenden Tabellen abfragen. Ändern von Statistiken ~ aktive Tabelle, nicht ändernde Statistiken ~ möglicherweise nicht verwendete Tabelle. Seien Sie nur vorsichtig, dass niemand select pg_stat_reset () ;mitten in Ihrer Überwachung eine macht.

Beispielsweise:

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)

Beilagen:

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)

Wählt aus:

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)

Löscht:

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)

update-- 2011-09-01

Weitere Tests zeigen, dass vacuumdie Werte in pg_statio_all_tables etwas zu steigen scheinen, was für Ihre gewünschte Verwendung unglücklich ist. Die vacuumVerwendung von pg_statio_all_tables ist zwar nicht nutzlos, macht die Interpretation der Ergebnisse jedoch etwas unübersichtlicher.

Möglicherweise ist pg_catalog.pg_stat_all_tables ein besserer Ort zum Überwachen (zumindest bei neueren Versionen von Pg). Ich schaue auf Version 8.4 und das zählt für eingefügte, gelesene, aktualisierte und gelöschte Tupel - ISTR 8.2 hat nicht alles und ich weiß nichts über 8.3, also YMMV, abhängig von der Version von Pg, die Sie sind mit.

Eine dritte Option (zum Einfügen, Aktualisieren und Löschen von Aktivitäten) besteht darin, die Zeitstempel der Datei im Verzeichnis $ PGDATA / base / $ datid zu überwachen. Der Dateiname sollte der OID der Tabelle zugeordnet sein, damit Sie damit Tabellen identifizieren können, die keine Einfügungen, Aktualisierungen oder Löschungen erhalten. Leider werden hiermit keine Tabellen angesprochen, aus denen noch ausgewählt wird, und die Verwendung von Tablespaces führt zu zusätzlichen Komplikationen (da diese Dateien nicht unter $ PGDATA / base / $ datid liegen). Die Zeitstempel werden erst aktualisiert, wenn ausstehende Änderungen gelöscht wurden. Wenn sich die Datei jedoch seit Monaten nicht geändert hat, ist die Wahrscheinlichkeit einer derzeit ausstehenden Änderung wahrscheinlich gering.

gsiems
quelle
3

Sie können einige Informationen über die letzte Änderung an einer Tabelle erhalten xmin, z.

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

Sie müssen sich jedoch des Modulo und der umlaufenden und gefrorenen Xids bewusst sein . Es gibt keine Möglichkeit, dies in eine "Zeit" umzuwandeln. Wenn Sie jedoch den Wert für Ihre Tabellen jetzt erfassen und zu einem späteren Zeitpunkt vergleichen, erhalten Sie eine Liste der geänderten Tabellen

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle