一个稍复杂的FreeBSD文件备份方案
公司曾有一台基于FreeBSD的邮件服务器,上边保存着上百G的邮件数据文件.为了保护公司重要数据的安全,也曾咨询过邮件服务系统供应商,结果对方也拿不出更好的解决方案.他们提供的方案价格贵不说使用也比较麻烦.
只好自己研究了.
首先我们咨询过供应商方面,我们的邮件系统主要是由数据文件和MySQL数据库两部分组成,所以我们只需要分别对这两个部分进行备份就可以了.
我们在局域网内的域上有一台基于Windows Server的文件服务器,它连接着一台TS3100的磁带库.
我的备份方案是:
1) 邮件系统数据量庞大且重要,我们不可能在较短的周期内进行频繁备份,初步定为每个月的第一个和第三个星期的星期六晚上11点半开始从邮件服务器(基于FreeBSD)往文件服务器(基于Windows Server)备份,然后每个月的第二个和第三个星期的星期六晚上开始从文件服务器上往磁带库上进行备份.
2) 邮件系统中的邮件数据是以用户名为目录存储,我们要做到以每个用户名命名压缩数据文件进行备份.
OK,有了需求,现在开始动手.
首先在邮件服务器上边设置mount_smbfs的免密码访问windows下的文件服务器,具体方法参见:http://www.barhe.org/blog/archives/111
然后是在邮件服务器上边写SH脚本,用来备份本地文件数据和MySQL数据库数据.代码如下:
#!/usr/local/bin/bash # 获取当前星期信息 current_week="$(/bin/date +%w)" # 如果是星期6的话,就执行备份命令 if [ "$current_week" -eq 6 ]; then # 做一个日志记录,以记录备份时长 /bin/date "+%Y-%m-%d %H:%M:%S - Start mail data backup." >> /usr/local/mail_backup/mail_backup.log # mount file server backup share folder # 192.168.1.1为文件服务器IP /usr/sbin/mount_smbfs -N -I 192.168.1.1 //data_backup@file-server/Backup /mnt/backup # 备份MySQL的数据 t_mysql_dir="/mnt/backup/MySQL" # 其中MYSQLUSERNAME是备份连接的数据库用户名,这里边需要注意的是,这个用户需要有这个数据库中的select和lock tables权限. # maildb是需要备份的mysql数据库名称. /usr/local/bin/mysqldump --opt -uMYSQLUSERNAME -pPASSWORD maildb >$t_mysql_dir/maildb_$(date +%Y%m%d%H%M%S).bak # 接上文件服务器之后,设置备份目标目录,在备份之前,把之前备份过的数据清空 t_dir="/mnt/backup/Mail/Tape" rm $t_dir/*.tar.gz # 获取需要备份文件夹列表 s_dir="/maildata/default/user" dirList=`/bin/ls -p $s_dir | grep / | tr -d /` # 从列表文件中调用备份路径进行打包备份,目标是文件服务器 for dir in $dirList do /usr/bin/tar -cvzf $t_dir/$dir.tar.gz $s_dir/$dir/ done # 备份完之后umount /sbin/umount /mnt/backup /bin/date "+%Y-%m-%d %H:%M:%S - Mail data backup has completed." >> /usr/local/mail_backup/mail_backup.log fi
上边的命令可以做到备份每个月星期6的数据,但考虑到我只需要每个月的第一个和第二个星期6,这样就不得不用一个变通的方法来进行,如下:
在FreeBSD的crontab中加入一个执行命令,如下:
crontab -l
得到内容如下:
30 23 1-7,15-21 * * /usr/local/mail_backup/mail_backup.sh
因为每个星期的第一个星期6和每二个星期6肯定会在每个月的1-7及15-21期间,所以我们用这个命令可以妥善的解决这个问题!
然后在文件服务器,我们就可以看到定时会有更新的备份数据了.
至于从文件服务器上边往磁带库上边的备份,就很简单的,安装一个Symantec Backup Exec就解决问题了.