Ротация архивов

Shell сценарий в разделе Сценарии Shell позволяет создавать только 7 различных архивов. Для сервера, данные на котором меняются нечасто, этого может быть достаточно. Если же сервер содержит большой объем данных, требуется использовать более комплексную схему ротации архивов.

Ротация NFS архивов

В этой секции наш shell сценарий будет немного модифицирован с целью осуществления схемы ротации 'дед-отец-сын' (ежемесячно-еженедельно-ежедневно):

  1. ротация будет выполнять ежедневное резервное копирование с воскресенья по пятницу.

  2. в субботу будет еженедельное копирование, обеспечивая четыре недельных архива в месяц.

  3. ежемесячное копирование выполняется в первый день месяца, обеспечивая ротацию двух ежемесячных архивов, на основе четности месяца.

Здесь приведен сценарий:

#!/bin/bash
####################################
#
# Backup to NFS mount script with
# grandfather-father-son rotation.
#
####################################

# What to backup. 
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Where to backup to.
dest="/mnt/backup"

# Setup variables for the archive filename.
day=$(date +%A)
hostname=$(hostname -s)

# Find which week of the month 1-4 it is.
day_num=$(date +%d)
if (( $day_num <= 7 )); then
        week_file="$hostname-week1.tgz"
elif (( $day_num > 7 && $day_num <= 14 )); then
        week_file="$hostname-week2.tgz"
elif (( $day_num > 14 && $day_num <= 21 )); then
        week_file="$hostname-week3.tgz"
elif (( $day_num > 21 && $day_num < 32 )); then
        week_file="$hostname-week4.tgz"
fi

# Find if the Month is odd or even.
month_num=$(date +%m)
month=$(expr $month_num % 2)
if [ $month -eq 0 ]; then
        month_file="$hostname-month2.tgz"
else
        month_file="$hostname-month1.tgz"
fi

# Create archive filename.
if [ $day_num == 1 ]; then
	archive_file=$month_file
elif [ $day != "Saturday" ]; then
        archive_file="$hostname-$day.tgz"
else 
	archive_file=$week_file
fi

# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backup_files

# Print end status message.
echo
echo "Backup finished"
date

# Long listing of files in $dest to check file sizes.
ls -lh $dest/

Сценарий может запускаться так же, как описано в секции Выполнение сценария.

Хорошей практикой является выделять для резервного копирования удаленный носитель на случай физического уничтожения сервера. В примере shell сценария носителем для резервной копии является NFS ресурс на другом сервере. По всей вероятности нахождение NFS сервера в другом месте не является практикой. В зависимости от скорости связи это может быть копирование архивного файла через соединение по внешней сети на сервер на другой территории.

Другим вариантом может быть копирование архивного файла на внешний жесткий диск, который может отключаться и храниться отдельно. Поскольку цены на внешние диски продолжают снижаться, использование пары дисков для каждого уровня архивов может оказаться эффективным вариантом с точки зрения стоимости. Это позволит вам подключать один диск к серверу резервного копирования, а второй хранить отдельно.

Устройства на магнитной ленте

Устройство на магнитной ленте, подключенное к серверу, может использоваться вместо ресурса NFS. Использование ленточного устройства упрощает ротацию архивов, а также решает проблему отделение носителя от сервера.

При использовании ленточного устройства часть сценария, касающаяся имени файла, становится ненужной, поскольку данные посылаются непосредственно на устройство. Однако требуются некоторые команды для управления лентой. Это достигается использованием утилиты управления магнитной лентой mt, являющейся частью пакета cpio.

Здесь приведен сценарий, измененный для использования с ленточным устройством:

#!/bin/bash
####################################
#
# Backup to tape drive script.
#
####################################

# What to backup. 
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Where to backup to.
dest="/dev/st0"

# Print start status message.
echo "Backing up $backup_files to $dest"
date
echo

# Make sure the tape is rewound.
mt -f $dest rewind

# Backup the files using tar.
tar czf $dest $backup_files

# Rewind and eject the tape.
mt -f $dest rewoffl

# Print end status message.
echo
echo "Backup finished"
date
По умолчанию именем ленточного SCSI устройства является /dev/st0. Используйте подходящий путь к устройству для вашей системы.

Восстановление с ленточного устройства в основном такое же, как и из файла. Просто перемотайте ленту и используйте путь к устройству вместо пути к файлу. Например, для восстановления файла /etc/hosts в /tmp/etc/hosts используйте следующее:

mt -f /dev/st0 rewind
tar -xzf /dev/st0 -C /tmp etc/hosts