Postgres till och med 9.4 registrerar inte i sig tidsstämplar när rader infogades eller uppdaterades.
Det finns några systemkolumner i radrubrikerna som kan hjälpa till i det kriminaltekniska arbetet. Den fysiska ordningen på rader (ctid
) kan vara en indikator om inget annat har hänt med tabellen sedan dess. I enkla fall läggs nya rader till i den fysiska änden av en tabell när de infogas, så ctid
indikerar vad som infogades sist - tills något ändras i tabellen. Postgres är fri att omarrangera den fysiska ordningen på rader efter behag, till exempel med VACUUM
. Valfri UPDATE
skriver också en ny radversion, som kan ändra den fysiska positionen. Den nya versionen behöver inte vara i slutet av tabellen. Postgres försöker behålla ny radversion på samma datasida om möjligt (HET uppdatering
) ...
Som sagt, här är en enkel fråga för att få den fysiskt sista raderna för en given tabell:
SELECT ctid, *
FROM big
ORDER BY ctid DESC
LIMIT 10;
Relaterade svar på dba.SE med detaljerad information:
Infoga transaktions-id xmin
kan vara användbart:
Om du råkar ha en säkerhetskopia för test-DB från precis före händelsen, det skulle var hjälpsam. Återställ det gamla tillståndet till ett separat schema för test-DB och jämför tabeller ...
Vanligtvis lägger jag till en eller två timestamptz
kolumner till viktiga tabeller för när raden infogades och/eller när den uppdaterades senast. Det skulle vara oerhört användbar för dig just nu ...
Vad skulle är också bra för dig:de "temporal"-funktionerna som introduceras i SQL-standarden med SQL:2011
. Men det är inte implementerat i Postgres än.
Det finns en sida i Postgres Wiki .
Det finns också en inofficiell tillägg på PGXN
. Jag har inte testat det och kan inte säga hur långt det är.
Postgres 9.5 introducerar en funktion för att spela in tidsstämplar för bekräftelse (som @Craig kommenterade ). Behöver aktiveras manuellt innan den börjar spela in.Manualen:
Och några funktioner för att fungera med det.