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.
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.
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.
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)
@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.
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.
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)
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.
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.