Путь юниксоида

Блог посвященный UNIX-подобным операционным системам.

Резервное копирование баз данных PostgreSQL

6 Декабря 2015, 17:07, Вс | Комментарии

Резервное копирование баз данных PostgreSQL

Перед всеми системными администраторами возникает задача резервного копирования баз данных (БД). Поэтому хочу поделится с вами скриптом для резервного копирования БД PostgreSQL. И его довольно просто переделать для любой другой СУБД. Данный скрипт неплохо подойдет новичкам. На нашем форуме есть вариант скрипта для резерного копирования БД MySQL.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/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. Неиспользуемые переменные закомментированы, при желании можно их удалить.

Восстановить дамп можно командой:

1
$ gunzip < /var/backups/psql/archname.sql.gz | psql dbname

Где archname - имя резервной копии (дампа), а dbname - имя существующей БД в PostgreSQL. Если хотите восстановить дамп в новую БД, то создать ее можно командой:

1
$ createdb dbname

Опять же, команду необходимо выполнять от имени postgres.

Теперь осталось настроить время запуска скрипта. В этом нам поможет cron. Мне необходимо чтобы скрипт запускался:
- ежедневно в 22:30, с понедельника по пятницу,
- ежемесячно в 23:30, в первую субботу месяца.

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

1
2
/var/backups/psql/dayli
/var/backups/psql/monthly

С помощью команды crontab:

1
# crontab -e

Добавим в список заданий пару строк в самый конец файла:

1
2
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 - имена файлов со скриптом.

Комментарии