不知道公司租了个什么破写字楼,隔三差五的跳闸、停电。想想内部PC服务器也没有个UPS扛一下,真是捏把汗,万一硬盘坏了,平时又没有做备份,项目代码可就找不到了。因此就想到写一个脚本,定期的备份SVN库。我的备份策略是:
- 每天进行一次增量备份。
- 每周进行一次全备份。
- 备份的文件复制到另一台服务器上。
因为服务器采用的是ubuntu系统,所以实现起来也比较顺利。linux中的cron搞定定时功能,而svn支持增量备份和全备份,使用scp复制文件到另外一个ubuntu服务器。由于scp复制过程中需要输入密码,就使用了expect脚本。
weekly-full-backup.sh脚本如下:
#!/bin/sh
#
# Perform a weekly backup of a subversion repository,
# logging the most-recently-backed-up revision so an
# incremental script can be run other days.svn_repos="your svn repos";
backups_dir="your backup dir";
next_backup_file="xxx-weekly-full-backup.$(date +%Y%m%d)"
last_backed_rev="last_backed_rev"youngest=$(svnlook youngest $svn_repos);
echo "Backing up to revision $youngest"
svnadmin dump $svn_repos > $backups_dir/$next_backup_fileecho "Compressing dump file …"
gzip -9 $backups_dir/$next_backup_file
echo $youngest > $backups_dir/$last_backed_revecho "$next_backup_file rev 0 ~ $youngest" >> ${backups_dir}/readme
$backups_dir/cp-another-server.sh $backups_dir ${next_backup_file}.gz
daily-backup.sh脚本如下:
#!/bin/bash
#
# Perform a daily backup of a subversion repository,
# using the previous most-recently-backed-up revision
# to create just an incremental dump.svn_repos="your svn repos"
backups_dir="your backup dir"
next_backup_file="xxx-daily-incremental-backup.$(date +%Y%m%d)"
last_backed_rev="last_backed_rev"read previous_youngest < $backups_dir/$last_backed_rev
youngest=$(svnlook youngest $svn_repos)
if [ $youngest -eq $previous_youngest ]
then
echo "No new revision to backup"
exit
fi# We need to backup from the last backed up revision
# to the lastest(youngest) revision in the repository
let first_rev=previous_youngest+1
last_rev=$youngestecho "Backing up revision $first_rev to $last_rev …"
svnadmin dump -incremental -revision $first_rev:$last_rev $svn_repos > $backups_dir/$next_backup_file
echo "Compressing dump file …"
gzip -9 $backups_dir/$next_backup_fileecho $last_rev >$backups_dir/$last_backed_rev
echo "$next_backup_file rev $first_rev ~ $last_rev" >> $backups_dir/readme
$backups_dir/cp-another-server.sh $backups_dir ${next_backup_file}.gz
cp-another-server.sh脚本如下:
#!/usr/bin/expect
if {$argc<2} {
send_user "usage: $argv0 backup_dir filenamen"
exit
}set backup_dir [lindex $argv 0]
set backup_filename [lindex $argv 1]
send_user "execute:$argv0 $backup_dir $backup_filenamen"spawn scp $backup_dir/$backup_filename [email protected]:/home/alexz/svn-backup/$backup_filename
expect {
"*password*" {send "alexz123n"}
}expect eof
exit
请注意,脚本中涉及到项目名、路径名的,都进行了替换。