Как говорится существуют админы, которые еще не делают бэкап своих серверов и те, которые уже делают. Так вот я отношусь ко вторым :). Бэкап позволяет в случае падения в кратчайшие сроки восстановить рабочую конфигурацию, и самое главное способствует хорошему сну В этой статье я не буду затрагивать специфичные утилиты бэкапа, а приведу пример рабочего скрипта для архивирования нужный каталогов сервера и отсылки его на FTP-хранилище. Для этого нужно немного знать один из языков (Perl, Python, Bash) и умение пользоваться crontab.
Пример скрипта, написан на Perl, пользуйтесь на здоровье.
#!/usr/bin/perl # # # Copyright (C) 2011 Mihail Belobrov <mihail[dot]belobrov[at]gmail.com> # # Скрипт бэкапа сервера use warnings; use Net::FTP; $date=`/bin/date +%a`; #$date=`/bin/date +%d%m%Y`; chomp($date); $host="10.0.1.223"; $login="Server_AST"; $passwd="VurDFG56fdf43SRE"; $sys_dir="system"; $aster_dir="asterisk"; $mysql_dir="mysql"; $WORKDIR="/opt/backup"; $time=`/bin/date +%d%m%Y_%T`; print '-' x 45; print "\n$time"; print '-' x 45; print "\n"; #name system directory $etc='etc_'.$date.'.tar.gz'; $home='home_'.$date.'.tar.gz'; $root='root_'.$date.'.tar.gz'; $var_www='var_www_'.$date.'.tar.gz'; $var_log='var_log_'.$date.'.tar.gz'; #name asterisk directory $etc_asterisk='etc_asterisk_'.$date.'.tar.gz'; $var_lib_asterisk='var_lib_asterisk_'.$date.'.tar.gz'; $var_spool_asterisk='var_spool_asterisk_'.$date.'.tar.gz'; #Получаем список баз без информацонных open(LINE, "mysql -uroot -pStars35SSS -e \'show databases;\' | grep -v information_schema | grep -v Database |"); #бэкапим while (<LINE>) { chomp(); print "$_ \n"; system("mysqldump -R -uroot -pStars35SSS $_ | gzip -f > $WORKDIR/$_\_$date\.sql\.gz"); } #backup system directory system("tar -czvf $WORKDIR/$etc /etc --exclude \"/etc/asterisk\""); system("tar -czvf $WORKDIR/$root /root"); system("tar -czvf $WORKDIR/$home /home"); system("tar -czvf $WORKDIR/$var_log /var/log"); system("tar -czvf $WORKDIR/$var_www /var/www"); #backup asterisk directory system("tar -czvf $WORKDIR/$etc_asterisk /etc/asterisk"); system("tar -czvf $WORKDIR/$var_lib_asterisk /var/lib/asterisk"); system("tar -czvf $WORKDIR/$var_spool_asterisk /var/spool/asterisk"); #backup crontab root system("/usr/bin/crontab -l > $WORKDIR/$crontab"); sleep(1); #generate md5sum system("/usr/bin/md5sum $WORKDIR/* > $WORKDIR/sum.md5 "); #Connecting to backup FTP sewers $ftp = Net::FTP->new($host, Debug => 1) or die "Cannot connect to $host: $@"; $ftp->login("$login","$passwd") or die "Cannot login ", $ftp->message; $ftp->binary() or die "Cannot call method\n", $ftp->message; #Change directory and put dump $ftp->cwd ("/$mysql_dir") or die "Cannot access to directory\n", $ftp->message; open(LINE, "mysql -uroot -pStars35SSS -e \'show databases;\' | grep -v information_schema | grep -v Database |"); while (<LINE>) { chomp(); print "Send to FTP $_ \n"; $ftp->put("$WORKDIR/$_\_$date\.sql\.gz") or die "Cannot put file\n",$ftp->message; } $ftp->cwd ("/$sys_dir") or die "Cannot access to directory\n", $ftp->message; $ftp->put("$WORKDIR/$etc") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$root") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$home") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$var_log") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$var_www") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$crontab") or die "Cannot put file\n",$ftp->message; $ftp->cwd ("/$aster_dir") or die "Cannot access to directory\n", $ftp->message; $ftp->put("$WORKDIR/$etc_asterisk") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$var_lib_asterisk") or die "Cannot put file\n",$ftp->message; $ftp->put("$WORKDIR/$var_spool_asterisk") or die "Cannot put file\n",$ftp->message; $ftp->quit; #удаляем временные файлы system("rm $WORKDIR/$crontab $WORKDIR/$var_lib_asterisk $WORKDIR/$var_spool_asterisk $WORKDIR/$etc $WORKDIR/$home $WORKDIR/$root $WORKDIR/$var_log $WORKDIR/$var_www $WORKDIR/$etc_asterisk"); #удаляем временные файлы баз open(LINE, "mysql -uroot -pStars35SSS -e \'show databases;\' | grep -v information_schema | grep -v Database |"); while (<LINE>) { chomp(); print "Remove $_ \n"; system("/bin/rm $WORKDIR/$_\_$date\.sql\.gz"); } print '-' x 50; print "\n";
Осталось добавить скрипт в крон
#Make backup 0 5 * * * /usr/bin/perl /root/scripts/ftp_backup.pl > /var/log/ftp_backup.log 2>&1