пятница, 15 июля 2016 г.

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

Для того, чтобы сделать «элементарный» backup в postgresql нужно выполнить несколько команд. Итак, приступим :)
Залогинимся под пользователем postgres

$ su - postgres

Посмотрим список баз данных

$ psql -l

Воспользуемся pg_dump — стандартной утилитой для создания резервных копий postgresql. Она имеет достаточно простой синтаксис

$ pg_dump databasename > outputfile

Например для базы данных databasename, это будет выглядеть так

$ pg_dump databasename > databasename.dump.out

Для того, чтобы dump занимал меньше места на диске, его лучше сжать.

$ pg_dump databasename | gzip -c > databasename.dump.out.gz

Для восстановления (restore) достаточно выполнить.

$ psql -d databasename -f databasename.dump.out

Есть еще весьма полезная команда, которая создает dump всех баз данных и помещает их в один файл.

$ pg_dumpall > all.dbs.out

Или же с компрессией на лету.

$ pg_dumpall | gzip -c > all.dbs.out.gz

Можно это оформить в виде простенького скриптика для автоматизации процесса резервного копирования.

#!/bin/bash
#расположение директории с dump'ами
DIR="/backups/postgres"
mkdir -p $DIR
#путь к log файлу
LOG="/var/log/postgres_log.log"
touch $LOG
TIMENAME=`date +%d.%m.%Y-%H.%M`
db=`psql -l | sed -n 4,/\eof/p | grep -v rows\) | grep -vE 'template[0|1]' | awk {'print $1'}`
for n in $db; do
        TIMEDUMP=`date '+%T %x'`
        echo "backup and vacuum has been done at $TIMEDUMP : $TIMENAME on db: $n" >> $LOG
        vacuumdb -z $n >/dev/null 2>&1
        pg_dump $n | gzip -c > "$DIR/psql-$n-$TIMENAME-db.dump.gz"
done

Ну и желательно добавить это в cron для выполнения бэкапа postgresql с определенной переодичностью.

/path/backup_script > /dev/null 2>&1

Найдено на просторах интернета.