Всем привет. Может кому пригодиться bash-скрипт для автоматической выгрузки баз postgres по расписанию.
Архив содержит несколько файлов:
- access.setting (настройки доступа к ресурсам)
- backup.log (файл лога)
- bases.list (список баз)
- pgsql-backup.sh (скрипт выгрузки)
- pgsql-backup-onlyday.sh (скрипт выгрузки)
- +pgsql-restore.sh (скрипт восстановления)
Итак:
access.setting содержит настройки доступа к Postgres, ftp, а так же адреса серверов, подробное описание есть в файле.
bases.list Список баз, выгружаемых скриптом. Каждая база в новой строке. Если базу выгружать не нужно - закомментируйте символом "#" или удалите строку. Важно чтобы последняя строчка оставалась пустой или закомментированной.
backup.log сюда сохраняется информация о выгрузке баз или возникающих ошибках
pgsql-backup.sh собственно сам скрипт.
Поместите содержимое архива в /home/basebackup или в любой другой каталог, но в таком случае вам необходимо поменять значение переменной PathToDir на новый путь.
Скрипт делает дамп базы, затем подключается к ftp-серверу и выгружает полученный дамп в папку указанную в настройках.
Скрипт выгружает базы по дням недели: пн, вт, ср и т.д. Соответственно бэкап базы храниться 7 дней, база выгруженная в понедельник будет перезаписана в следующий понедельник, это позволяет экономить место на диске.
Вторая часть скрипта делает выгрузку на ftp-сервер в первый день месяца в формате дата.namebase и эти бэкапы перезаписаны не будут.
В архиве есть файл pgsql-backup-onlyday.sh который выгружает ежедневно базы в формате дата.namebase, эти бэкапы перезаписываться не будут, но в таком случае вам необходимо самому следить за наличием свободного места на диске.
Скрипт можно запустить вручную или по расписанию с помощью cron.
Чтобы скрипт запускался автоматически выполните команду crontab -e, и в открывшемся файле добавьте строку:
0 0 * * * /home/basebackup/pgsql-backup.sh >>/home/basebackup/backup.log 2>&1
Сохраните файл и все готово.
Cron будет запускать скрипт ежедневно в 00:00.(если нужно другое время почитайте параметры настройки cron)
Если вы меняли расположение файлов то укажите путь к файлам вместо выделенного красным.
P.S.: Скрипт не обязательно запускать на сервере с postgres, можно, в принципе, на любом компе(я проверял на виртуалке с linux mint), но, в этом случае, на комп необходимо доустановить пакет "postgresql-client", можно командой "sudo apt-get install postgresql-client", но в таком случае будет ругаться на несовместимость версий, лучше устанавливать "postgresql-client" из deb пакета postgres с сайта 1с.
UPD.
В архив добавил файл pgsql-restore.sh
позволяет восстановить базу из созданных архивов.
Итак:
Первое: из комментариев про бинарный режим:
Второе: Восстанавливает, специально проверил, и на centos (у меня на ней крутится postgres), и на ubuntu server 16.04 и на Linux Mint. Используйте скрипт из архива.
Третье: раз два см это неподъемная сумма для "спецов" из комментариев, пусть будет 1 см.
Четвертое: по поводу строки "date...." если задать через переменную для удобочитаемости, тогда в лог будет писать дата/время одно и тоже, когда была инициализирована переменная, а мне надо было чтобы время было на каждую операцию текущее, для оценки времени работы.
Пятое: из комментариев "у многих клиенты будут глубоко за NAT", зачем запускать такие вещи на клиентах за NAT не совсем понятно. Лучше всего запускайте скрипт cron`ом на самой машние где крутится Postgres.
Ну и на конец: Работа скрипта по восстановлению:
Запустите скрипт. По тем же настройкам (из файла access.setting), что описаны выше, произойдет подключение к ftp и выведется список файлов. Введите имя файла из которого следует восстановить базу.
Затем скрипт спросит создать новую базу или загрузить в старую (введите соответственно "new" или "old").
Если выбрали "old" - появится список баз на сервере.
Введите имя базы в которую необходимо залить бэкап.
Готово.
UPD2.
Благодарю за подсказку насчет "Акела промахнулся", поэтому добавил еще одно подтверждение пользователем загрузки базы.
Также указал явное включение пассивного и бинарного режимов.