Denken Sie zuerst an meinen Kommentar.
Postgres bis einschließlich 9.4 zeichnet selbst keine Zeitstempel auf, wenn Zeilen eingefügt oder aktualisiert wurden.
Es gibt einige Systemspalten in den Zeilenüberschriften das kann bei der forensischen Arbeit helfen. Die physische Reihenfolge der Zeilen (ctid
) kann ein Indikator sein, wenn seitdem nichts mehr mit dem Tisch passiert ist. In einfachen Fällen werden neue Zeilen beim Einfügen an das physikalische Ende einer Tabelle angehängt, also die ctid
zeigt an, was zuletzt eingefügt wurde - bis sich an der Tabelle etwas ändert. Postgres kann die physische Reihenfolge der Zeilen nach Belieben neu anordnen, zum Beispiel mit VACUUM
. Beliebiges UPDATE
schreibt auch eine neue Zeilenversion, die die physische Position ändern kann. Die neue Version muss nicht am Ende der Tabelle stehen. Postgres versucht, neue Zeilenversionen möglichst auf derselben Datenseite zu halten (HOT-Update
) ...
Das heißt, hier ist eine einfache Abfrage, um die physisch zu erhalten letzten Zeilen für eine gegebene Tabelle:
SELECT ctid, *
FROM big
ORDER BY ctid DESC
LIMIT 10;
Verwandte Antworten auf dba.SE mit detaillierten Informationen:
- VACUUM gibt Festplattenspeicher an das Betriebssystem zurück
- Wie zerlege ich ctid in Seiten- und Zeilennummern?
Die eingefügte Transaktions-ID xmin
kann nützlich sein:
Falls Sie zufällig ein Backup haben für die Test-DB direkt vor dem Vorfall, das würde sei hilfreich. Stellen Sie den alten Zustand in einem separaten Schema der Test-DB wieder her und vergleichen Sie die Tabellen ...
Normalerweise füge ich ein oder zwei timestamptz
hinzu Spalten zu wichtigen Tabellen, wann die Zeile eingefügt wurde und / oder wann sie das letzte Mal aktualisiert wurde. Das würde gerade jetzt enorm nützlich für Sie sein ...
Was würde Auch toll für Sie:die im SQL-Standard mit SQL eingeführten "temporalen" Features:2011
. Aber das ist noch nicht in Postgres implementiert.
Es gibt eine Seite im Postgres-Wiki .
Es gibt auch eine inoffizielle Erweiterung für PGXN
. Ich habe es nicht getestet und kann nicht sagen, wie weit es ist.
Postgres 9.5 führt eine Funktion zum Aufzeichnen von Commit-Zeitstempeln ein (wie @Craig kommentierte ). Muss manuell aktiviert werden, bevor die Aufzeichnung beginnt.Das Handbuch:
Und einige Funktionen, um damit zu arbeiten.