пятница, 7 апреля 2017 г.

Резервное копирование Postgre SQL на Windows с помощью Bacula, pg_dump

Дано:
Windows 2012 R2 Standart
Исполняемые файлы установлены сюда:
C:\Program Files\PostgresPro 1C\9.4
Папка с Postgres тут
D:\pgsql\9.4\data

Первая часть, pg_dump

Написал скрипт на powershell
Если передать ему в качетсве параметра имя базы, он сделает дамп одной базы. Если запустить его без параметров, он сделает дамп всех баз кроме template0, template1, postgres.

[CmdletBinding()]
param(
    [String]$dbname="",
    [String]$dumpdir= 'd:\tmp\bacula\pgsql',
    [String]$PGDUMP="C:\Program Files\PostgresPro 1C\9.4\bin\pg_dump.exe",
    [String]$PSQL="C:\Program Files\PostgresPro 1C\9.4\bin\psql.exe",
    [String]$dbserver='localhost',
    [String]$dbuser='postgres',
    [String]$dbpassword='uekmrf'
)

$sql_listdb="select datname from pg_database where not datname in ('template0','template1','postgres') order by datname;"
$env:PGPASSWORD = $dbpassword
$datestamp = Get-Date -UFormat "%Y%m%d-%H%M%S"

Write-Verbose -message dumpdir=$dumpdir
Write-Verbose -message PGDUMP=$PGDUMP
Write-Verbose -message PSQL=$PSQL
Write-Verbose -message dbserver=$dbserver
Write-Verbose -message dbuser=$dbuser
Write-Verbose -message dbpassword=$dbpassword
Write-Verbose -message dbname=$dbname
Write-Verbose -message datestamp=$datestamp

Write-Verbose -message "Проверяем, существует ли папка $dumpdir"
if(!(Test-Path -Path $dumpdir )){
Write-Verbose -message "Cоздаём папку $dumpdir"
    New-Item -ItemType directory -Path $dumpdir | Out-Null
} else {
Write-Verbose -message "Удаляем папку с дампами"
Remove-Item -path $dumpdir -Force -Recurse | Out-Null
    New-Item -ItemType directory -Path $dumpdir | Out-Null
}

Write-Verbose -message "Проверяем указана ли база данных для копирования"
if ($dbname -eq "") {
    Write-Verbose -message "Копируем все базы кроме template0, template1, postgres"
    $dblist = &$PSQL -t -h $dbserver -U $dbuser -c $sql_listdb
    foreach($db in $dblist) {
        $db = $db.TrimStart()
        if ($db -ne "") {
            $dbname=$db
            Write-Verbose -message "Копируем базу данных $dbname"
            &$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\$dbname-$datestamp.sql.gz --compress=1
        }
    } 
} else {
    Write-Verbose -message "Копируем указанную базу данных $dbname"
    &$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\$dbname-$datestamp.sql.gz --compress=1
}
Write-Verbose -message "Создание дампов завершено"

Скрипт запускаем из бакулы следующим образом:
ClientRunBeforeJob = "PowerShell.exe -ExecutionPolicy Bypass -File D:\\pgsql\\9.4\\backup_postgres.ps1"
Скрипт удалит папку d:\tmp\bacula\pgsql, создаст её заново и сложит все дампы в неё.
Бакуле останется только забрать их от туда.


--
Ратнер Арсений
Писать: arsenyratner@gmail.com
Звонить: +7 985 273 2090
Skype: arseny.ratner