Potřebuji odsouhlasit používání cookies. Když tyto stránky používáte, vyjadřujete souhlas.

Automatická záloha PostgreSQL databáze na Linuxu a Windows

Jednu PostgreSQL databázi můžete pravidelně zálohovat na Linuxu i Windows. Ukážu skript pro oba systémy, uložení hesla, nastavení cronu a Plánovače úloh i ověření obnovy.


  Načítím reklamu ...

Zálohujete data? Pokud ano, tleskám. Pokud ne, pojďme s tím začít. Pro pravidelnou zálohu jedné PostgreSQL databáze stačí nástroj pg_dump, skript a plánovač. Níže najdete postup pro Linux i Windows.

Databáze může běžet na stejném počítači i na jiném serveru. Na počítači, který zálohu vytváří, potřebujete klientské nástroje PostgreSQL a účet s přístupem k zálohovaným datům.

Jaký soubor budeme vytvářet

V obou příkladech používám --format=custom. Vznikne komprimovaný archiv s příponou .backup, který se obnovuje přes pg_restore. Samostatný gzip už není potřeba. Podrobnosti jsou v dokumentaci pg_dump.

Použijte klienta stejné hlavní verze jako databázový server. Starší pg_dump novější server nezazálohuje; novější klient umí pracovat také s podporovanými staršími servery. Cestu ke klientovi a údaje o připojení v ukázkách upravte podle své instalace.

Kájovo tip
Tento postup zálohuje jednu databázi. Uživatelské role a další společné objekty serveru vyžadují samostatné řešení, například pg_dumpall. Pro obnovu k libovolnému okamžiku nebo rozsáhlé databáze je potřeba jiný plán zálohování než jeden noční export.

Linux: heslo pro automatickou zálohu

V domovském adresáři uživatele, který bude zálohu spouštět, vytvořte .pgpass. Jeden řádek má tvar:

hostname:port:database:username:password

Pro následující ukázku například:

localhost:5432:moje_databaze:backupuser:SEM_PATRI_VASE_HESLO

Soubor omezte pouze na vlastníka:

chmod 600 "$HOME/.pgpass"

Jméno serveru musí odpovídat tomu, které předáváte příkazu. Pokud některá hodnota obsahuje dvojtečku nebo zpětné lomítko, zapisují se jako \: a \\. Podrobnosti a pravidla oprávnění popisuje dokumentace souboru s heslem.

Linux: zálohovací skript a cron

Nejdřív příkazem command -v pg_dump zjistěte cestu ke klientovi. Následující skript uložte jako dump.sh. Počítá s klientem v /usr/bin/pg_dump a zálohami v domovské složce účtu, který jej spustí:

#!/bin/sh
set -eu
umask 077

pg_dump_bin='/usr/bin/pg_dump'
backup_dir="$HOME/zaloha-postgresql"
export PGPASSFILE="$HOME/.pgpass"

mkdir -p "$backup_dir"
chmod 700 "$backup_dir"
timestamp=$(date +'%Y-%m-%d_%H-%M-%S')
backup_file="$backup_dir/moje_databaze-$timestamp-$$.backup"
temporary_file="$backup_file.part"
trap 'rm -f "$temporary_file"' 0
trap 'exit 1' 1 2 15

"$pg_dump_bin" --host=localhost --port=5432 --username=backupuser \
--dbname=moje_databaze --format=custom --no-password \
--file="$temporary_file"
mv "$temporary_file" "$backup_file"
printf 'Hotovo: %s\n' "$backup_file"

Parametr --no-password zakazuje interaktivní dotaz na heslo. Heslo se přesto použije ze souboru; pokud chybí nebo nesedí, příkaz skončí chybou. Přípona .backup se objeví až po úspěšném exportu, během zápisu má soubor navíc .part.

Nastavte oprávnění a nejdřív vyzkoušejte ruční spuštění:

chmod 700 dump.sh
./dump.sh

Pak pod stejným uživatelem otevřete crontab -e. Příklad pro každodenní spuštění v 1:00:

0 1 * * * /home/backup/dump.sh >> /home/backup/dump.log 2>&1

Cesty /home/backup/... jsou ukázkové: nahraďte je skutečnou cestou ke skriptu a zapisovatelnému logu. Cron tímto řádkem úlohu spouští podle časového nastavení svého prostředí. Chyby zůstávají v logu; kontrolujte i stáří poslední úspěšné zálohy.

Windows: klient PostgreSQL a soubor s heslem

Najděte pg_dump.exe. U běžné instalace může být například v C:\Program Files\PostgreSQL\18\bin\; číslo verze ani cestu nepřebírejte bez kontroly.

Výchozí soubor s heslem se na Windows jmenuje %APPDATA%\postgresql\pgpass.conf. Skript níže ale nastavuje PGPASSFILE na konkrétní cestu C:\Zalohy\PostgreSQL\pgpass.conf, aby nezávisel na umístění profilu uživatele.

Připravte tuto složku a vložte do pgpass.conf stejný řádek jako na Linuxu:

localhost:5432:moje_databaze:backupuser:SEM_PATRI_VASE_HESLO

V Průzkumníku zkontrolujte, že soubor nemá skrytou příponu .txt. Soubor i složku se zálohami zpřístupněte jen účtu úlohy a správcům, kteří je potřebují. PostgreSQL na Windows oprávnění souboru nekontroluje stejně jako linuxové chmod 600; ochranu zajišťují oprávnění Windows.

Windows: skript pro PowerShell

Následující skript je pro Windows PowerShell 5.1. Uložte jej jako C:\Skripty\dump-postgresql.ps1 a upravte cesty, databázi i účet. Heslo do skriptu nepatří, bere se z připraveného souboru.

$ErrorActionPreference = 'Stop'
$pgDump = 'C:\Program Files\PostgreSQL\18\bin\pg_dump.exe'
$backupDir = 'C:\Zalohy\PostgreSQL'
$env:PGPASSFILE = Join-Path $backupDir 'pgpass.conf'
$timestamp = Get-Date -Format 'yyyy-MM-dd_HH-mm-ss'
$backupFile = Join-Path $backupDir "moje_databaze-$timestamp-$PID.backup"
$temporaryFile = "$backupFile.part"
$logFile = Join-Path $backupDir 'backup.log'

try {
New-Item -ItemType Directory -Path $backupDir -Force | Out-Null
$dumpArguments = @(
'--host=localhost', '--port=5432', '--username=backupuser',
'--dbname=moje_databaze', '--format=custom', '--no-password',
"--file=$temporaryFile"
)
& $pgDump @dumpArguments 2>> $logFile
if ($LASTEXITCODE -ne 0) {
throw "pg_dump skoncil s kodem $LASTEXITCODE."
}
Move-Item -LiteralPath $temporaryFile -Destination $backupFile
"$(Get-Date -Format o) OK: $backupFile" | Out-File -FilePath $logFile -Append -Encoding Unicode
exit 0
} catch {
if (Test-Path -LiteralPath $temporaryFile) {
Remove-Item -LiteralPath $temporaryFile -ErrorAction SilentlyContinue
}
$message = "$(Get-Date -Format o) CHYBA: $($_.Exception.Message)"
$message | Out-File -FilePath $logFile -Append -Encoding Unicode -ErrorAction Continue
[Console]::Error.WriteLine($message)
exit 1
}

Archiv zapisuje přímo pg_dump přes --file. PowerShell zpracovává jen textový log, takže nezasahuje do binárního obsahu zálohy. Návratový kód programu se kontroluje přes LASTEXITCODE; při neúspěchu skript končí kódem 1.

Nejdřív jej spusťte ručně ze svého účtu:

powershell.exe -NoProfile -NonInteractive -File "C:\Skripty\dump-postgresql.ps1"

Pokud spuštění blokují zásady PowerShellu, vyřešte povolení vlastního skriptu podle nastavení počítače se správcem. Do úlohy není potřeba automaticky přidávat ExecutionPolicy Bypass. Po úspěšném spuštění zkontrolujte nový soubor .backup a log backup.log.

Windows: každodenní spuštění v Plánovači úloh

Otevřete Plánovač úloh a zvolte vytvoření úlohy:

  1. Na kartě Obecné nastavte účet, který má přístup ke skriptu, souboru s heslem a zálohám. Pro běh po odhlášení vyberte spuštění bez ohledu na přihlášení uživatele; při ukládání úlohy může Windows požádat o heslo tohoto účtu. Jde o heslo Windows, nikoli PostgreSQL.
  2. Ve Spouštěčích nastavte každý den v 1:00.
  3. V Akcích nastavte spuštění programu. Program je C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, pokud je Windows nainstalovaný v C:\Windows. Argumenty jsou uvedené níže; pole pro pracovní složku může obsahovat C:\Skripty.
  4. V Nastavení zvolte spuštění co nejdřív po zmeškaném termínu a při již běžící úloze nespouštějte další instanci. Na notebooku zkontrolujte i podmínky napájení a spánku.
  5. Úlohu ručně spusťte a ověřte soubor, log i Výsledek posledního spuštění. Po úspěchu má být 0, běžně zobrazené jako 0x0. Vyzkoušejte také běh po odhlášení.

Do pole pro argumenty programu vložte:

-NoProfile -NonInteractive -File "C:\Skripty\dump-postgresql.ps1"

Skript používá úplné cesty. Pokud cesta k Windows nebo PostgreSQL neodpovídá ukázce, upravte ji; samotný název programu v úloze může vést k jiné instalaci, než kterou jste zkoušeli ručně.

Záloha je hotová až po zkoušce obnovy

Seznam objektů v archivu si můžete vypsat příkazem:

pg_restore --list "/cesta/k/zaloze.backup"

Na Windows totéž spustíte z PowerShellu například takto:

& 'C:\Program Files\PostgreSQL\18\bin\pg_restore.exe' --list 'C:\Zalohy\PostgreSQL\zaloha.backup'

Výpis obsahu ale ještě neprokazuje, že se obnoví všechna data. Správce vám má připravit samostatnou prázdnou testovací databázi a odpovídající účet. Do ní proveďte obnovu:

pg_restore --host=localhost --port=5432 --username=restoreuser --dbname=obnova_test --exit-on-error "/cesta/k/zaloze.backup"

Windows varianta:

& 'C:\Program Files\PostgreSQL\18\bin\pg_restore.exe' --host=localhost --port=5432 --username=restoreuser --dbname=obnova_test --exit-on-error 'C:\Zalohy\PostgreSQL\zaloha.backup'

Účet pro obnovu potřebuje jiná oprávnění než účet, který data jen čte. Pro zachování vlastníků a oprávnění musejí být dostupné i potřebné role. Obnovu zkoušejte do testovací databáze; příklady neobsahují mazání produkčních dat. Další možnosti vysvětluje dokumentace pg_restore.

Nakonec zkontrolujte obnovená data, stáří poslední úspěšné zálohy a místo na disku. Tyto ukázky staré soubory automaticky nemažou. Nastavte si jejich uchovávání podle potřeb a kopii záloh ukládejte také mimo zálohovaný počítač.

Zdroje

PostgreSQL, Zálohování

- (31. 10. 2026)

Líbil se vám článek?

Nasdílejte ho svým přátelům na sociálních sítích.

Pinterest

Názory, připomínky a jiné komentáře

Zobrazit další komentáře

Zatím nikdo nic nenapsal. Buďte první :-).

Vložit nový komentář

Jsem programátor, horolezec a tak trochu FlexiBee fanatik :-).
Na CharlieBlogu sepisuji své nápady a poznatky už od roku 2006.

Powered by CharlieBlog Engine v3.0 - Login