LINUX.ORG.RU

Скрипт для резервного копирования базы данных в PostgreSQL

 ,


0

3

Здравствуйте! Появилась необходимость автоматизировать процесс резервного копирования базы данных в PostgreSQL. В ручном режиме через консоль бэкапирование делается командами:

su postgres;

cd /var/lib/postgresql/9.1;

pg_dumpall -r > rw.sql # Сохраняем роли пользователей

pg_dump -o db > dump # Основной бэкап

Вся загвоздка у меня на втором этапе. Насколько я понял, сменить текущую директорию в bash'е, из которого вызывался скрипт, из скрипта нельзя. Посоветуйте пожалуйста, как можно решить эту проблему или что можно посмотреть/почитать по этой тематике?

BPATH=/var/lib/postgresql/9.1
pg_dumpall -r > $(BPATH)/rw.sql # Сохраняем роли пользователей
pg_dump -o db > $(BPATH)/dump # Основной бэкап

Так?

Почитай что-нибудь про bash (тот же man bash или какого-нибудь Кернигана и Пайка про Программное окружение Unix), а для целей автоматизации возможно лучше про Python/perl.

Evgueni ★★★★★ ()
Последнее исправление: Evgueni (всего исправлений: 3)

Вся загвоздка у меня на втором этапе. Насколько я понял, сменить текущую директорию в bash'е, из которого вызывался скрипт, из скрипта нельзя.

Кто тебе сказал такую чушь? Конечно же можно, используй cd в скрипте, всё работает нормально.

tiandrey ★★★★★ ()

Во-первых, советую обновиться, 9.1 уже весьма старая версия.
Во-вторых, тебе нужен barman.

AnDoR ★★★★★ ()
Ответ на: комментарий от tiandrey

пробовал напрямую из скрипта переходить:

#!/bin/bash

su postgres

cd /var/lib/postgresql/9.1

Когда запускаю скрипт, меняет только пользователя и переходит в домашнюю директорию:

postgres@trismegist:/home/trismegist$

пытаюсь в скрипте присвоить значение переменной:

#!/bin/bash

DIR=$DIR

$DIR=«/var/lib/postgresql/9.1

cd $DIR

Выдает ошибку: строка 3: =/var/lib/postgresql/9.1: Нет такого файла или каталога

Bash изучаю только второй день)

Bellerofont ()

Пользуйся

> cat pg_backup 
#/bin/bash
if [[ -z $1 ]]; then
    echo "./pg_backup <DATABASE> [<ROLE>]";
    exit
fi

date=`date +'%Y-%m-%d-%H-%M-%S'`

pg_dump -Fc -h localhost -U postgres $1 > $1_$date.pgsql
if [[ ! -z $2 ]]; then
    pg_dumpall --roles-only -h localhost -U postgres | grep $2 > $1_$2_$date.sql
fi
> cat pg_restore 
#/bin/bash
if [[ -z $1 || -z $2 ]]; then
    echo "./pg_restore <DATABASE> <FILEBASE> [<FILEROLE>]"
    exit
fi

date=`date +'%Y %b %d - %H:%M:$S'`
echo "" >> restore.log
echo "[$date]" >> restore.log
echo "DROP DATABASE $1;" | psql -h localhost -U postgres
if [[ ! -z $3 ]]; then
    cat $3 | psql -h localhost -U postgres >> restore.log
fi
pg_restore -C -d template1 -e -Fc -h localhost -U postgres $2 >> restore.log
bvn13 ★★★★★ ()

Спасибо большое за Ваши рекомендации! Отдельное спасибо, bvn13 за скрипт!!!

Bellerofont ()
Ответ на: комментарий от Bellerofont

В-нулевых, используй LORCODE. Подсказка в нижней части формы создания сообщения.

Во-первых, su так не используется в скриптах. su user запустит интерактивную сессию шелла; если ты хочешь скрипт запускать от имени другого пользователя, это делается по-другому.

Во-вторых, вот эта строчка:

$DIR=«/var/lib/postgresql/9.1
косячная. Чтобы присвоить переменной значение, доллар использовать не нужно. А первая строчка
DIR=$DIR
вообще бредовая. Ты присваиваешь переменной её же значение.

В общем, почитай хоть какие-нибудь туториалы по программированию на баше.

tiandrey ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.