Welcome, guest! Login / Register - Why register?
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

Your Name: Code Language: