前不久,我在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给我。