Страница 1 из 1

Простой и эффективный - Backup -

Добавлено: 2007-08-27 14:54:30
Neteru
Я думаю многие встречались с проблемой восстановления данных. Многие начинали рыскать по Интернету в поисках чего то просто и понятного и я не исключение. И вот кое что получилось найти я его совсем чуточку подправил, больше для своих нужд, чем для Вас =), но это не как не сказалось на его работоспособности.

Делает полный (full backup) архив раз в неделю и периодические каждый день, потом затирает старые и пишет на них новые.
Каждый архив заливается на ftp.

Код: Выделить всё


#! /bin/sh
# скрипт полного и добавочного резервного копирования
# создан 07 февраля 2000
# Базируется на скрипте Daniel O'Callaghan <danny@freebsd.org>
# и модифицирован Gerhard Mourani <gmourani@videotron.ca>
# и еще под модифицирован Igor Znamensky <5000700@mail.ru>
# Измените следующие пять переменных под вашу систему

COMPUTER=`hostname`                       # имя этого компьютера

DIRECTORIES_1="/usr/local/etc"            # каталог резервного копирования
DIRECTORIES_2="/var/db/"                  # каталог резервного копирования

BACKUPDIR_1=/files/backups/1              # где храним резервные копии
BACKUPDIR_2=/files/backups/2              # где храним резервные копии

TIMEDIR=/files/backups/last-full          # где сохраняем время полной резервной копии

TAR=/usr/bin/tar                                # имя и расположение tar

#Вы не должны менять то, что написано ниже
#Но, если Вы уверенны в своих силах, то можно!

PATH=/usr/local/bin:/usr/bin:/bin
DOW=`date +%a`                      # День недели, например Mon
DOM=`date +%d`                      # Дата, например 27
DM=`date +%d%b`                     # Дата и месяц, например 27Sep

# 1-го числа каждого месяца постоянно делаем полную резервную копию
# Каждое воскресенье делаем полную копию - переписываем копию от
# последнего воскресенья
# В остальное время делаем добавочную резервную копию. Каждая добавочная
# резервная копия переписывает добавочную копию с предыдущей недели, с
# тем же именем.
#
# если NEWER = "", тогда tar создает резервные копии всех файлов в каталог,
# иначе только новее чем дата в NEWER. NEWER берет дату из файла
# записываемого каждое воскресенье.
# Ежемесячная полная резервная копия

################################
#Первый архив на основную папку#
################################

if [ $DOM = "01" ]; then
  NEWER=""
    $TAR $NEWER -cf $BACKUPDIR_1/$COMPUTER-$DM.tar $DIRECTORIES_1
    fi
    
# Еженедельная полная резервная копия
    if [ $DOW = "Sun" ]; then
      NEWER=""
      NOW=`date +%d-%b`
	
# Обновление даты еженедельной полной резервной копии
      echo $NOW > $TIMEDIR/$COMPUTER-full-date
      $TAR $NEWER -cf $BACKUPDIR_1/$COMPUTER-$DOW-1.tar $DIRECTORIES_1
	      
# Создание добавочной резервной копии - переписывание аналогичной с
# последней недели
      else
		  
# Берем дату последней полной резервной копии
		      NEWER="--newer `cat $TIMEDIR/$COMPUTER-full-date`"
		        $TAR $NEWER -cf $BACKUPDIR_1/$COMPUTER-$DOW-1.tar $DIRECTORIES_1
			fi
			
# Маленькая утилита которая заливает созданные архивы на FTP; для ее установки наберите pkg_add –r ncftp
# У меня по мимо локальной папки куда все это складывается еще заливается на спецовый ftp для архивов.
      ncftpput -u TEST -p TEST 192.168.0.50 /upload/backups/1 /files/backups/1/$COMPUTER-$DOW-1.tar
			
##############################			
#Второй архив на другую папку#
##############################			

if [ $DOM = "01" ]; then
      NEWER=""
      $TAR $NEWER -cf $BACKUPDIR_2/$COMPUTER-$DM-2.tar $DIRECTORIES_2
      fi
    
# Еженедельная полная резервная копия
    if [ $DOW = "Sun" ]; then
      NEWER=""
      NOW=`date +%d-%b`
	
# Обновление даты еженедельной полной резервной копии
      echo $NOW > $TIMEDIR/$COMPUTER-full-date
      $TAR $NEWER -cf $BACKUPDIR_2/$COMPUTER-$DOW-2.tar $DIRECTORIES_2
	      
# Создание добавочной резервной копии - переписывание аналогичной с
# последней недели
      else
		  
# Берем дату последней полной резервной копии
	NEWER="--newer `cat $TIMEDIR/$COMPUTER-full-date`"
	$TAR $NEWER -cf $BACKUPDIR_2/$COMPUTER-$DOW-2.tar $DIRECTORIES_2
	fi
			
# Маленькая утилита которая заливает созданные архивы на FTP; для ее установки наберите pkg_add –r ncftp
# У меня по мимо локальной папки куда все это складывается еще заливается на спецовый ftp для архивов.
      ncftpput -u TEST -p TEST 192.168.0.50 /upload/backups/1 /files/backups/2/$COMPUTER-$DOW-2.tar


Сразу хочу сказать, что это не мое творчество я просто его показываю тут чутка видоизмененным и все!
Оригинал http://www.opennet.ru/docs/RUS/linuxsos/ch22_1.html


Кстати, если начальство сочтет возможным разместить это пост как скромную статейку, буду очень признателен! ;)

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 9:57:08
Alex Keda
думаю - у всех по пачке таких скриптов :)
однако - мож кому и полезно будет, хотя я предпочитаю писать сам.

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 12:14:41
Neteru
ну тогда, пусть висит тут, а кому надо найдут! :)

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 12:52:51
Daywalker
Да, да оставьте. Не все же гуру, некоторым на примерах надо учиться :wink:

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 14:39:42
Pattern
Лис прав, у многих таких скриптов - вагон и маленькая тележка. И тем не менее решил поделиться своим творением. Особой оригинальностью он не светит, где то даже вижны топора и рубанка, но работает исправно. Однако основное отличие от скрипта выше в том, что акцент, на который был поставлен бэкап - это был срез дампа MySQL таблиц. Да, знаю, что лучше бэкапить физические файлы и потом их просто заменять. Однако не всегда такие случаи помогают. В общем кому интересно - вот листинг:

Код: Выделить всё

#!/bin/sh

#################### НАЧАЛО НАЙСТРОЕК ####################
#Формирование даты
date_time=`date +"%Y-%m-%d"`

#Путь к mysqldump
exec_mdump='/usr/local/bin/mysqldump'
#Путь к tar
exec_tar='/usr/bin/tar'
#Путь к FTP
exec_ftp='/usr/local/bin/lftp'

#Логин к MySQL
m_login='login2'
#Пароль к MySQL
m_passwd='passwd2'

#Директория временного хранения бэкапов
backup_path='/opt/backup'
#Директория текущего бэкапа
to_cat=${backup_path}/${date_time}
#Имя конечного бэкап-файла
backup_file=backup_${date_time}.tar.gz

#Имя или IP удалённого хоста, на который будет сбрасываться бэкап
rem_host='192.168.0.1'
#папка бэкапа на удалённом хосте
rem_backup='backup'

#Список баз данных для дампа
db_names='base1
base2
base3'

#Список 1 разделённых директорий
cats1='dir1
dir2
dir3'

#Список 1 разделённых директорий
cats2='dir4
dir5
dir6'
#################### КОНЕЦ НАЙСТРОЕК ####################

echo `date +"Start in %Y-%m-%d %H:%M:%S"`

#Создаём директорию для хранения бэкапа
mkdir -p ${to_cat}

#Перебираем список баз для дампа
#Опции так же можно вынести в качестве настраиваемых данных
#Однако здесь я их представил "AS IS"
#Так же на лету модифицируется дамп:
#- на проверку уже существующих баз
#- заменяется INSERT на REPLACE
#Полсе чего архивируем дамп и удаляем исходник
for a in $db_names
do
	echo "Dumping ${a}"
	${exec_mdump} --user=${m_login} --password=${m_passwd} --default-character-set=cp1251 \
	-acnqQ --add-drop-table=FALSE --no-create-db=TRUE --databases ${a} \
	| sed "s#^CREATE TABLE#CREATE TABLE IF NOT EXISTS# ; s#^INSERT INTO#REPLACE INTO#" \
	> ${to_cat}/${a}_${date_time}.sql
	${exec_tar} -czf ${to_cat}/${a}_${date_time}.tar.gz ${to_cat}/${a}_${date_time}.sql
	rm ${to_cat}/${a}_${date_time}.sql
done

#Перебираем разделённый список директорий 1
for b in $cats1
do
	echo "Packing ${b}"
	${exec_tar} -czf ${to_cat}/${b}_${date_time}.tar.gz ${b}/*
done

#Перебираем разделённый список директорий 2
for c in $cats2
do
	echo "Packing ${c}"
	${exec_tar} -czf ${to_cat}/${c}_${date_time}.tar.gz ${c}/*
done

#Упаковываем всё в единый архив и удаляем временные файлы
echo "Packing ${backup_file}";
${exec_tar} -czf ${backup_path}/${backup_file} ${to_cat}/*
rm ${to_cat}/*
rmdir ${to_cat}

#Отправляем все данные на FTP и удаляем архив
echo "Send file ${backup_file} into ${rem_host}"
cd ${backup_path}/
${exec_ftp} -u 'ftp_login,ftp_passwd' -e "cd ${rem_backup};put ${backup_file};by" ${rem_host}
rm ${backup_path}/${backup_file}

echo `date +"End in %Y-%m-%d %H:%M:%S"`
echo "================================================================================"
Всё это безобразие запускается по крону 1 раз в сутки с записью эх в лог файл. Чаще нельзя - слишком большая нагрузка на серваке, реже - слишком "большой" откат при восстанволении

Код: Выделить всё

15      3       *       *       *       /opt/backup/backup.sh >> /opt/backup/backup.log
Так же на удалённом хосте на случай, если вдруг кто то забыл скачать бэкапы и/или удалить их после скачивания, так же по крону запускается скрипт зачистки

Код: Выделить всё

#!/bin/sh

/usr/bin/find /usr/home/backup/backup/ -type f -not -mtime -7d -delete
Выполнять его рекомендуется перед выполнением и отсылкой бекапа на основном сервере. Так же, если бэкапы слишком большого размера, глубину хранения бэкапов можно уменьшить например до 3 дней (-3d).
Вот в принципе и всё.

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 14:43:04
Alex Keda
для одного хостинга писал.
грубо правда - но соёдт.

Код: Выделить всё

#!/bin/sh -xv

# write begin by lissyara 2007-07-23 in 22:11 MSK

# tmp - before delete DA archive
#rm /home/denis/user_backups/*



# variables section
backup_dir="/backup/`date +%Y-%m-%d`"
tmp_dir="${backup_dir}/tmp"
cat="/bin/cat"
grep="/usr/bin/grep"
cut="/usr/bin/cut"
bzip2="/usr/bin/bzip2"
mkdir="/bin/mkdir"
tar="/usr/bin/tar"
mv="/bin/mv"
dirname="/usr/bin/dirname"
basename="/usr/bin/basename"
tr="/usr/bin/tr"
chmod="/bin/chmod"
mysql="/usr/local/bin/mysql"
mysqldump="/usr/local/bin/mysqldump"
df="/bin/df"
tail="/usr/bin/tail"
awk="/usr/bin/awk"
head="/usr/bin/head"
tr="/usr/bin/tr"


mysql_user="`${cat} /usr/local/directadmin/conf/mysql.conf              \
                | ${grep} user | ${cut} -d= -f2`"
mysql_pass="`${cat} /usr/local/directadmin/conf/mysql.conf              \
                | ${grep} passwd | ${cut} -d= -f2`"
system_backup_dir="/etc /usr/local/etc /usr/local/directadmin"


# added by lissyara 2007-08-05 in 01:29 MSK
# calculate space
free_space="`${df} -h /backup/ | ${tail} -1 | ${awk} '{print $4}' |     \
                ${head} -1 | ${tr} -d '[A-Z][a-z]'`"
if [ ${free_space} -le 20 ]
then
        # rm old_archives date -v-1d +%Y-%m-%d
        i=30
        while test $i != 5
        do
        /bin/rm -Rf /backup/`date -v-${i}d +%Y-%m-%d`
        i="`/bin/expr $i - 1`"
        done
fi


# go to tmp dir
${mkdir} -p ${tmp_dir}
${chmod} -R 770 ${backup_dir}
cd ${tmp_dir}

# dumping all databases separately
${mysql} --user=${mysql_user} --password=${mysql_pass}                  \
        --skip-column-names --execute="SHOW DATABASES" |
{
        # reading database name
        while read database_name
        do
        ${mysqldump} --user=${mysql_user} --password=${mysql_pass}      \
                        --quick --complete-insert --databases           \
                        ${database_name} | ${bzip2} >                   \
                        ${database_name}.sql.bz2
        # sync disks
        sync
        done
}

# reading and backuping users data
cd /home/
ls | grep -v -E "mysql|quota." |
{
        # reading user name
        while read user_name
        do
        # mkdir user_name
        ${mkdir} -p ${backup_dir}/${user_name}
        # archiving data
        ${tar} --create --file=- ${user_name} | ${bzip2} >              \
                ${backup_dir}/${user_name}/home.tar.bz2
        # sync disks
        sync
        # mv database archive
        ${mv} ${tmp_dir}/${user_name}_* ${backup_dir}/${user_name}/
        # sync disks
        sync
        done
}

# archiving system settings
${mkdir} ${backup_dir}/system_backup/
# archiving system
for sys_dir_pathname in ${system_backup_dir}
do
        # go to base dir
        cd `${dirname} ${sys_dir_pathname}`
        # archive dir
        ${tar} --create --file=- `${basename} ${sys_dir_pathname}` |    \
                ${bzip2} > ${backup_dir}/system_backup/bkp`echo         \
                ${sys_dir_pathname} | ${tr} "/" "_"`.tar.bz2
        # sync disks
        sync
done

# mv databases not match with username - system databases.
cd ${tmp_dir}
${mv} * ${backup_dir}/system_backup/
/bin/rmdir ${tmp_dir}

# sync disks
sync

exit 0;
# end writting script by lissyara 2007-07-23 in 23:28

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 20:53:09
Neteru
Ооо! Какой неожиданный поворот!
Ну ка! Давайте выкладывайте свои "пачки скриптов", а то ...
У кого еще чего есть интересного :wink:

Кстати, можно даже открыть целый раздел, например "АВТОМАТИЗАЦИЯ", где будет подборка всевозможных скриптов.

Re: Простой и эффективный - Backup -

Добавлено: 2007-08-31 22:11:59
dikens3

Re: Простой и эффективный - Backup -

Добавлено: 2007-09-03 16:57:03
OlegMS
вы тут backup обсуждаете или скриптами мереетесь? :)
если первое, то весьма неплох sysutils/fsbackup, рекомендую к рассмотрению. Если второе, то я в сторонке посижу...

Re: Простой и эффективный - Backup -

Добавлено: 2007-09-03 18:10:35
Alex Keda
OlegMS писал(а):вы тут backup обсуждаете или скриптами мереетесь? :)
если первое, то весьма неплох sysutils/fsbackup, рекомендую к рассмотрению. Если второе, то я в сторонке посижу...
статеку накатай.
оценим :))

Re: Простой и эффективный - Backup -

Добавлено: 2007-09-04 8:44:52
Neteru
OlegMS писал(а):
вы тут backup обсуждаете или скриптами мереетесь?
если первое, то весьма неплох sysutils/fsbackup, рекомендую к рассмотрению. Если второе, то я в сторонке посижу...
Вот я как раз хотел тоже самое сказать!
Ты статью, в ней покажи весь функционал рекомендуемого продукта!
Что бы прочитал и без колибаний решительно все поставил!
Вот тогда.... :D
------------
Давай... ждем хорошо написанную статью от тебя! :wink:

Re: Простой и эффективный - Backup -

Добавлено: 2007-09-04 9:16:09
OlegMS
вот пристали :) Опыт работы с ней на статью не тянет. У меня только конфиги бэкапятся локально, хотя заявлена поддержка баз, удаленных бэкапов, шифрации. Смотреть на сайте - http://www.opennet.ru/dev/fsbackup/