版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37038498/article/details/68925224
数据库备份脚本
1.需求及思路
1.1需求
随着业务的增长,数据库服务器的增多,数据库的备份及备份后的检测工作变的越来越麻烦,所以就写了这个脚本来处理这个问题
1.2思路
1.2.1整体思路(cmdb和检测脚本略)
- 创建一个cmdb数据库,将业务数据库相关信息录入(数据库设计近期更新)
- 创建检测脚本(python编写),每天早晨收集数据,并将数据库汇集成表格发送邮件(后期已并入cmdb管理系统)
- 业务数据库备份后,将备份信息上传到cmdb服务器
1.2.2备份脚本思路
- 分析备份脚本需要写哪些功能,并将功能封装成函数(数据库状态监测,数据库启动,备份状态监测,远程传输,备份信息插入监测数据库,备份文件打包与定时清除)
- 编写各个功能函数
- 整理工作流程,编写流程函数
2.实现过程
2.1用到的知识点
- 数据库设计(近期更新略)
- 检测脚本(python编写,过于简单略)
- rsync(数据库备份远程同步,鸡蛋不要放在同一个篮子里)
- mydumper(数据库备份工具)
- mysql使用
2.2脚本详细信息
#!/bin/bash
#------------------------------------
#用途: 1.根据实际情况备份数据库
# 2.将备份同步到远程服务器
# 3.并将备份后的信息,同步到检测数据库
#作者:connor
#时间:2016.10.10
#版本:v4
#------------------------------------
#基本变量
mail_user_group="[email protected]"
this_script_dir="/u1/scripts/dbbak"
#过滤的数据库
ignore_database_file="${this_script_dir}/db.txt"
#远程备份ip和模块(rsync)
remote_rsync_ip_and_mode="10.10.1.2::rom"
#本地mysql相关信息
local_ip="10.10.101.19"
mysql_user="root"
mysql_pass="123456"
mysql_port="3306"
mysql_sock="/data/mysql/mysql_3306/mysql_3306.sock"
myslq_command="/usr/local/mysql/bin/mysql -u ${mysql_user} -p${mysql_pass} -S ${mysql_sock} -NBe"
date_today=`date -I`
hostname=`hostname`
#备份文件和备份日志
mysql_backup_path="/data/mydumper_bak"
mysql_backup_fie="${mysql_backup_path}/${date_today}"
mysql_backup_log_path="/var/log/dbbak"
mysql_backup_log_name="${mysql_backup_log_path}/mydumper_${date_today}.log"
rsync_backup_log_name="${mysql_backup_log_path}/rsync_${date_today}.log"
#远程检测服务器信息
check_mysql_backup_db_ip="*.*.*.*"
check_mysql_backup_db_user="db_user"
check_mysql_backup_db_passwd="db_passwd"
check_mysql_backup_db_name="db_name"
check_mysql_backup_db_table="db_backup_info"
check_mysql_backup_db_command="/usr/local/mysql/bin/mysql -h ${check_mysql_backup_db_ip} -u ${check_mysql_backup_db_user} -p${check_mysql_backup_db_passwd} ${check_mysql_backup_db_name} -NBe"
#表字段
check_mysql_backup_db_filed="ip,server_port,start_time,stop_time,total_number_of_database,backup_path,backup_size,backup_status,backup_remarks,remote_rsync_status,date"
#检测备份目录和日志目录
[ -d ${mysql_backup_fie} ] || mkdir -p ${mysql_backup_fie}
[ -d ${mysql_backup_log_path} ] || mkdir -p ${mysql_backup_log_path}
total_number_of_database=0
#数据库备份函数(此函数可根据实际情况自行编写)
database_backup () {
while read db
do
if ! grep ${db} ${ignore_database_file};then
total_number_of_database=$((total_number_of_database+1))
/usr/local/bin/mydumper -u ${mysql_user} -p ${mysql_pass} -S ${mysql_sock} -B ${db} -c -o ${mysql_backup_path}/${date_today}/${db}
if [ $? -eq 0 ];then
echo "`date +'%F %T'` database ${db} dump successful" >> ${mysql_backup_log_name}
else
echo "`date +'%F %T'` database ${db} dump failed" >> ${mysql_backup_log_name}
fi
fi
done< <(${myslq_command} "show databases")
}
#sql函数
insert_check_mysql_backup_db () {
${check_mysql_backup_db_command} "SET NAMES utf8; INSERT INTO ${check_mysql_backup_db_table}(${check_mysql_backup_db_filed}) values(${check_mysql_backup_db_value})"
}
restart_mysql () {
/bin/bash /u1/scripts/restart_mysql.sh
#sleep 300
sleep 300
}
remote_rsync_database_backup () {
rsync -qulr --progress --partial ${mysql_backup_path}/ ${remote_rsync_ip_and_mode}/${local_ip}
if [ $? -eq 0 ];then
echo "`date +'%F %T'` database transport successful" >> ${rsync_backup_log_name}
else
echo "`date +'%F %T'` database transport failed" >> ${rsync_backup_log_name}
fi
}
judge_status () {
mysql_backup_number=`grep failed ${mysql_backup_log_name}|wc -l`
rsync_backup_number=`grep failed ${rsync_backup_log_name}|wc -l`
mysql_backup_question=`grep 'No space' ${mysql_backup_log_name}|wc -l`
date_yesterday=`date +"%Y-%m-%d" -d "-1day"`
today_db_backup_size=`du -s ${mysql_backup_path}/${date_today}.tar.bz2|awk '{print $1}'`
yesterday_db_backup_size=`du -s ${mysql_backup_path}/${date_yesterday}.tar.bz2|awk '{print $1}'`
if [ ${mysql_backup_number} -eq 0 ];then
mysql_backup_status="成功"
#判断备份时是否空间不足
if [ ${mysql_backup_question} -ne 0 ];then
mysql_backup_remarks="磁盘空间不足"
mysql_backup_status="失败"
fi
#今天的备份大小是否大于昨天
if [ ${today_db_backup_size} -lt ${yesterday_db_backup_size} ];then
mysql_backup_remarks="今天备份小于昨天"
mysql_backup_status='警告'
fi
if [ ${rsync_backup_number} -eq 0 ];then
remote_rsync_status="成功"
else
remote_rsync_status="失败"
fi
#今天备份大小是否为空
if [ ${today_db_backup_size} -lt 100 ];then
mysql_backup_remarks="备份大小异常"
mysql_backup_status='失败'
fi
else
mysql_backup_status="失败"
if [ ${mysql_backup_question} -eq 0 ];then
mysql_backup_remarks="其他"
else
mysql_backup_remarks="磁盘空间不足"
fi
remote_rsync_status="失败"
fi
check_mysql_backup_db_value="'${local_ip}','${mysql_port}','${db_backup_start_time}','${db_backup_stop_time}','${total_number_of_database}','${mysql_backup_path}','${mysql_backup_size}','${mysql_backup_status}','${mysql_backup_remarks}','${remote_rsync_status}','${date_today}'"
}
#打包数据库并删除未打包文件,清除14天前的备份
compress_delete_backup_file () {
cd ${mysql_backup_path}
nice -10 tar jcf ${date_today}.tar.bz2 ${date_today} > /dev/null 2>&1
mysql_backup_size=`du -sh ${date_today}.tar.bz2|awk '{print $1}'`
rm -rf ${mysql_backup_path:=UNSET}/${date_today}
find ${mysql_backup_path:=UNSET}/ -ctime +14 -exec rm -f {} \;
}
#流程
#备份前重启数据库释放内存
restart_mysql
#备份开始
echo > ${mysql_backup_log_name}
echo > ${rsync_backup_log_name}
echo "===================`date +'%F %T'` 备份开始===================" >> ${mysql_backup_log_name}
db_backup_start_time=`date +'%F %T'`
#备份数据库
database_backup
echo "===================`date +'%F %T'` 备份结束===================" >> ${mysql_backup_log_name}
db_backup_stop_time=`date +'%F %T'`
#打包数据库并删除未打包文件,清除14天前的备份
compress_delete_backup_file
#将本地备份上传到远程
remote_rsync_database_backup
#判断备份和rsync的状态
judge_status
#插入数据库
insert_check_mysql_backup_db