1. bash / Говнокод #16118

    −131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    #!/bin/bash
    echo Создание каталога...
    if ! [ -d ./dump ]; then
      mkdir ./dump
    fi
    
    currentdate=$(date +%F);
    
    cd ./dump
    
    echo Создание резервной копии основной базы данных...
    pg_dump -U %логин%  -f database.dump
    
    echo Создание архива...
    lzma -9vc database.dump > $currentdate.lzma
    echo Удаление временных файлов...
    rm -rf database.dump
    echo Создание резервной копии завершено.

    Написал скрипт для создания ежесуточного дамба БД. Что можно улучшить? Где явное говно?

    Запостил: dunmaksim, 05 Июня 2014

    Комментарии (76) RSS

    • дамба БД [x]

      нахера создавать папку по относительному пути?
      Ответить
      • Папка с дампами создаётся в /home того пользователя, у которого
        а) имеется тут же файл .pgpass с логинами/паролями для доступа к БД
        б) в заданиях cron'а стоит выполнение данного скрипта. Не от имени root же делать бэкапы.
        Ответить
        • Ну и где гарантия, что cwd = home? А если все-таки придется от рута делать, пусть корень засирается?
          Ответить
          • Гарантия в том, что данный скрипт запускается именно от имени того пользователя, который нужен, поэтому рабочая папка будет именно там, где надо (инфа 146%)
            Ответить
        • > Папка с дампами создаётся в /home того пользователя, у которого
          cd $HOME/dump

          же!
          Ответить
      • rm -rf database.dump


        шта?
        Ответить
    • Нафига lzma, когда есть xz? lzma же устаревший формат (по крайней мере, так говорит ман на XZ Utils).

      Что мешает на ходу сжимать, без временных файлов? pg_dump | xz > $currentdate.sql.xz
      Ответить
      • Спасибо, не знал про xz.
        Раньше в один архив помещалось два дамба двух разных БД (одна для хранения инфы, одна для логов действий пользователей).
        Ответить
        • Да и так - сжимая на ходу - можно в один архив несколько дампов положить. Другой вопрос, зачем?
          (pg_dump --blabla && pg_dump --blabla) | xz > $currentdate.sql.xz

          И ещё: LZMA на уровне -9 будет отжирать уж слишком много памяти при сжатии при сомнительном профите.

          Да, и /bin/bash - непортабельно. Тем более в скрипте всё равно нет ни одного башизма.
          Ответить
          • echo Создание каталога...
            cd ~
            if ! [ -d ./dump ]; then
            mkdir ./dump
            fi

            currentdate=$(date +%F);

            cd ./dump

            echo Создание резервной копии основной базы данных...
            pg_dump -U %логин% | xz -9e -z T 6 -v -F gz > $currentdate.gz

            echo Создание резервной копии завершено.
            Ответить
            • Мой XZ Utils (FreeBSD "из коробки") не поддерживает -F gz. А вообще я намекал на снижение -9 до, например, дефолта (там в мане есть табличка с требованиями по памяти на различных пресетах), а не на смену формата.
              Ответить
              • На сервере 8 Гб RAM, 16 ядер, архивирование производится в 2 часа ночи, поэтому не должно быть проблем (старый скрипт полгода работал без проблем).
                Ответить
          • > (pg_dump --blabla && pg_dump --blabla) | xz > $currentdate.sql.xz
            Они же склеются в один файл... Потом расчленять придется при восстановлении, если нужен только один. Неудобно.
            Ответить
            • >Раньше в один архив помещалось два дамба двух разных БД (одна для хранения инфы, одна для логов действий пользователей).
              Это уже вопрос к ОПу, а не ко мне.
              Ответить
              • > Это уже вопрос к ОПу, а не ко мне.
                Судя по тому, что ОП выгружает дампы на диск - 146%, что он делал tar.xz.
                Ответить
                • Да, я жал два файла в tar-архив, который подавался через конвейер в топки lzma
                  Ответить
      • Что за xz и почему этого прыщеговна нет на винде, или оно по крайней мере неизвестно?
        Ответить
        • Самое обыкновенное lzma2, под виндой должно 7zip'ом читаться и писаться.
          Ответить
          • Логично. Ибо IZMA - один из основных алгоритмов сжатия в 7Zip, а вторая изма, если не гоню - это изма многопоточная.
            Ответить
            • Гонишь, ой гонишь
              Ответить
              • щас загуглю и тебе будет стыдно
                Ответить
              • Для алгоритма сжатия LZMA архиватор одновременно может использовать до 2 потоков. Невозможность использования большего их количества объясняется последовательным характером непрерывного сжатия. Алгоритм сжатия LZMA2 не имеет этого недостатка.

                http://ru.wikipedia.org/wiki/7-Zip
                Ответить
                • Да они там все просто тупые - написать AssParallel и дело в шляпе!
                  Ответить
            • >а вторая изма, если не гоню - это изма многопоточная.
              За что ж так Лемпеля?
              Ответить
          • Но не открывается. Или я с другим перепутал?
            Ответить
    • Всем спасибо за code review!
      Ответить
    • > крона
      Как бы это уже тоже устарело. systemd - это теперь наше все.
      Кроме того, лучше делать архив так, чтобы он сразу же уничтожал незаархивированый файл. Можно приводить разные аргументы в пользу надежности разных сценариев, но, на практике, я сталкивался с ситуацией, когда бекап нельзя было сделать потому, что не хватало места, а чтобы запороть бекап при создании архива - ну это нужно, чтобы электричество отключили, или что-то такого плана.
      Ответить
      • > уничтожал незаархивированый файл
        Ну тогда уж пайп, как WGH советовал выше.

        > а чтобы запороть бекап при создании архива - ну это нужно, чтобы электричество отключили
        Если создавать архив под временным именем, а потом перемещать в нужную папку - шанс на фейл почти нулевой. Такую транзакцию на журналируемой фс хер убьешь даже отключением света. А если и убьется - то вместе с файловой системой.

        P.S. Вот что самое главное - никогда не создавать бекап сразу поверх старого. Да и вообще, желательно его сливать куда-нибудь на ленточку или соседний сервак. Данные и их бекап на одном компе = ССЗБ.
        Ответить
    • So dumb.
      Ответить
    • 1. В админке, всегда пользуйся абсолютными путями. Или по крайней мере делай проверки что ты в текущем каталоге чего важного случайно не затрешь.

      2. Проверяй наличие свободного места!!! Например, что есть как минимум 20% места. Громко жалуйся на ошибки.

      3. `mkdir` заменить на `mktemp -d`

      4. `cd ./dump` - когда тебе важны данные всегда *ВСЕГДА* проверяй результат `cd`. Если где-то что-то обламалось и папка не существует, то ты будешь переписывать и удалять локальные файлы. (Это опять отсылка на использованию абсолютных путей.)

      5. Про pg_dump | xz тебе уже расказали: когда можно, лучше избегать дергать файловую систему за зря.

      6. Пользуйся `xz -2` - по компресси аналогично bzip2, но намного быстрее. Скорость бэкапа может и не самый важный критерий, но по моему опыту лучше сервак за зря не грузить. А если грузишь, то не надолго. Думай так: сбой может произойти час спустя как ты запустил бэкап. Быстрый бэкап уже закончит - медленый будет прерван. В первом случае у тебя уже есть с чего данные подымать. Во втором - данные только с прошлого дня.

      7. Добавь `sync` в конце скрипта для пущей надежности.

      8. Вывод бэкап скрипта шли самому себе на мыло. Например:
      bash the_cool_backup.sh | mail -s "Backup output from $(date +%F)" [email protected]
      Ответить
      • А да. Добавь таймстемпы к командам что бы знать когда что запускалось и завершалось.

        Плюс добась где-нибудь вывод того сколько времени комманды заняли (добавь `time`). Низкая скорость часто есть признак проблем.
        Ответить
      • И добавь "xz --test" для проверки целостности архива.
        Ответить
        • > И добавь "xz --test" для проверки целостности архива...
          ... причем на том серваке, на который этот архив приземляется.
          Ответить
          • по моему опыту не обязательно.

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

            ....

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

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

              >как правило с самой низкой компресией (но не store) что бы целостность потом можно было проверить.
              А что мешает отдельно чексуммы генерить?
              Ответить
              • "А что мешает отдельно чексуммы генерить?"

                Зачем? Архиватор уже все делает за меня. Ну и в добавок, если можно, слегка архивирует.

                И в каждую ось уже все проинтегрировано из коробки: открываешь архив, нажимаешь кнопку "тест", готово.
                Ответить
                • Потому что сгенерить ческуммы может быть быстрее, чем быстрое сжатие, и они будут лучше crc32? Ну а в архиве удобнее, да.
                  Ответить
                  • crc32 вполне хватает для ошибок данных. типичная ошибка - нечитаемый сектор, который часто заменяется нулями (или мусором).

                    навороченые хэши нужны только если тебе нужна крипто-сильная подпись, что бы кто-то данные не подменил.

                    я честно говоря начал архивами пользоватся только потому что мне нужно было бэкапить в начале кучи файлов. оно просто и на само деле удобно, почему ничего другого и не искал.
                    Ответить
          • Копия архива хранится на двух разных серверах. Насчёт этого можно не беспокоиться.
            Ответить
            • Лучше хранить в облаке, например на амазоне с3
              Ответить
              • А если провайдер найдет там призывы к порно и закроет его?
                Ответить
                • А криптографию для кого придумали? К тому же можно хранить на нескольких облаках, включая русские - тот же мейлсру сейчас 100 гигов даёт. Всех одновременно не закроют. И даже если закроют - совсем не факт, что у тебя в этот момент накроется и основной винт.
                  Ответить
                  • зеленка - За то если все закроют и винт сгорит то он будет кричать "Уууу, сраный борманд, советчик хуев!"
                    Ответить
                    • А 100% гарантии тебе ничто не даст.
                      Ответить
                      • Ssd в сейфе в вакуумной упаковке разве что
                        Ответить
                        • А потом у тебя под домом проснется вулкан.
                          Ответить
                          • справедливо
                            хотя с точки зрения физики любую инфу можно восстановить.

                            кроме попавшей в чд
                            Ответить
                            • Нельзя. В природе дохрена необратимых процессов.

                              Так что вся надежда на распределённость бекапа. В чем неплохо помогают облака.
                              Ответить
                              • Облака помогают до поры, до времени. До санкций, в общем.

                                P.S.: http://tjournal.ru/paper/block-school-for-nothing
                                Ответить
                                • А че санкции то? Можно подумать, что местных облаков нету.
                                  Ответить
                                  • Местное облако тоже могут забанить за спайс, за кавказцев-членодевок и за “down the river, not across the street”.
                                    Ответить
                                    • > Местное облако тоже могут забанить
                                      И? А винт можно уронить на пол, комп могут украсть или изъять, флешку постирают вместе со штанами, а распечатку съест кот.

                                      Просто не надо держать все яйца в одной корзине, вот и всё.
                                      Ответить
                              • https://ru.wikipedia.org/wiki/Исчезновение_информации_в_чёрной_дыре

                                насколько я помню в других местах нашей бренной вселенной с точки зрения физики информация, как и энергия, не исчезает
                                Ответить
                                • >насколько я помню в других местах нашей бренной вселенной [...] информация, как и энергия, не исчезает
                                  На самом деле нет.
                                  Ученые недавно изобрели облачный /dev/null в котором любая ваша информация гарантированно исчезнет.
                                  Ну а насчёт исчезновения энергии в черной дыре - это и вовсе бред, её масса ведь увеличится.
                                  Ответить
                                  • излучение хокинга же
                                    Ответить
                                  • > Ну а насчёт исчезновения энергии в черной дыре - это и вовсе бред, её масса ведь увеличится.
                                    Выходит, по теории доктора Кегдана, информация всё ещё доступна, поскольку она всё ещё в нашей вселенной. Ну а что достать кто-то не может - так это проблемы ниасиляторов.
                                    Ответить
                                    • Кегдан - персона года. Король, доктор, админ и нарисованный пони
                                      Ответить
                                      • Санитары! Санитары, он ебанулся! Идите забирайте его, нахуй, я с ним здесь сидеть не буду, блядь!
                                        Ответить
                                      • Ещё и Робеспьер из шестой палаты.
                                        Ответить
      • > Вывод бэкап скрипта шли самому себе на мыло.
        У меня cron это сам делает. Достаточно перед записью написать MAILTO=...
        Ответить
        • Это я на всякий случай добавил. Многие админы идиоты почту от крона автоматом удаляют. А потом удивляются...
          Ответить
    • Не обязательно делать cd, можно указать просто путь
      Дампать лучше в custom формат: будет чуть меньше места
      Используйте пайпы, чтобы не плодить временные файлы: foo | bzip2 > bar.bz
      Ответить

    Добавить комментарий