一.配置文件备份脚本
1.区块链底层节点配置文件备份
2.数据库配置文件备份(my.cnf、redis.conf)
3.应用程序配置文件备份(springboort程序配置文件、tomcat程序配置文件)
以下是脚本分享:
#!/bin/bash
dates="$(date +%Y%m%d)/"
back_dir="/data/backup/$dates"
port="22"
user="root"
PASSWD='123456'
##区块链底层节点配置文件备份##
node_file="/usr/local/bubichain/config/*"
node_conf=(
172.16.16.77:$node_file
172.16.16.66:$node_file
172.16.16.69:$node_file
172.16.16.15:$node_file
)
for node in ${node_conf[@]}
do
node_ip=$(echo $node | awk -F: '{print $1}')
if [ ! -d ${back_dir}/node/$node_ip ];then
mkdir -p ${back_dir}/node/$node_ip
fi
##bak备份文件失败,重新尝试次数3##
net_status="`echo ""|telnet $node_ip $port 2>/dev/null|grep "\^]"|wc -l`"
if [ $net_status -eq 1 ];then
sshpass -p $PASSWD scp -r -P $port $user@$node ${back_dir}/node/$node_ip
if [ ! $? -eq 0 ];then
echo "失败! 失败!! 失败!!!"
fi
else
for i in `seq 3`
do
sshpass -p $PASSWD scp -r -P$port $user@$node ${back_dir}/node/$node_ip
if [ $? -eq 0 ];then
break
else
echo "backup 失败!"
fi
done
fi
done
##数据库配置文件备份##
db_conf=(
172.16.16.74:/etc/my.cnf
172.16.16.74:/bubidata/server/redis/conf/redis.conf
)
for db in ${db_conf[@]}
do
db_ip=$(echo $db |awk -F: '{print $1}')
if [ ! -d ${back_dir}/db/$db_ip ];then
mkdir -p ${back_dir}/db/$db_ip
fi
net_status="`echo ""|telnet $db_ip $port 2>/dev/null|grep "\^]"|wc -l`"
if [ $net_status -eq 1 ];then
sshpass -p $PASSWD scp -r -P$port $user@$db ${back_dir}/db/$db_ip
if [ ! $? -eq 0 ];then
echo "失败! 失败!! 失败!!!"
fi
else
for i in `seq 3`
do
sshpass -p $PASSWD scp -r -P$port $user@$db ${back_dir}/db/$db_ip
if [ $? -eq 0 ];then
break
else
echo "backup 失败!"
fi
done
fi
done
##应用程序配置文件备份##
app_dir="/bubidata/server/"
app_conf=(
172.16.16.15:${app_dir}data/scf-core-1.1.0-SNAPSHOT/config
172.16.16.15:${app_dir}data/bunuo-adapter-guiyangbank-0.1.0-SNAPSHOT/config
172.16.16.15:${app_dir}data/tomcat-settlement-8081/webapps/settlement/WEB-INF/classes
)
for app in ${app_conf[@]}
do
#app_ip="$(echo $app |awk -F: '{print $1}')"
app_dir="$(echo $app |awk -F '[/]' '{print $5}')"
if [ ! -d ${back_dir}/app/$app_dir ];then
mkdir -p ${back_dir}/app/$app_dir
fi
net_status="`echo ""|telnet $app_ip $port 2>/dev/null|grep "\^]"|wc -l`"
if [ $net_status -eq 1 ];then
sshpass -p $PASSWD scp -r -P$port $user@$app ${back_dir}/app/$app_dir
if [ ! $? -eq 0 ];then
echo "失败! 失败!! 失败!!!"
fi
else
for i in `seq 3`
do
sshpass -p $PASSWD scp -r -P$port $user@$app ${back_dir}/app/$app_dir
if [ $? -eq 0 ];then
break
else
echo "backup 失败!"
fi
done
fi
done
[root@node ~]# crontab -l
#每天凌晨5点备份网站数据
0 5 * * * /bin/bash /data/shell/file_backup.sh > /dev/null 2>&1
二.Mysql数据库备份(通过xtrabackup进行备份)
备份包含全量和增量进行备份,备份结果通过微信报警脚本进行通知
以下是备份脚本及python告警脚本
mysql备份脚本:
cat mysqlback.sh
#!/bin/bash
mysql_port=47029
#获取CPU核数
core_num=$(cat /proc/cpuinfo |grep "cores"|uniq|awk -F[':'] '{print $NF}'| tr -d " ")
#mysql备份的用户
user="backup"
#mysql备份的密码
password="123456"
#socket文件路径
socket_dir=$(grep "socket" /etc/my.cnf|uniq|awk -F['='] '{print $NF}')
#mysql配置文件
mysql_conf="/etc/my.cnf"
#innobackupex命令的路径
bak_commands=$(which innobackupex)
#备份目录
dirs="/data/backup"
#日志目录
log_dirs="$dirs/logs"
#获取当前年月日
dates=$(date +%F-%H-%M)
#完整备份的目录
full_dir="$dirs/full"
#增量备份的目录
zl_dir="$dirs/incre"
#7天做一次完整备份
FULLBACKUP_INTERVAL="604800"
#每天做一次增量备份
INC_INTERVAL="86400"
#记录脚本运行的日志
record_log(){
echo "$(date +%F_%T) ---- $1" >>$log_dirs/$(date +%F)_bak.log
}
#mysql状态
mysql_status=$(netstat -lntp | grep $mysql_port | wc -l)
#判断socket路径
[[ -z "$socket_dir" ]]&&recored_log "Mysql Socket文件找不到"
#判断innobackupex命令是否存在
[[ -z "$bak_commands" ]]&&record_log "innobackupex 命令找不到,请先安装"
#判断完整备份的目录是否存在
[ -d $full_dir ]||mkdir -p $full_dir
#判断增量备份的目录是否存在
[ -d $zl_dir ]||mkdir -p $zl_dir
#判断日志文件目录
[ -d $log_dirs ]||mkdir -p $log_dirs
if [ "$mysql_status" == "0" ];then
record_log "MySQL 没有启动运行."
exit 1
fi
while true
do
#查找最新的完全备份
LATEST_FULL_BACKUP=$(find ${full_dir} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1)
# 查找最近一次的完整备份目录大于5M,否则删除目录
if [ $(du -s $full_dir/$LATEST_FULL_BACKUP|awk '{print $1}') -lt 50000 ];then
if [[ -z $full_dir/$LATEST_FULL_BACKUP ]];then
rm -rf $full_dir/$LATEST_FULL_BACKUP
fi
fi
break
done
#完整备份
fullbackup(){
record_log "开始进行Mysql完整备份"
result=$($bak_commands --defaults-file=$mysql_conf --socket=$socket_dir --user=$user --password=$password --parallel=$core_num --no-timestamp $full_dir/$dates 2>/tmp/temp.log)
status=$(tail -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
if [[ $status -eq 1 ]];then
record_log "[INFO] 完整备份成功 包路径:[$full_dir/${dates}]"
python /data/shell/weixin.py 8 "【mysql数据备份】" "完整备份成功"
else
record_log "[ERROR] 完整备份失败 包路径:[$full_dir/${dates}]"
python /data/shell/weixin.py 8 "【mysql数据备份】" "完整备份失败"
if [ -d $full_dir/$dates ];then
echo "error:$full_dir/$dates"
rm -rf $full_dir/$dates
fi
fi
>/tmp/temp.log
}
#压缩完整备份
fullbackup_tar(){
record_log "开始进行Mysql完整备份"
$bak_commands --defaults-file=$mysql_conf --socket=$socket_dir --user=$user --password=$password --parallel=$core_num --stream=tar --no-timestamp $full_dir/$dates 2>/tmp/temp.log|gzip > $full_dir/${dates}.tar.gz
status=$(tail -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
if [[ $status -eq 1 ]];then
record_log "[INFO] 完整备份成功 tar包路径:[$full_dir/${dates}.tar.gz]"
else
record_log "[ERROR] 完整备份失败 tar包路径:[$full_dir/${dates}.tar.gz]"
fi
>/tmp/temp.log
}
#增量备份1
zlbackup_one(){
record_log "开始进行Mysql第一次增量备份"
$bak_commands --defaults-file=$mysql_conf --user=$user --password=$password --socket=$socket_dir --no-timestamp --incremental $zl_dir --incremental-basedir=$full_dir 2>/tmp/temp.log --parallel=$core_num
status=$(tail -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
echo "status:$status"
if [ $status == 1 ];then
record_log "[INFO] 增量备份成功 路径:[$zl_dir]"
python /data/shell/weixin.py 8 "【mysql数据备份】" "第一次增量备份成功"
else
record_log "[ERROR] 增量备份失败 路径:[$zl_dir]"
python /data/shell/weixin.py 8 "【mysql数据备份】" "第一次增量备份失败"
if [ -d $zl_dir ];then
echo "error:$zl_dir"
rm -rf $zl_dir
fi
fi
>/tmp/temp.log
}
#增量备份2
zlbackup_two(){
record_log "开始进行Mysql第二次增量备份"
$bak_commands --defaults-file=$mysql_conf --user=$user --password=$password --socket=$socket_dir --no-timestamp --incremental $zl_dir --incremental-basedir=$full_dir 2>/tmp/temp.log --parallel=$core_num
status=$(tail -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
if [ $status == 1 ];then
record_log "[INFO] 增量备份成功 路径:[$zl_dir]"
python /data/shell/weixin.py 8 "【mysql数据备份】" "第二次增量备份成功"
else
record_log "[ERROR] 增量备份失败 路径:[$zl_dir]"
python /data/shell/weixin.py 8 "【mysql数据备份】" "第二次增量备份失败"
if [ -d $zl_dir ];then
echo "error:$zl_dir"
rm -rf $zl_dir
fi
fi
>/tmp/temp.log
}
#获取最近一次备份的目录名
LATEST_FULL_BACKUP=$(find ${full_dir} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1)
#根据最近一次备份的时间目录获取到时间戳
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $full_dir/$LATEST_FULL_BACKUP`
#获取当前时间戳
CURRENT_TIME=$(date +%s)
if [ -z $LATEST_FULL_BACKUP ];then
#查找最近一次的完整备份,如果没有就进行一次完整备份
echo '创建完整备份'
fullbackup
elif [ -d $full_dir/$LATEST_FULL_BACKUP -a `expr $(date +%s) - $LATEST_FULL_BACKUP_CREATED_TIME` -gt $FULLBACKUP_INTERVAL ];then
#最近一次完整备份的目录是否存在,并且根据当前的时间戳 - 上一次完整备份的时间戳是否大于7天,也就是要保证每7天做一次完整备份
echo `expr $(date +%s) - $LATEST_FULL_BACKUP_CREATED_TIME`
echo '创建新的完整备份'
fullbackup
elif [ ! -d $dirs/incre/${LATEST_FULL_BACKUP}-zl1 -a $LATEST_FULL_BACKUP ];then
zl_dir=$dirs/incre/${LATEST_FULL_BACKUP}-zl1
full_dir="/data/backup/full/$LATEST_FULL_BACKUP"
echo '第一次增量备份'
zlbackup_one
elif [ ! -d $dirs/incre/${LATEST_FULL_BACKUP}-zl2 -a $LATEST_FULL_BACKUP ];then
zl_dir=$dirs/incre/${LATEST_FULL_BACKUP}-zl2
full_dir="/data/backup/full/$LATEST_FULL_BACKUP"
echo '第二次增量备份'
zlbackup_two
else
echo "现在不需要备份"
python /data/shell/weixin.py 8 "【mysql数据备份】" "时间未到,现在不需要备份"
fi
python微信告警脚本
#!/usr/bin/python
#_*_coding:utf-8 _*_
import urllib,urllib2
import json
import sys
import simplejson
import datetime
reload(sys)
sys.setdefaultencoding('utf-8')
def gettoken(corpid,corpsecret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
print gettoken_url
try:
token_file = urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,subject,content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
nowDate = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
contentMsg = subject +'\n\n' + '备份对象:测试环境-测试链' + '\n' + '备份状态:' + content + '\n备份时间:' + nowDate
send_values = {
"toparty":"2",
"msgtype":"text",
"agentid":"1000002",
"text":{
"content": contentMsg
},
"safe":"0"
}
# send_data = json.dumps(send_values, ensure_ascii=False)
send_data = simplejson.dumps(send_values, ensure_ascii=False).encode('utf-8')
send_request = urllib2.Request(send_url, send_data)
response = json.loads(urllib2.urlopen(send_request).read())
print str(response)
if __name__ == '__main__':
user = str(sys.argv[1])
subject = str(sys.argv[2])
content = str(sys.argv[3])
corpid = 'wwdasdas74d24732db'
corpsecret = 'FoYOhn3ITNfxzRngJItrgG59qPG-rRwqeqwU_3IAXZTE'
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,subject,content)
定时任务
01 03 * * 1,3,5 /data/shell/mysqlbackup.sh
每周1,3,5备份一次