因为公司担心服务器硬盘损坏导致数据丢失,但是公司规模又不是很大,在节约成本的前提下找了一台电脑用来做备份服务器。因为服务器不允许安装任何的软件,所有的操作只能2在备份服务器上,而且数据服务器上也没有nfs和samba。所以我写了一个脚本来实现数据的同步,使用计划任务来调用。
#!/bin/bash #Author:ldy5213@163.com #自动备份数据到本地目录,并且生成日志文件,方便查看 ip='172.16.200.58' #定义服务器ip地址 erlog='/var/log/backuperro.log' #错误日志文件 oklog='/var/log/backup.log' #正确日志文件 yu(){ expect << EOF spawn ssh-copy-id -o StrictHostKeyChecking=no root@$ip expect "password" { send "1234564\r" } expect "#" { send "echo ok\n" } EOF } #定义函数yu,自动发送公钥到服务器 timeout 10 ssh -o StrictHostKeyChecking=no root@$ip ls #在远程主机上执行ls命令,如果需要手动输入密码就会等待,等待超过10秒结束这条语句 if [ $? -ne 0 ];then #判断上一条语句是否执行不成功 rpm -q expect &> /dev/null #检测expect是否安装 if [ $? -ne 0 ];then yum list | grep expect &> /dev/null #检测yum当中是否有expect if [ $? -ne 0];then echo "执行此操作需要安装expect,请手动安装expect或者手动将公钥发送到服务器。" exit 5 fi else yum -y install expect fi if [ ! -f ~/.ssh/id_rsa ] ;then #检测私钥是否不存在 ssh-keygen -q -f ~/.ssh/id_rsa -N '' #非交互式生成公钥和私钥到当前用户家目录下/.ssh/下 fi yu &> /dev/null #执行函数yu,并且把结果丢到黑洞 fi ti=`date +"%Y年%m月%d日 %H点%M分%S秒"` #获取当前的时间给变量赋值 #格式如: 2019年01月10日 14点19分11秒 [ id yuback ] || useradd -s /sbin/nologin yuback #检测到没有用户,创建用户 for hlog in $erlog $oklog do [ ! -f "$hlog" ] && touch $hlog #检测文件是否存在,不存在创建用户 ls -l $hlog | grep yuback &> /dev/null #检测文件的属主和属组是否是yuback [ $? -ne 0 ] && chown yuback:yuback $hlog #如果不是就更改文件归属 done scp -r root@$ip:/hana/backupset/HBP/ /filebackup/HANA/ #复制服务器/hana/backupset/HBP/目录下的文件到本地/filebackup/HANA/,递归复制 if [ $? -ne 0 ];then #判断上面一条命令是否执行不成功 echo "${ti} 备份发生错误,请手动查看错误原因" >> $erlog #将当前时间和后面的文字追加写入错误如日志 ,把这个文件定义为错误日志 exit 2 #直接退出不执行下面的所有操作,返回错误码为2 else echo "${ti} 备份成功!" >> $oklog #将当前时间和后面的文字追加写入正常日志 ,把这个文件定义为正确日志 fi find /filebackup/HANA/QAS/ -type f -mtime +2 -exec rm -f {} \; #查找/filebackup/HANA/QAS/目录下3天之前的类型为文件的,强制删除 if [ $? -eq 0 ];then #判断上面一条命令是否执行成功 echo -e "${ti}\t备份成功!\t删除3天前备份成功!" >> $oklog #将“删除3天前备份成功!”写到正常日志当中 ##格式如: 2019年01月10日 14点19分11秒 删除3天前备份成功! else echo -e "${ti}\t备份成功!\t删除3天前备份失败!请手动查看文件信息。" >> $oklog #将“删除3天前备份失败!请手动查看文件信息。” 写到正常日志当中 #格式如: 2019年01月10日 14点19分11秒 删除3天前备份失败!请手动查看文件信息。 fi for rz in $oklog $erlog do logsize=$(ls -l $rz | awk '{print $5}') if [ "$logsize" -ge 104857600 ];then #如果文件大小大于等于100M rq=`head -1 $rz | awk -F[\ 年月日] '{print $1$2$3}' dq=$(date +'%Y%m%d') dirnm=/var/log/$rq_$dq #定义目录为/var/log/下以日志开头的第一行的年月日_当前年月日 if [ ! -d $dirnm ];then mkdir $dirnm chown yuback #如果目录不存在,创建目录 fi fi mv $rz $dirnm #移动日志到指定的目录 done