Obsah článku
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.
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:
- 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.
- Ve Spouštěčích nastavte každý den v 1:00.
- V Akcích nastavte spuštění programu. Program je
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, pokud je Windows nainstalovaný vC:\Windows. Argumenty jsou uvedené níže; pole pro pracovní složku může obsahovatC:\Skripty. - 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.
- Ú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: pg_dump
- PostgreSQL: soubor s heslem a PGPASSFILE
- PostgreSQL: zálohování exportem
- PostgreSQL: pg_restore
- Microsoft: powershell.exe a jeho argumenty
- Microsoft: návratový kód LASTEXITCODE
- Microsoft: kódování textu ve Windows PowerShellu
- Microsoft: Plánovač úloh
- Microsoft: spuštění úlohy po zmeškaném termínu
- Microsoft: souběžné instance úlohy
