前不久,我在CentOS 5服务器上成功配置了GForge 5.7 Community Edition,与其Advance Server版相比,功能简单很多,但足够满足我公司现阶段业务需要。CE版不具备自动备份功能,这给服务器维护带来了极大的不便。因此,我编写了以下脚本,用于进行自动备份。
#!/bin/sh
# GForge Community Edition 自动完全备份脚本
# 作者Xu Cheng,如有改进,请将副本发送一份给我。
# xc@virtualdell.com
#CREATE BACKUP DIRECTRY
bkdir=$HOME'/Backup'
if [ ! -d "$bkdir" ]
then
mkdir "$bkdir"
echo "Backup Beginning..."
else
echo ${bkdir}' existed, please remove it!'
exit 0
fi
#BACKUP POSTGRESQL
bkpgsql=${bkdir}/PostgreSql_backup.dump
pg_dump -Upostgres [请用GForge数据库名] > ${bkpgsql}
if [ -f "${bkpgsql}" ]
then
echo 'PostgreSql Backup Finished...'
else
echo 'PostgreSql Backup Failed!'
exit 0
fi
#BACKUP MAILMAN
tar -czvPf MailMan_backup.tar.gz /var/lib/mailman
mv MailMan_backup.tar.gz ${bkdir}
if [ -f "${bkdir}/MailMan_backup.tar.gz" ]
then
echo 'MailMan Backup Finished...'
else
echo 'MailMan Backup Failed!'
exit 0
fi
#BACKUP SUBVERSION
bakdate=$(date +%Y%m%d%H%M)
svnrepos="/svnroot"
cd $svnrepos
if [ -d "$bkdir" ] && [ -w "$bkdir" ] ; then
# Now $repo has folder names = project names
for repo in *; do
# do svn dump for each project
echo "Taking backup/svndump for: $repo"
echo "Executing : svnadmin dump $repo > $bakdest/$repo-$bakdate.svn.dump /n"
# Now finally execute the backup
svnadmin dump $repo > $bkdir/$repo-$bakdate.svn.dump
done
else
echo "Unable to continue SVN backup process!"
echo "$bkdir is *NOT* a directory or you do not have write permission!"
fi
tar -czvPf backup_${bakdate}.tar.gz ${bkdir}
mv backup_${bakdate}.tar.gz $HOME
rm -rf ${bkdir}
送佛送到西,我对代码进行简要的讲解。GForge需要备份的内容包括PostgreSQL数据库、MailMan电子邮件、SubVersion仓库。脚本中,首先使用pg_dump -Upostgres命令进行PostgreSQL数据库备份。然后,再备份MailMan整个文件夹。最后也是最复杂的,是备份SVN仓库。默认的路径为/svnroot,该目录不能用常规命令进行复制或压缩,必须使用svnadmin dump命令单独为每个项目进行备份。因此,我在脚本中使用遍历/svnroot的方式,依次备份各个项目。
备份完毕后,生成的备份文件将放至用户的主目录下,文件名为backup_[备份时的日期时间].tar.gz。为了方便使用,可编辑crontab按时自动执行。
欢迎大家对此脚本进行改进,请将改进后的副本Email给我。