Vorgehensweise Sicherung aller Datenbanken

Hallo zusammen,

ich suche eine Vorgehensweise, um alle Datenbanken auf dem Server automatisch zu sichern. Da ich von der MSSQL-Welt komme, kenne ich dort den Wartungsplan, der das recht komfortabel erledigt. Sowas ähnliches schwebt mir hier auch vor.

Derzeit sichere ich die Datenbanken mit einer manuellen Batchdatei, die für jede Datenbank “pg_dump” aufruft. Das klappt zwar gut, allerdings muss ich die Datei auch immer nachpflegen. Ich kenne auch “pg_dumpall”, aber es sieht so aus, als würde ich dann eine einzige Backupdatei für den ganzen Server bekommen. Ich würde schon im Ernstfall einzelnen DBs rücksichern wollen.

Habt ihr da einen Tipp für mich?

Gruß, Karsten.

Für Dein Ziel ist pg_dump schon die richtige Entscheidung. Ich empfehle das custom-Format. Wenn Du etwas googelst findest Du dazu auch diverse Script-Lösungen, die das mit retention-Policy etc. lösen.

Eine andere Lösung wäre Barman, aber das ist ein anderes Konzept und erfordert etwas mehr Einarbeitung, bietet dafür aber Point-In-Time-Recovery.

Ah, vielen Dank für die Antwort. Ich werde mal die Skriptlösungen eruieren. Mir reicht eine einfache Sicherung pro Datenbank ja locker aus, ich will eben nur meine Batchdatei nicht dauernd nachpflegen müssen. Danke und Gruß, Karsten.

Man kann das so machen, dass man die Liste der zu sichernden DB aus der PG Instanz generiert.
select datname from pg_database;

Und das Ergebnis im backup script inkludieren.

Ja, aber mit Skript meine ich hier eine normale Batchdatei… Ich kann ja in die Batchdatei keine Select-Statements einbauen. Aber wenn ich so darüber nachdenke, kann ich mir auch ein kleines Programm schreiben, welches mit diesem Select die Datenbanken auflistet und anschließend sichert. Das ganze dann per Taskplaner aufrufen und es sollte gehen. Das wird alles intern genutzt, so dass ich die Zugangsdaten zum Server einfach in das Programm reincodieren kann, das ist hier kein Problem. Muss ich mal eine Nacht drüber schlafen.

Gruß, Karsten.

Naja, nicht komfortabel, aber es geht sogar unter Windows.

@echo off
  
SET PGHOST=localhost
SET PGDATABASE=postgres
SET PGUSER=postgres
SET PGPASSWORD=passwort	
 
psql -p 5434 -X --variable=ON_ERROR_STOP= -1 -w -f selectstatement.sql > ergebnis.txt 2>&1

Achso, Port anpassen und in der Notation landet auch die Fehlermeldung in der Ausgabe.
Kann man auch anders aufbauen, je nach Bedarf. Schau mal im Netz.
(auch das Format der Ausgabe, sodass eine reine Werteliste rauskommt)

Ich mache das so unter Windows:

@echo off

set PGPASSWORD=*****
set pgdir=c:\Programme\PostgreSQL\15\bin

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined ldate set ldate=%%x
set today=%ldate:~0,4%_%ldate:~4,2%_%ldate:~6,2%

rem Backup aller User accounts 
%pgdir%\pg_dumpall -g -f globals_%today%.sql  -U postgres

rem Liste aller Datenbanken erstellen
%pgdir%\psql -U postgres -c "\copy (SELECT datname FROM pg_database WHERE NOT datistemplate and datname not in ('...')) to dblist.txt"

for /f "tokens=1 delims= " %%i in (dblist.txt) do (
  echo Dumping %%i
  %pgdir%\pg_dump -U postgres --format=c --file=%%i_%today%.pgdmp -d %%i >> backup.log
)

Das datname not in (...) verwende ich um ein paar Testdatenbank auszuschließen von denen ich kein Backup benötige.

1 „Gefällt mir“

warum -Fc UND --format=c ? Weil doppelt besser hält? :wink:

Genau, so ist es überzeugender :wink:
(Copy & Paste Fehler)

1 „Gefällt mir“

Vielen herzlichen Dank für die Batchdatei, das hilft mir sehr, probiere ich gleich aus.

Gruß, Karsten.

So, die Batchdatei läuft perfekt. Vielen Dank an auch alle, ihr seid die Besten!

Dankbare Grüße, Karsten.

Moin,
ich klinke mich hier ein wegen dem Format (Custom)

Ich hatte meine Datenbanken Zeitlang mit -t (Tar) gesichert, später mit Custom und z.Z mache ich “normale” SQL Dateien. Hintergrund - ich wollte zumindest zum Testen eine größere Datenbank von Linux nach Windows und eine von WIndows nach Linux Rücksichern. Bin in beiden Fällen gescheitert (womöglich habe ich was falsch gemacht und das Problem was ich hatte lässt sich elegant umgehen)
Und zwar bei Linux ist Standardmäßig alles als UTF8 kodiert. Bei Windows ist das template 0 und Template1 mit Zeichensatz “German_Germany.1252”
Und so kam die Meldung bei Windows, dass mit UTF8 das System nichts anfangen kann und unter Linux, dass mit “German_Germany.1252” das System nicht anfangen kann.
Bei den SQL Dateien habe ich mit vi es so umgeändert, dass es für das entsprechende System passte, aber so ganz richtig war diese Vorgehensweise wohl nicht.
Nur wie löst man so etwas? Ich hoffe es so weit verständlich beschrieben zu haben.

War meine Frage dazu zu “unverschämt einfach”? Da wäre ich immer noch sehr an einer Antwort und guter Parametrisierung interessiert.
Meine DB läuft an sich unter Linux und im Moment zeichnet es sich nicht ab, dass ich unbedingt wechseln musste, aber… man weiß es nie.

Hmm, ich hatte damit noch nie Probleme. Allerdings initialisiere ich einen Postgres Cluster unter Windows immer mit UTF-8 (also initdb.exe ... -E UTF8). Ich sehe keinen Grund im 21. Jahrhundert eine Single-Byte Encoding zu verwenden.

Zumindest der Weg Windows → Linux sollte funktionieren wenn Du beim Backup unter Windows UTF-8 verwendest pg_dump ... --encoding UTF8

Eventuell könnte die andere Richtung funktionieren wenn Du den Dump in Linux mit einem ISO Encoding machst: pg_dump ... --encoding ISO-8859-1

ISO-8859-1 sollte mit dem Windows 1252 kompatibel sein.

Generell würde ich aber empfehlen, auch unter Windows Datenbankcluster immer mit UTF-8 zu erstellen.

Kann man das nachträglich ändern?

Ich habe das zum einem gar nicht verändert, weil mir nicht klar war, dass so etwas verwendet wird. Zum anderen bin ich auch froh darüber, denn ich hatte die Windows Installation wegen einer doch “dämlicher” Onlinebanking Software die ich nutze gebraucht. Die kann zwar später problemlos mit UTF8 laufen, bei der Installation verlangt der Installer/ Initiator der DB eben “Windows 1252” (so programmiert man bei der DZ Bank)

Nein, geht leider nicht.

Nur zur Sicherheit - kann man das nur bei einem ganz frisch/ leeren Cluster setzen oder kann ich es z.B auch dann ändern wenn nächstes Update kommt also auf 16? Dann läuft doch der neue Server erst mal auf einem anderen Port und abgesehen von seiner postgres Datenbank hat er erst mal nichts.

Das kann man nur beim initdb setzen.

Wenn ich das richtig im Kopf habe, kannst Du bei einem Wechsel des Encodings das Upgrade nur über pg_dump/pg_restore machen. pg_upgrade geht vermutlich nicht.

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.