之前的这篇MongoDB的数据备份里面提到了一些基本备份命令。我需要把远程的服务器上的数据备份到本地,以防远程Server挂掉而丢失数据。弄了几次,发现这样手动操作实在是太麻烦了。怎么做到全程自动备份?操作如下:
先写一个dump.sh脚本:
#!/bin/sh
export LC_ALL="en_US.UTF-8"
dbname='jlog-prod'
if [ $# -gt 1 ]; then
$dbname=$1
fi
cd ~/backup/
rm -rf $dbname
mongodump -d $dbname -o .
tarfile=$dbname-`date +%Y%m%d`.tar
tar cf $tarfile $dbname
cd -
这个脚本的会在~/backup目录下生成一个数据库备份的tar包。文件名是dbname-YYYYmmdd.tar,例如jlog-prod-20141125.tar。
然后创建一个backup.sh的脚本,如下
#!/bin/sh
dbname='jlog-prod'
if [ $# -gt 1 ]; then
$dbname=$1
fi
# 把本地脚本在远程执行
ssh user@server "bash -s" -- < ./dump.sh
if [ $? -ne 0 ]; then
exit
fi
tarfile=$dbname-`date +%Y%m%d`.tar
scp user@ser:~/backup/$tarfile .
if [ $? -ne 0 ]; then
exit
fi
tar xf $tarfile
mongorestore -d $dbname --directoryperdb $dbname/
在本地执行bash backup.sh
,就可以实现半自动了。
全自动还差一步,就是周期自动执行上面那行命令就行了,这就要用到linux的cron工具。使用方法可以参考这里。具体做法就是,根据需要把要执行脚本放到/etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly目录中即可。例如,我把备份脚本放到了*/etc/cron.daily*,至此,已经实现每天数据备份的全自动。
事实证明,上面的方法并没有进行自动备份,Google一下cron daily not runing。发现出现这个问题的人还很多。这里有解决答案。有两种可能的原因。一个是权限的问题,一个是路径的问题。我这里看来就是权限问题。
crotab -e # 向当前用户中添加cron任务
sudo crontab -e # 向root用户中添加任务
我的备份脚本应该在我的当前user的用户下运行。所以要crotab -e
,添加一条任务如下:
# 每天7:30备份
30 7 * * * bash /path/to/backup.sh
测试了一下,确信可用。