业务背景:

​ 客户ERP生产系统安排了数据库定时备份计划,每周五一次全备,每天一次增量备份;数据存储于本机/backup目录,此生产机半年内出现过两次宕机,一次磁盘阵列故障,一次启动分区表丢失;若只在服务器本机上备份数据,没有别的备份,一旦该机器硬盘再出现故障,数据的恢复将会耗时耗力,甚至严重时将彻底破坏而无法重现天日。远程手动备份数据费时费力且不及时,到机房现场备份再取回数据也比较麻烦,最好的方法就是通过脚本实现远程自动备份。

解决方案:

配置SSH证书登录验证

​ ERP生产机A(192.168.1.208)和数据存储服务器B(192.168.1.233)两台LINUX服务器,现在需要在A(192.168.1.208)机上用root登陆B(192.168.1.233)机,并且不需要输入密码;

在A(192.168.1.208)机上执行以下命令生成钥匙对:

#ssh-keygen -t rsa 
Generating public/private rsakeypair. 
Enter filein which to save the key (/root/.ssh/id_rsa): 直接回车 
Enter passphrase(empty for no passphrase):直接回车
Enter same passphrase again:直接回车 
Your identification has been saved in /root/.ssh/id_rsa. 
Your public keyhas been saved in /root/.ssh/id_rsa.pub. 
The key fingerprint is:42:92:44:b8:4e:fd:47:ff:95:c4:6f:47:8d:48:c5:02 

​ 在/root/.ssh/路径下会生成id_rsa和id_rsa.pub,其中id_rsa是密钥,id_rsa.pub是公钥。

把在A(192.168.1.208)机生成的id_rsa.pub拷贝到B(192.168.1.233)机上

#scp /root/.ssh/id_rsa.pub [email protected]:/

用root帐号登陆B(192.168.1.233)机,进入其主目录创建authorized_keys文件,并设置好权限。

#cd root/.ssh 
#cp /id_rsa.pub authorized_keys
#chmod 400 authorized_keys
#rm /id_rsa.pub

​ 现在A(192.168.1.208)上登录B(192.168.1.233)机将不需要密码可以直接进入。

编写脚本

​ 脚本内容如下,保存在/scripts/backup.sh中

#!/bin/bash
# 说明:
#	判断/backup目录存在昨天的文件,则将此文件备份到另一台服务器
#	通过SCP命令传输文件,需先设置SSH证书登录
#       root权限下执行crontab -e 
#       输入:00 03 * * * /scripts/backup.sh
# 版本历史:
# v1.0	2014/09/03	Matt.Li
#获取昨天的日期
date1=`date -d"yesterday" +%Y%m%d`
#创建日志文件
test -e /scripts/backup.log || touch /scripts/backup.log
#判断昨天的备份文件是否存在
if [ -f /backup/*${date1}* ]; then
	scp /backup/*${date1}* 192.168.1.233:/backup_from_newSAPPRD
if [ $? == 0 ]; then
           echo $(date +%Y"."%m"."%d" "%k":"%M":"%S) /backup/*${date1}* "备份到192.168.1.233成功">>/scripts/backup.log
     else
echo $(date +%Y"."%m"."%d" "%k":"%M":"%S) "本次scp命令失败">>/scripts/backup.log
      fi
else
	echo $(date +%Y"."%m"."%d" "%k":"%M":"%S) "在/backup目录中未找到"${date1}"的备份文件">>/scripts/backup.log
fi

设置定时执行

$ su root
# crontab -e

​ 然后输入如下内容

00 03 * * * /scripts/backup.sh