Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as Bash by Hatifnatt ( 16 years ago )
#!/bin/bash
# Скрипт для ежедневного резервного копирования баз данных
# ===== БЕЗ РОТАЦИИ =====
# Используется pg_dump и сжатие Gzip, сначала локально сбрасывается
# дамп необходимых баз, затем полученный дамп переносится на серврер
# жранения резервных копий, после чего локально стирается.
# При выполнении скрипта проверяется подмонтированн ли необходимы ресурс
# (сетевой диск) и есть ли на нем достаточно места, объем проверяется в
# мегабайтах т.к. используется `df -m`
# === Настройки переменных ===
# Почтовый адрес получателя отчета
[email protected]
# Mailx tricks
# HOSTNAME
# - Используется в поле "Тема"
HOSTNAME=amber
# Точка монтирования
MOUNTPOINT=/mnt/backup
# Минимальный порог свободного места на архивном хранилище,
# объем указан в мегабайтах, значение по умолчанию 10Гб
FREESPACE=10240
# По умолчанию копируются все базы имеющиеся на данном сервере,
# для исключения "лишних" используется исключающий список.
# Файл, содержащий одну маску пропускаемых файлов на строку
# указав в данном файле строку "test" (без кавычек) мы исключим
# все базы которые содержат в имени слово "test"
# для выборки используется `grep -E`
EXCLUDES=/mnt/base/cmd/pg-base-exclude.lst
# Локальный каталог для хранения архивов
# Local folder for backups
LOCALROOT=/mnt/base/backup
# Корневой каталог для резервных копий (на удаленном сервере)
# Path to remote backup storage
ARCHIVEROOT=/mnt/backup/amber
# Время запуска скрипта
FILETIMESTAMP=$(date +%d.%m.%Y-%H.%M.%S)
HUMANTIMESTAMP=$(date '+%d.%m.%Y %H.%M.%S')
# Файл лога, ротацию планируется осуществлять системными средствами
# Log file
LOG=/var/log/pg-everyday.log
# Временный лог файл, используется при отправке почты
# Temporary log, for mail only
TMPLOG=/tmp/pg-everyday-tmp.log
# All local Bases
DB=$(sudo -u postgres psql -l | sed -n 4,/\eof/p | grep -v rows\) | grep -vE 'template[0|1]' | awk {'print $1'})
#Устанавливаем пути и кодировку окружения
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin
export LANG=ru_RU.UTF-8
# Проверка смонтированности раздела, и наличия необходимого места и необходимых папок.
# Check is remote storage mounted, have enought space and all necessary folders.
do_check()
{
local CURRENTSPACE=$(df -m | awk '/mnt\/backup/ {print $3}')
# Убедимся, что диск смонтирован и
# необходимые каталоги существуют.
if [ $(cat /etc/mtab | grep backup | wc -l) -eq 1 ]; then
install -d $ARCHIVEROOT
else
mount $MOUNTPOINT && install -d $ARCHIVEROOT
fi
# Проверим доступноый объем на резервном хранилище
if [ $CURRENTSPACE -lt $FREESPACE ]; then
echo "$HUMANTIMESTAMP ==!== Вниамание на архивном хранилище осталось менее $FREESPACE Мб доступного места" >> $TMPLOG
echo "$HUMANTIMESTAMP ==!== Текущий доступны объем равен $CURRENTSPACE Мб" >> $TMPLOG
return 1
else
echo "$HUMANTIMESTAMP Текущий доступный объем архивного хранилища равен $CURRENTSPACE Мб" >> $TMPLOG
return 0
fi
}
# Выполняем резервное копирование, перемещение резервной копии в
# архивное хранилище, удаление локального файла.
do_backup()
{
# Исключаем базы по паттерну, устанавливаем символ "новой линию" в качестве разделителя
# Exclude bases by pattern, change the internal field separator ($IFS) to only separate on newline
IFS=$'\n'
for N in $(cat $EXCLUDES); do
DB=$(echo "$DB" | grep -v $N)
done
# Сбраcываем значение IFS (internal field separator) на default
unset IFS
unset N
# Выполняем копирование баз данных в файлы
for N in $DB; do
sudo -u postgres pg_dump -b -Fc $N -f $LOCALROOT/$N-$FILETIMESTAMP.pgdump
# Проверяем что в результате выгрузки был получен файл не нулевой длинны
if [ -s $LOCALROOT/$N-$FILETIMESTAMP.pgdump ]; then
echo "$HUMANTIMESTAMP Выгрузка базы $N успешно выполненна в файл $N-$FILETIMESTAMP.pgdump" >> $TMPLOG
else
echo "$HUMANTIMESTAMP Во время выгрузки базы $N произошла ошибка" >> $TMPLOG
fi
done
unset N
# Переносим файлы в резервное хранилище
find $LOCALROOT -type f | while read FILE; do
mv $FILE $ARCHIVEROOT/${FILE##*/}
# Проверяем что файл успешно перемещен, т.е. что он существует и не нулевой длинны
if [ -s $ARCHIVEROOT/${FILE##*/} ]; then
echo "$HUMANTIMESTAMP Файл ${FILE##*/} успешно перемещен в архивное хранилище" >> $TMPLOG
else
echo "$HUMANTIMESTAMP Во время перемещния файла ${FILE##*/} в архивное хранилище произошла ошибка" >> $TMPLOG
fi
done
echo >> $TMPLOG
}
# Информация о процессер резервного копирования, какие базы выгружаются, какие исключаются
# какой объем занимают текущие резервные копии
do_info()
{
# Текущий объем занимаемый резервными копиями
echo "$HUMANTIMESTAMP" >> $TMPLOG
echo "----------- Текущий объем занимаемый резервными копиями ----------" >> $TMPLOG
echo "$(du -sxh $ARCHIVEROOT)" >> $TMPLOG
echo "------------------------------------------------------------------" >> $TMPLOG
echo >> $TMPLOG
# Список имеющихся на сервер баз PostgreSQL
echo "----------- Базы данных PostgreSQL на сервере --------------------" >> $TMPLOG
echo "$DB" >> $TMPLOG
echo "------------------------------------------------------------------" >> $TMPLOG
echo >> $TMPLOG
# Шаблон для исключения баз из резервного копирования
echo "----------- Шаблон исключния баз из резервного копирования -------" >> $TMPLOG
echo "$EXCLUDES" >> $TMPLOG
cat "$EXCLUDES" >> $TMPLOG
echo "------------------------------------------------------------------" >> $TMPLOG
echo >> $TMPLOG
}
do_info
do_check
do_backup
Revise this Paste