Question

J'ai hérité d'une base de données Postgres existante pleine de données. La plupart des données ont une valeur de colonne «créée_date». Certaines des données antérieures ont été insérées avant que cela ne soit suivi.

Y a-t-il une table de métadonnées postgres cachée quelque part qui suit quand INSERT Des requêtes ont été faites?

Était-ce utile?

La solution

Postgres 9.5 ou version ultérieure

Vous pouvez activer track_commit_timestamp dans postgresql.conf (et redémarrer) pour commencer à suivre les horodatages des engagements. Alors vous pouvez obtenir un horodatage pour votre xmin. Réponse connexe:

Postgres 9,4 ou plus

Il n'y a pas de telles métadonnées dans PostgreSQL à moins que vous ne l'enregistrez vous-même.

Vous pourrez peut-être déduire quelques informations du En-têtes de lignes (HeaptupleheaderData), en particulier à partir de l'ID de transaction d'insertion xmin. Il détient l'ID de la transaction dans laquelle la ligne a été insérée (nécessaire pour décider de la visibilité dans les Postgresql MVCC maquette). Essayez (pour n'importe quelle table):

SELECT xmin, * FROM tbl LIMIT 10;

Certaines limites s'appliquent:

  • Si la base de données a été jetée et restaurée, alors, évidemment, les informations ont disparu - toutes les lignes sont insérées dans la même transaction.
  • Si la base de données est énorme / très ancien / très fortement écrite, alors elle a peut-être traversé Enveloppant d'identité de transaction, et l'ordre des nombres dans xmin c'est ambigu.

Mais pour la plupart des bases de données, vous devriez pouvoir dériver:

  • L'ordre chronologique des inserts
  • Quelles lignes ont été insérées ensemble
  • Quand il y avait (probablement) une longue période entre les inserts

Pas d'horodatage, cependant.

Autres conseils

track_commit_timestamp (booléen)

Principalement utilisé au moment de la configuration du serveur de réplication. Enregistrez le temps de transaction. Ce paramètre ne peut être défini que postgresql.conf fichier ou sur la ligne de commande du serveur. La valeur par défaut est à l'arrêt.

Réponse courte: non.

S'il y en avait, tout le monde se plaindrait que c'était un gaspillage d'espace sur toutes les tables qu'ils ne voulaient pas suivre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top