Ich möchte ändern, wie Sicherungen durchgeführt werden, und frage mich, ob es eine Möglichkeit gibt, festzustellen, welche Datenbanken in einem Postgreql-Cluster kürzlich nicht geändert wurden.
Anstatt pg_dumpall zu verwenden, möchte ich pg_dump verwenden und nur die Datenbanken sichern, die sich seit der letzten Sicherung geändert haben (einige Datenbanken werden nicht sehr oft aktualisiert). Die Idee ist, dass sich die aktuelle Sicherung ändern sollte, wenn sich nichts geändert hat sei immer noch gut
Kennt jemand eine Möglichkeit, um festzustellen, wann eine bestimmte Datenbank zuletzt aktualisiert / geändert wurde?
Vielen Dank...
Aktualisieren:
Ich hatte gehofft, nicht überall Trigger schreiben zu müssen, da ich keine Kontrolle über die Erstellung von Datenbanken in einem bestimmten Cluster habe (geschweige denn die Erstellung von Datenbankobjekten innerhalb einer Datenbank).
Wenn Sie weiter graben, scheint es eine Korrelation zwischen dem Inhalt der Datei $ PGDATA / global / pg_database (insbesondere dem zweiten Feld) und den Verzeichnisnamen unter $ PGDATA / base zu geben.
Ich gehe davon aus, dass das zweite Feld der Datei pg_database die Datenbank-OID ist und dass jede Datenbank ein eigenes Unterverzeichnis unter $ PGDATA / base hat (mit der OID für den Namen des Unterverzeichnisses). Ist das korrekt? Wenn ja, ist es sinnvoll, die Dateizeitstempel aus den Dateien unter $ PGDATA / base / * als Auslöser für die Notwendigkeit einer Sicherung zu verwenden?
... oder gibt es einen besseren Weg?
Danke noch einmal...
quelle
Antworten:
Während die Verwendung,
select datname, xact_commit from pg_stat_database;
wie von @Jack Douglas vorgeschlagen, nicht ganz funktioniert (anscheinend aufgrund von Autovakuum),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
scheint sie zu funktionieren. Sowohl DML- als auch DDL-Änderungen ändern die Werte von tup_ * -Spalten, während avacuum
dies nicht tut (vacuum analyze
andererseits ...).Für den Fall, dass dies für andere nützlich sein könnte, füge ich das von mir eingerichtete Sicherungsskript hinzu. Dies funktioniert für Pg 8.4.x, jedoch nicht für 8.2.x-- YMMV, abhängig von der verwendeten Pg-Version.
Update: Das Skript wurde setzen auf GitHub hier .
quelle
Es sieht so aus, als könnten
pg_stat_database
Sie eine Transaktionsanzahl abrufen und prüfen, ob sich dies von einem Sicherungslauf zum nächsten ändert:Wenn jemand angerufen
pg_stat_reset
hat, können Sie nicht sicher sein, ob sich eine Datenbank geändert hat oder nicht, aber Sie halten es möglicherweise für unwahrscheinlich genug, dass dies passieren würde, gefolgt von genau der richtigen Anzahl von Transaktionen, die Ihrer letzten Lesung entsprechen.--BEARBEITEN
In dieser SO-Frage erfahren Sie, warum dies möglicherweise nicht funktioniert. Ich bin mir nicht sicher, warum dies passieren könnte, aber das Aktivieren der Protokollierung könnte etwas Licht ins Dunkel bringen.
quelle
pg_stat_reset
ist die Wahrscheinlichkeit, dass der xact_commit-Wert mit dem vorherigen übereinstimmt, ziemlich gering, nein? Das scheint also die Existenz von DML-Änderungen zu erfassen. Jetzt muss ich nur noch abfangen, ob DDL-Änderungen vorgenommen wurden.create table ...
Test scheint xact_commit zu erhöhen.Vom Stöbern in den Postgres-Dokumenten und Newsgroups:
txid_current()
erhalten Sie eine neuexid
- wenn Sie die Funktion zu einem späteren Zeitpunkt erneut aufrufen, wenn Siexid
eine höhere erhalten, wissen Sie, dass keine Transaktionen zwischen den beiden Aufrufen festgeschrieben wurden. Es kann jedoch zu Fehlalarmen kommen - z. B. wenn jemand anderes anrufttxid_current()
quelle
Erinnern Sie sich an den Zeitstempel Ihrer Dateien, die die DB-Daten enthalten, und prüfen Sie, ob sie sich geändert haben. Wenn ja, gab es ein Schreiben.
Nach WAL-Hinweis bearbeiten: Dies sollte erst nach dem Leeren der ausstehenden Schreibvorgänge erfolgen.
quelle
Mit Postgresql 9.5 können wir den zuletzt geänderten Zeitstempel verfolgen. Schauen Sie sich diesen Link an: https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html
quelle