DB Backup und Restore über Npgsql

Hallo liebe Entwicklergemeinde,


einige Recherchen haben leider nicht zum gewünschten Resultat geführt.

Ich möchte in C# ein kleines Progrämmchen schreiben, dass ein inkrementelles
Backup / Restore für Postgresql ermöglichen soll.

Background:

Ich arbeite in einer Firma, die Postgresql als Datenbank für ein Produkt
einsetzt, welches mit größeren Mengen von Binärdaten arbeiten muss.
Backups werden zur Zeit über pg_dump gemacht, aber sollen so bald als möglich
durch eine eigene Solution ersetzt werden.
Das Programm soll zum einen als Hilfsmittel für unsere Servicetechniker dienen,
andererseits soll das Programm wohl auch in der Lage sein, automatisch Backups
zu erstellen und im Bedarfsfall dann so von unseren Technikern ein Restore
machen zu können.
Mehrere Versuche haben herausgestellt, dass im Schnitt für das Anlegen von einem
Datensatz 40 - 55 MB in der Datenbank hinzukommen. Pro Tag werden im Schnitt
zwischen 30 - 50 Datensätze angelegt.
Pg_dump ist, so weit ich weiß leider nicht fähig, inkrementell zu arbeiten.
Dann habe ich mir das Postgres-Manual angesehen und gelesen, dass man
ein inkrementelles Backup mit Postgres selber machen. In der .conf die entsprechenden
Einstellungen vorgenommen und versucht ein Base-Backup und dann die WAL-Dateien zu
archivieren.
Im laufenden Betrieb wird die Datenbank schnell recht groß werden, so dass in
vordefinierten Abständen auch mal nicht mehr benötigte Datensätze gelöscht werden.
Das Backup über die gespeicherten WAL-Dateien wächst aber, so wie ich das verstanden
habe ständig an.
Man könnte zwar in bestimmten Abständen ein neues Base-Backup machen und dann die
nicht mehr benötigten WALs löschen, aber das wollen wir unseren Kunden ungerne
überlassen.
So möchte ich mir etwas eigenes überlegen das ähnlich pg_dump arbeitet, aber quasi
immer nur die Änderungen mit einem Backup abgleicht.
Eine exakte Reproduktion der gesammten Schritte ist nicht nötig, nur die Datenbestände
zwischen DB und Backup sollen z.B. täglich abgeglichen werden.

Ich wollte nun zum einen das Schema sichern und dann den kompletten Datenbestand.
So dass, wenn sich nur die Daten ändern auch im Bachup entweder hinzugefügt oder gelöscht
wird, und wenn sich aber das Schema einer Tabelle ändert, zum einen das Schema neu gesichert
wird und dann die komplette Tabelle nochmal.

Als Datenbank-Adapter nutzen wir in der Firma »Npgsql«. Ich hoffe, einer von euch kennt
sich damit ein wenig aus.
Das Auslesen / Zurückschreiben der Daten geht eigentlich und die Logik hinter dem vergleichen
DB und Backup sollte auch nicht so das Problem sein. So bleiben mir zum jetzigen
Zeitpunkt zwei Fragen:

Gibt es über diesen Adapter einen Weg das Schema einer Datenbank auszulesen?
Wenn ich das Schema gespeichert habe, kann ich dann alle Tabellen löschen und neu anlegen,
so dass sie das gleiche Schema haben wie zuvor?

Vielen Dank für eure Hilfe und viele Grüße

Ich ahne schlimmes …

Background:

Pg_dump ist, so weit ich weiß leider nicht fähig, inkrementell zu arbeiten.

Korrekt.

Dann habe ich mir das Postgres-Manual angesehen und gelesen, dass man
ein inkrementelles Backup mit Postgres selber machen. In der .conf die entsprechenden
Einstellungen vorgenommen und versucht ein Base-Backup und dann die WAL-Dateien zu
archivieren.

Das ist der Weg, ja.

Im laufenden Betrieb wird die Datenbank schnell recht groß werden, so dass in
vordefinierten Abständen auch mal nicht mehr benötigte Datensätze gelöscht werden.
Das Backup über die gespeicherten WAL-Dateien wächst aber, so wie ich das verstanden
habe ständig an.

Korrekt. das WAL enthält alle Änderungen, Du benötigst für ein restore ausgehend vom base-Backup ALLE WAL-Dateien.

Man könnte zwar in bestimmten Abständen ein neues Base-Backup machen und dann die
nicht mehr benötigten WALs löschen, aber das wollen wir unseren Kunden ungerne
überlassen.

Das ist der einzig mir bekannte sichere Weg.

So möchte ich mir etwas eigenes überlegen das ähnlich pg_dump arbeitet, aber quasi
immer nur die Änderungen mit einem Backup abgleicht.
Eine exakte Reproduktion der gesammten Schritte ist nicht nötig, nur die Datenbestände
zwischen DB und Backup sollen z.B. täglich abgeglichen werden.

Wenn es um Änderungen an einer /einigen Tabellen geht, kannst Du ads sein Tablellog für sowas mißbrauchen, denke ich mal.
Mit TRIGGERN werden alle Änderungen protokolliert, damit könntest Du quasi ein tägliches Protokoll der Änderungen haben.

Dazu einfach mit COPY in einem Cron früh in der Nacht die Einträge des Vortages rausschreiben, z.B…

Ich wollte nun zum einen das Schema sichern und dann den kompletten Datenbestand.
So dass, wenn sich nur die Daten ändern auch im Bachup entweder hinzugefügt oder gelöscht
wird, und wenn sich aber das Schema einer Tabelle ändert, zum einen das Schema neu gesichert
wird und dann die komplette Tabelle nochmal.

Ändert sich denn das Schema der DB?

Als Datenbank-Adapter nutzen wir in der Firma »Npgsql«. Ich hoffe, einer von euch kennt
sich damit ein wenig aus.

Bestimmt. Ich nicht.


Andreas

Hallo,

vielen Dank für die schnelle Antwort.

Ändert sich denn das Schema der DB?

Ja, das kann bei neuen Programmversionen leider vorkommen.

Ich hoffe noch weiter, dass sich jemand mit »Npgsql« auskennt… :confused:

Grüße, Riewert