Перед всеми системными администраторами возникает задача резервного копирования баз данных (БД). Поэтому хочу поделится с вами скриптом для резервного копирования БД PostgreSQL. И его довольно просто переделать для любой другой СУБД. Данный скрипт неплохо подойдет новичкам. На нашем форуме есть вариант скрипта для резерного копирования БД MySQL.
1234567891011121314151617181920212223242526272829
#!/bin/bash
HOST="hostname" # Имя хоста на котором будем выполнять скрипт, можно и не использовать
DUMPER="/usr/bin/pg_dump" # Указываем утилиту резервного копирования (дампа).
#DUMPPARAM1="-Q -c -e" # -Q оборачивает имена обратными кавычками,
# -c делает полную вставку, включая имена колонок,
# -e делает расширенную вставку.
# Итоговый файл получается меньше и создается он чуть быстрее.
#DBUSER="dbuser" # Внутренний пользователь сервера БД от имени которого будет выполнятся бэкап
#DBPASS="passwd" # Пароль внутреннего пользователя mysql
DBNAME="dbname" # Имя БД с которой будет создана резервная копия
DATE=`date +%F_%H.%M` # Задаем дату и время бекапа
FIND="/usr/bin/find" # Указываем утилиту для поиска
FINDPARAM1="-type f -ctime +7" # Где +7 - архивы старше семи дней
FINDPARAM2="-delete" # Параметры удаления
BACKUPDIR="/var/backups/psql/" # Директория, где будут хранится резервные копии
# Дамп БД, где DBUSER - имя пользователя, DBNAME - имя базы данных, архив имеет следующий формат.
# Имя базы данных, имя хоста, дата и время, расширение gz: $DBNAME-2016-02-29_14.30.sql.gz
$DUMPER $DBNAME | gzip > $BACKUPDIR$DBNAME.$HOST-$DATE.sql.gz
# Пауза
sleep 3
# Удаляем старые архивы, а точней файлы старше 7 дней, так же удаляем пустые каталоги.
eval $FIND $BACKUPDIR $FINDPARAM1 $FINDPARAM2
exit 0
Хочу напомнить, что данный скрипт нужно выполнять от имени пользователя postgres. Неиспользуемые переменные закомментированы, при желании можно их удалить.
Где archname - имя резервной копии (дампа), а dbname - имя существующей БД в PostgreSQL. Если хотите восстановить дамп в новую БД, то создать ее можно командой:
1
$ createdb dbname
Опять же, команду необходимо выполнять от имени postgres.
Теперь осталось настроить время запуска скрипта. В этом нам поможет cron. Мне необходимо чтобы скрипт запускался:
- ежедневно в 22:30, с понедельника по пятницу,
- ежемесячно в 23:30, в первую субботу месяца.
Кроме того, ежедневные и ежемесячные копии должны хранится отдельно. Соответственно нам потребуются две копии скрипта, в каждной укажем необходимый путь для резерных копий:
12
/var/backups/psql/dayli
/var/backups/psql/monthly
С помощью команды crontab:
1
# crontab -e
Добавим в список заданий пару строк в самый конец файла:
12
30 22 * * 1-5 postgres /path/psql_dayli-backup.sh # Ежедневно, с пн. по пт.
30 23 1-7 * [ "$(date '+\%u')" -eq 6 ] && /path/psql_monthly-backup.sh postgres # Ежемесячно, в первую сб.
Где postgres - пользователь, от имени которого будет запускаться скрипт, path - путь до каталога со скриптами, а psql_dayli-backup.sh и psql_monthly-backup.sh - имена файлов со скриптом.