服务器里的数据是相当地重要,要是服务器的数据坏了,没有备份那就玩大了。于是老大让做一个服务器数据备份脚本。
我思考了一下备份策略。定时将服务器里的数据打包通过网络存放到另一台服务器上就可以完成这个功能。
备份有3步骤:
(1)收集数据:将服务器里的数据从服务器数据目录复制到指定的目录下。
(2)数据打包:用tar将指定目录下的文件打包压缩。
(3)发送数据:通过网络将压缩文件发送到另一台服务器。
1. 收集数据
将网站数据复制到指定的目录,假设是/var/backup目录下。
BackupPath=/var/backup
cp -r /var/www/zt $BackupPath
2. 压缩数据
FileName=backup-`date +%Y%m%d`.tar.gz
tar czf $TempFile $BackupPath
3. 发送文件
发送文件可以选择ftp发送。也可以自己写一个文件传递协议。
FileName=$1
T=Temp.ftp
echo "user $ftp_user $ftp_passwd" > $T
echo "binary" >> $T
echo "cd /xxx/yyy" >> $T
echo "put $FileName" >> $T
echo "bye" >> $T
ftp -i -n $ftp_ip < $T
rm $T
如何实现定时处理?
我想的最原始的方法就是开一个后台程序:
while true; do
./backup.sh # 备份
sleep period_time # 延时一个周期
done
后来发现有另一个更方便的方法就是crontab
扩展功能:立即备份
有时候,我们对网络里的数据做了大量的修改,如果在定时备份前丢失了,那也就太可惜了。如果有一个立即备份功能,在完成大量修改之后立即备份就OK了。
实现方法很简单,就是开一个后台服务进程,通过网络监听“backup-now”命令,一旦收到命令就执行一次backup。
这是我Shell程序的目录组织结构:
.
|-- backup.sh
|-- collect.d
| |-- collect_review.sh
| `-- collect_zentao.sh
|-- config
|-- send_file.d
| |-- send_file_by_ftp.sh
| `-- send_file_by_netcat.sh
`-- send_file.sh