PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come elencare tutte le tabelle con modifiche ai dati nelle ultime 24 ore?

Prima considera il mio commento.

Postgres fino alla versione 9.4 inclusa non registra di per sé i timestamp quando le righe sono state inserite o aggiornate.

Sono presenti alcune colonne di sistema nelle intestazioni di riga che può aiutare nel lavoro forense. L'ordine fisico delle righe (ctid ) può essere un indicatore se da allora non è successo nient'altro al tavolo. In casi semplici le nuove righe vengono aggiunte all'estremità fisica di una tabella quando vengono inserite, quindi il ctid indica cosa è stato inserito per ultimo, finché non cambia qualcosa nella tabella. Postgres è libero di riorganizzare l'ordine fisico delle righe a piacimento, ad esempio con VACUUM . Qualsiasi UPDATE scrive anche una nuova versione di riga, che può modificare la posizione fisica. La nuova versione non deve essere alla fine della tabella. Postgres cerca di mantenere la nuova versione della riga sulla stessa pagina di dati, se possibile (Aggiornamento CALDO ) ...

Detto questo, ecco una semplice query per ottenere il fisicamente ultime righe per una determinata tabella:

SELECT ctid, *
FROM   big
ORDER  BY ctid DESC
LIMIT  10;

Risposte correlate su dba.SE con informazioni dettagliate:

L'ID transazione di inserimento xmin può essere utile:

Se hai un backup per il DB di prova subito prima dell'incidente, che sarebbe Sii utile. Ripristina il vecchio stato in uno schema separato del DB di test e confronta le tabelle...

In genere, aggiungo uno o due timestamptz colonne in tabelle importanti per quando la riga è stata inserita e/o quando è stata aggiornata l'ultima volta. Questo sarebbe essere estremamente utile per te in questo momento ...

Cosa farebbe essere ottimo anche per te:le funzionalità "temporali" introdotte nello standard SQL con SQL:2011 . Ma non è ancora implementato in Postgres.
C'è una pagina nel Wiki di Postgres .
C'è anche un'estensione non ufficiale su PGXN . Non l'ho testato e non posso dire quanto sia lontano.

Postgres 9,5 introduce una funzione per registrare timestamp del commit (come @Craig ha commentato ). Deve essere abilitato manualmente prima che inizi la registrazione.Il manuale:

E alcune funzioni con cui lavorare.