LINUX.ORG.RU
ФорумAdmin

Продолжаю работать над сценарием архивации баз PostgreSQL

 ,


0

1

https://gist.github.com/andy-1983/91b7d0e21574468fb3ff3d9a6775f195#file-do_archive-sh

Не будет ли любезен дорогой лоровец ответить на вопрос касаемый этого фрагмента кода?

            *)
                SERIALNUM=$(echo "$STARTFILE" | sed 's/^.*'"${DBNAME}"'_//;s/_weekly.*//')
                nice -n 19 \
                ionice -c3 \
                pg_dump -d $DBNAME -h ${SERVERNAME} -p $PORT -U ${USERNAME} -w | \
                /usr/bin/rdiff --block-size="$BSIZE" --input-size="$ISIZE" --output-size="$OSIZE" -- delta \
                ${ARCHIVEDIR}/${DBNAME}/$STARTFILE.signature \
                - \
                ${ARCHIVEDIR}/${DBNAME}/${DBNAME}_${SERIALNUM}_${SUFFIX}.dump.delta
                if [[ $? -ne 0 ]]
                then
                    echo "$DBNAME: delta creation error "$? >> $ERRLOG
                fi
                STOPSCRIPT=$(date +%s)
                EXECUTIONTIME=$(( ($STOPSCRIPT - $STARTSCRIPT) / 60 ))
                if [[ $EXECUTIONTIME -gt $DAILYTIMEOUT ]]
                then
                    MESSAGE="TIMEOUT | pg_dump | ${SERVERLABEL} | ${SUFFIX} | $EXECUTIONTIME min"
                    /usr/bin/curl -s -X POST -H 'Content-Type: application/json' -d '{"chat_id": "'"$CHATID"'", "text": "'"$MESSAGE"'", "disable_notification": false}' https://api.telegram.org/$BOTID/sendMessage
                    rm -R "$TEMPDIR"
                    $0 weekly
                    exit 1
                fi
            ;;

Дело в том, что я ожидаю что после выполнения exit, работа сценария прекратится полностью, но происходит только прерывание работы цикла и код за циклом продолжает выполняться


exit выходит из шелла, цикл работает в subshell. Как бы это ни было дико в сравнении с другими языками, поведение корректное.

anonymous
()
cat $ARCHIVEDIR'/'$ListOfBases | while read DBNAME

Вот эта строка запускает подпроцесс, который и завершается командой exit. Даже не знаю, что посоветовать. mainpid=$$ в начале скрипта и kill $mainpid вместо exit? Дикий костыль.

anonymous
()

Хорошо. Вот ты сделал дельту. Потом еще штук 100. Что ты будешь делать, когда надо будет накатить базу на дату X?

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

Условие выхода из цикла продублировать в его начало. Когда оно начнёт выполнятся все выйдут из цикла по очереди и будет не так дико.

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

Один единственный diff со startfile - так себе идея. Размер дампа будет также расти по наклонной, ты просто несколько уменьшил его начальный размер.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master
0       8,12,16,20      *       *       *       /path/do_archive.sh daily 2>> /var/log/archive.log
0       2       *       *       1       /path/do_archive.sh weekly 2>> /var/log/archive.log
0       4       *       *       1       /path/do_clear.sh


weekly создает стартфайлы, от них система пляшет пока не создастся новый стартфайл

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

а git тоже умеет в диффы?

git - это и есть диффы. Он только в это и умеет.
upd. Зачем тебе бинари? Хотя, если сильно хочешь, то можно.

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

бггг, ну вот, надо посмотреть… на самом деле rdiff в каждом втором issues просят многопоточность, а автор говорит нихт

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

Тебе надо распиливать дамп на мелкие файлы. Тогда и будет тебе многопоточность. В рамках одного diff'а в принципе такое сложно сделать, кмк.

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

Не понимаю зачем вы это делаете. Нормальная схема бэкапа - это полный backup через pg_basebackup и инкремент через запись WAL логов. Это позволяет в последствии восстановиться на любой произвольный момент из диапазона времени за который есть backup. Вокруг этого есть куча готовых скриптов (на lor например используется https://github.com/wal-e/wal-e).

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

у меня в кластере over 100 баз, и разворачивать кластер постоянно мне ну никак… на восстановление конкретной базы нужно ~10 минут, а на кластер уходит более 1,5 часа…

и базы я бывает по 3-4 раза на дню восстанавливаю… этож 1С, там бухи накосячат, потом просят откатить… поэтому и копаюсь с каждой базой.

А кластер и WAL я бекаплю только на случай аварии… да, если бы постгри умел вести WAL по каждой базе мои костыли были бы не нужны

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

А вот если бы ты автоматизировал с нужной стороны, было бы у тебя 100 кластеров и никаких гвоздей.

там бухи накосячат, потом просят откатить

Расскажи им про историю изменений в 1С.

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

Понятная специалистам по 1С аббревиатура, тебе ни к чему. Там есть история, и они могут сами откатывать большинство документов.

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

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

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

у меня Камин и БГУ, если знаешь о чем я ;-)

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