LINUX.ORG.RU

Готовый сценарий, вымученный с сообществом ЛОРа

 , ,


1

2

root@PostgreSQL:/home/maintainer# cat /root/backup.sh
#!/bin/bash

FILENAME='/root/psql_dblist'
PORT=5433
USERNAME='dbadmin'
SERVERNAME='localhost'
ARCHIVEDIR='/Backup'
SUFFIX=''

if [[ 'dayly' = $1 ]]
then
    SUFFIX='dayly_'$(date +%u)'_'$(date +%H)
    #echo $SUFFIX
    #echo Ok
fi

if [[ 'monthly' = $1 ]]
then
    SUFFIX='monthly_'$(date +%b)'_'$(date +%H)
fi

if [[ 'hot' = $1 ]]
then
    SUFFIX='hot_'$(date +%Y-%b-%d-%H%M)
fi

if [[ $SUFFIX = '' ]]
then
    echo 'Type monthly, dayly or hot as parametr'
    exit
fi

#DBLIST=$(psql -U $USERNAME -p $PORT -l | awk '/psql/ { print $1 }')
DBLIST=$(psql -U $USERNAME -p $PORT -l | q -d'|' "select c1 from - where c1 <> '' and c2 <> '' and c1 not like 'template%' limit 1,10000")

echo "$DBLIST" > $FILENAME

cat ${FILENAME} | while read DBNAME;
do
    mkdir -p ${ARCHIVEDIR}'/'${DBNAME};
    pg_dump -d $DBNAME -h ${SERVERNAME} -p $PORT -U ${USERNAME} -w | gzip > ${ARCHIVEDIR}'/'${DBNAME}'/'${DBNAME}'_'$SUFFIX'.dump.gz';
    #pg_dump -d $DBNAME -h ${SERVERNAME} -p $PORT -U ${USERNAME} -w | gzip > ${ARCHIVEDIR}'/'${DBNAME}'/'${DBNAME}'_'$(date +%Y-%b-%d-%H%M)'.dump.gz';
done

root@PostgreSQL:/home/maintainer#

Вы до сих пор под рутом сидите все время?

Скрипт простой, что тут обсуждать то? Как вы не вычистили комментарии?

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

Комменты может и не вычисти, потому что не определился с тем как будет в дальнейшем лучше, ну некоторые да, остались от отладки

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

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

Shulman ()

вы бы выложилли сниппет в gist на github

anonymous ()
#!/bin/bash

PORT=5433
USERNAME='dbadmin'
SERVERNAME='localhost'
ARCHIVEDIR='/Backup'
SUFFIX=''

usage() { echo "Usage: $0 daily | monthly | hot" 1>&2; exit 1; }

case "${1}" in
    daily)
      SUFFIX='daily_'$(date +%u)'_'$(date +%H)
      ;;
    monthly)
      SUFFIX='monthly_'$(date +%b)'_'$(date +%H)
      ;;
    hot)
      SUFFIX='hot_'$(date +%Y-%b-%d-%H%M)
      ;;
    *)
      usage
      ;;
esac

DBLIST=$(psql -U "$USERNAME" -p "$PORT" -l | q -d'|' "select c1 from - where c1 <> '' and c2 <> '' and c1 not like 'template%' limit 1,10000")

for DBNAME in ${DBLIST}
do
    mkdir -p ${ARCHIVEDIR}'/'${DBNAME};
    pg_dump -d $DBNAME -h ${SERVERNAME} -p $PORT -U ${USERNAME} -w | gzip > ${ARCHIVEDIR}'/'${DBNAME}'/'${DBNAME}'_'$SUFFIX'.dump.gz';
done
anonymous ()
Ответ на: комментарий от DRVTiny

Я бы такое неделю писал, а может 2!

Дело в том что все мои попытки писать что то на баше заканчивались очень быстро, а в этот раз мне удалось написать что то полезное.

Поэтому я был очень воодушевлен, но когда увидел ваш код, мне сразу полегчало))))

Shulman ()

Что за команда q в вашей системе??

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

На самом деле у меня не было бы и 10% интереса к написанию чего-то сложного на BASH, если бы не set -x. Замечательная штука!

DRVTiny ★★★★★ ()

3оберу к себе, спасибо ^_^

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

q это алиас к программе q-text-as-data

Нужно установить пакет python2-q-text-as-data...

Или специфичный для вашей системы пакет...

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

Задумка такая, что запуская его по крону, будут затираться страые архивы и на их место попадать новые.

Цикл 7 дней и 12 месяцев.

Shulman ()

Лучше смотри в сторону pgBackRest , например. Или других решений, которые умеют в инкрементальные резервные копии.

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

Пока разбираюсь, видимо для инкриментальных тоже срипт буду писать. Задачу поставили научиться работать. А эти все бекапаят кластер целиком, и чтобы вытащить базу придется разворачивать весь кластер. Пока это то что я узнал. Немного начал опять тонуть в рутине.

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

kissobak.sh

И это при том, что KISS - это оно самое, о чём можно было подумать.

Вообще звучит как kiss sobak...

anonymous ()

и что бы это все значило? то ему из vi помоги выйти в соседнем топике то скрипт для дампа слона помоги написать...

а расскажи, мил человек, сколько ты зарабатываешь одмином?

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

А у меня дорогой анонимус, много должностей, то значит линукс поднять, то 1С сервер обновить (кстати под офтопиком) то бумаги какие с клиентов собрать, то съездить куда.

В основном на сапорте сижу и чиню принтеры. Вот не вылажу с лора и прочих news.google.com.

И плотют мне за это смешные 60 рублей.

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

60 рублей

В секунду?

Рубли советские или российские???...

anonymous ()

подведу итоги, скрипты плохие)))
1. бекапы надо делать локально и под юзером постгрес, у которого автоматически стоит trust, уже соответственно все это USER PASS не нужно!
2. соответственно если выделаете удаленный бекап то делаем удаленно по ssh://postgres@server под юзером backup у которого сгенерирован rsa ключ
3. вы вообще свои бекапы проверяете? бекап ролей надо делать отдельно! pg_dumpall -c -r
4. размер и время имеют значение, у вас его мало/много, иначе давно уже бы перешли на pg_dump -Fd ${BASE} -j ${CPUS} -f ${BACKUPDIR}

if [ "${USER}" == "root" ]; then
    su - postgres -c ${ROOTDIR}/`basename $0`
    exit 0
else
    if [ "${USER}" != "postgres" ]; then
        echo "access denied"
        exit 1
    fi
fi

что то типа такого в начале скрипта обязательно...
anonymous2 ★★★★ ()
Последнее исправление: anonymous2 (всего исправлений: 4)
Ответ на: комментарий от anonymous2

Я наоборот думал что до рута надо добраться, знать его пароль и пароль пользователя.

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

для этого придумали sudo, и вытащить список баз достаточно просто

echo "\list" | psql

anonymous2 ★★★★ ()
Последнее исправление: anonymous2 (всего исправлений: 1)
Ответ на: комментарий от anonymous2

Короче, готовое законченное решение где?

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

Довольно специализированная статья.

У меня же законченное решение, с возможностью зацикливать архивацию и не контролировать переполнение хранилища.

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

когда будет сбой - узнаешь что это не главное :D :D, главное это время за сколько ты развернешь все при сбое.

pg_dump/pg_restore с параметрами -Fc (тотже самый gzip) однопоточно (только для pg_dump) и медленно
pg_dump/pg_restore с параметром -Fd уже лучше - многопоточность есть в обеих вариантах и ее лучше использовать
pg_basebackup самый быстрый, но у него ограничение - развернет тебе готовую базу которая только в онлайне

anonymous2 ★★★★ ()

Учиться не пробовали? Например, в университете?...

Или хотя бы читать книги по программированию, Linux и компьютерам?..

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

В смысле?

Ты придираешься к реализации, а по форме я сделал то что хотел.

Поэтому претензии к моему образованию не принимаются. Да и давно это было. И далеко не всегда я делал то чему учился. Или ты вышел на работу и прямо писал на том же языке под туже СУБД в пом же IDE?

Не поверю.

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

А Екатерину зачем порочишь своими скриптами?

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

все знают что не ее одну, да и не порочу. Человеку нужно воспринимать целостно. А не скажем по прическе или имению писать скрипты.

Ну это мой первый скрипт за 10 лет может. И он решает задачу.

Что тебе не нравится?

Shulman ()

pg_dump это не backup. Не надо базы бэкапить pg_dump`ом

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

Можно подробнее, потому что вот читаем:

https://postgrespro.ru/docs/postgresql/9.6/app-pgdump.html

pg_dump — это программа для создания резервных копий базы данных PostgreSQL. Она создаёт целостные копии, даже если база параллельно используется. Программа pg_dump не препятствует доступу других пользователей к базе данных (ни для чтения, ни для записи).

Кроме этого мы уже провели 4 восстановления (боевые) и одно тестовое. Все как на закрытом аналоге...

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

И он решает задачу.

Только вот... какую? Потому что для backup-а cluster-а это не подходит (pg_dumpall нет; cross-database consistency Вы таким способом вообще не добьётесь). Обработки ошибок тоже как-то не видно...

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

Обработки ошибок тоже как-то не видно...

Согласен, нужно писать какой то email notification.

pg_dumpall нет; cross-database consistency

По поводу этого. Базы не взаимосвязаны.

По бинарным бэкапам у меня вот такая трабла:

PostgreSQL и SystemD

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

По поводу этого. Базы не взаимосвязаны.

А по поводу pg_dumpall? Если кластер упадёт, без dump-а globals (roles, tablespaces, ...) Вы его нормально не восстановите.

По бинарным бэкапам у меня вот такая трабла:

Пролистал... IMHO, Вам надо срочно с этим разобраться. Потому что (если я ничего не пропустил) Ваш main сервер может попасть в точно такую же ситуацию после аварийного выключения.

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

Дописал апдейт к вопросу по SystemD. Запустил сервер вручную без systemd. Заработало.

Как бывает много удается сделать за 1 час свободного от телефона времени.

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

Смотря что и как понимать под backup.

БД, полученная pg_dump не является той самой бд, которая в кластере.

Как правильно заметили, кроме самой базы есть globals

Можно замучаться и накостылить запуск pg_dump с разными ключами. Но зачем все это если есть бинарный backup, который содержит именно исходный кластер как есть, а не логическую копию

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

Создал я бинарный архив и уже 2 раза его восстанаваливал

Shulman ()

SUFFIX='monthly_'$(date +%b)'_'$(date +%H)

Открой секрет, для нахрена дважды запускать date?

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

Это так важно? я как понял так и написал. Давайте свой вариант

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

Вы так говорите, как будто оно вызывается внутри глубокого цикла.

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

Это так важно? я как понял так и написал.

Плохо понял. И это таки да, важно. Понимать надо.

Давайте свой вариант

SUFFIX="monthly_$(date '+%b_%H')"
anonymous ()
Ответ на: комментарий от anonymous

К сожалению я не могу описать своего восторга от увиденного допустимыми на данном ресурсе выражениями.

Ну ок.

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

На это даже сказать нечего, ибо бесполезно.

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