mysql自动备份脚本开发,包含自动清理备份文件机制

背景:

因公司大量的将mysql数据库转移到kubernetes集群上,考虑到数据安全性,需要对mysql容器里的数据库进行备份工作,为了方便集中管理这些备份文件,经过分析及考虑,计划使用一台服务器作为数据库备份中心,用于存放备份数据文件。

mysql备份脚本:

开发的脚本如下:

cpp 复制代码
#!/bin/bash
#author:xionghj001

#Dump backup execution log
log_output () {
    if [ ! -f /back_db/dump.log ]
    then
        cd /back_db/
	touch dump.log
    fi
        echo -e "\e[$1m[$(date +"%F %T")] $2 \e[0m" 
}


4a-test () {
#parameter
mysql_host="10.15.0.137"
mysql_port="21527"
mysql_name=(jxsl_4a)
backup_addr="4a-test"
mysql_charset="utf8"
mysql_password="jh_Mysql123"

#Check if the backup MySQL service is running
mysql -h$mysql_host -P$mysql_port -uroot -p$mysql_password <<end
use mysql;
select host,user from user where user='root';
exit
end

flag=`echo $?`
if [ $flag != "0" ]
then
    log_output 31 "[ERROR]:Can't connect mysql server! backup stop!" | tee -a /back_db/dump.log
else
    log_output 32 "[INFO] MySQL connect ok! Please wait......" | tee -a /back_db/dump.log
fi

# Check if the backup directory exists
for a in ${mysql_name[@]}
do
    if [ ! -d /back_db/$backup_addr ]
    then
	mkdir -p /back_db/$backup_addr
	if [ ! -d /back_db/$backup_addr/$a ]
	then
	    mkdir -p /back_db/$backup_addr/$a
	fi
    else
	if [ ! -d /back_db/$backup_addr/$a ]
	then
	    mkdir -p /back_db/$backup_addr/$a
	fi
    fi
done

# Can't connect mysql server
for i in ${mysql_name[@]}
do
    if [ ! -f /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz ]
    then
	log_output 32 "[INFO] running backup mysql $i" | tee -a /back_db/dump.log
	`/usr/bin/mysqldump --skip-opt -h$mysql_host -P$mysql_port -uroot -p$mysql_password --database $i --default-character-set=$mysql_charset | gzip > /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz`
	flag=`echo $?`
	if [ $flag == "0" ]
	then
	    log_output 32 "[INFO] database $mysql_name success backup to /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz" | tee -a /back_db/dump.log
	else
	    log_output 31 "[ERROR] database $mysql_name backup fail!" | tee -a /back_db/dump.log
	fi
    else
	log_output 32 "[INFO] mysql $i is backup" | tee -a /back_db/dump.log
    fi
    # clean history backup
    r="30"
    path=/back_db/$backup_addr/$i
    list=(`find $path -type f -name "*.sql.gz" -mtime +$r`)
    for ((i=0;i<${#list[*]};i++))
    do
        rm -rf ${list[$i]}
	flagc=`echo $?`
	if [ $flagc == "0" ]
	then
	    log_output 32 "INFO Clear ${list[$i]} path $r day before" | tee -a /back_db/dump.log
	fi
    done
done
}

# running backup mysql
4a-test

开发脚本过程:

第一部分:脚本执行日志文件函数:

这里是记录脚本执行过程并生成文件的函数

cpp 复制代码
#Dump backup execution log
log_output () {
    if [ ! -f /back_db/dump.log ] #判断脚本日志文件是否存在
    then
        cd /back_db/
	    touch dump.log   #如果不存在就直接创建日志文件
    fi
        echo -e "\e[$1m[$(date +"%F %T")] $2 \e[0m" 
}

第二部分:自动执行备份数据库过程函数:

自动备份脚本函数包含了5个功能。

功能一:

获取需要备份数据库的相关信息。

cpp 复制代码
4a-test () {
#parameter
mysql_host="10.15.3.150"
mysql_port="3308"
mysql_name=(four_test)
backup_addr="four-test"
mysql_charset="utf8"
mysql_password="jh_Mysql123"

功能二:

检查需要备份的数据库是否运行正常。

cpp 复制代码
#Check if the backup MySQL service is running
mysql -h$mysql_host -P$mysql_port -uroot -p$mysql_password <<end
use mysql;
select host,user from user where user='root';
exit
end
flag=`echo $?`
if [ $flag != "0" ]
then
    log_output 31 "[ERROR]:Can't connect mysql server! backup stop!" | tee -a /back_db/dump.log
else
    log_output 32 "[INFO] MySQL connect ok! Please wait......" | tee -a /back_db/dump.log
fi

功能三:

检查备份的目录是否存在,不存在的则直接创建。

cpp 复制代码
# Check if the backup directory exists
for a in ${mysql_name[@]}
do
    if [ ! -d /back_db/$backup_addr ]
    then
	mkdir -p /back_db/$backup_addr
	if [ ! -d /back_db/$backup_addr/$a ]
	then
	    mkdir -p /back_db/$backup_addr/$a
	fi
    else
	if [ ! -d /back_db/$backup_addr/$a ]
	then
	    mkdir -p /back_db/$backup_addr/$a
	fi
    fi
done

功能四:

执行数据库备份操作,并清理历史备份文件操作。

cpp 复制代码
# Can't connect mysql server
for i in ${mysql_name[@]}
do
    if [ ! -f /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz ]
    then
	log_output 32 "[INFO] running backup mysql $i" | tee -a /back_db/dump.log
	`/usr/bin/mysqldump --skip-opt -h$mysql_host -P$mysql_port -uroot -p$mysql_password --database $i --default-character-set=$mysql_charset | gzip > /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz`
	flag=`echo $?`
	if [ $flag == "0" ]
	then
	    log_output 32 "[INFO] database $mysql_name success backup to /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz" | tee -a /back_db/dump.log
	else
	    log_output 31 "[ERROR] database $mysql_name backup fail!" | tee -a /back_db/dump.log
	fi
    else
	log_output 32 "[INFO] mysql $i is backup" | tee -a /back_db/dump.log
    fi
    # clean history backup
    r="30"
    path=/back_db/$backup_addr/$i
    list=(`find $path -type f -name "*.sql.gz" -mtime +$r`)
    for ((i=0;i<${#list[*]};i++))
    do
        rm -rf ${list[$i]}
	flagc=`echo $?`
	if [ $flagc == "0" ]
	then
	    log_output 32 "INFO Clear ${list[$i]} path $r day before" | tee -a /back_db/dump.log
	fi
    done
done
}

功能五:

调用函数。

cpp 复制代码
# running backup mysql
4a-test

第三部分:设置定时任务执行:

因为脚本开发完成之后,需要设置一个定时任务,让脚本自动执行。

策略为:每天凌晨01点03分执行。

cpp 复制代码
[root@db-back back_db]# crontab -e
03 01 * * * /bin/bash /back_db/mysqldump.sh

总结说明:

该脚本适应两种情况的备份场景:

场景一:

一个数据库服务中存在多个数据库的备份,这样的场景在mysql_name变量中加入多个数据库名称,要以空格键分割。因为脚本再开发的过中就考虑多个数据库名称的情况,所以mysql_name变量是以数组的形式存在的。

场景二:

一个数据库服务中只有一个数据库需要备份,这时候可以复制整个函数,然后将函数中涉及到数据库信息的进行修改即可,然后在调用函数就能做到多个数据库服务的数据备份了。

相关推荐
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
筵陌4 小时前
MySQL索引及其底层原理(上)
mysql
怣504 小时前
MySQL子查询零基础入门教程:从小白到上手(零基础入门版)
数据库·mysql
广州中轴线5 小时前
OpenStack on Kubernetes 生产部署实战(十三)
容器·kubernetes·openstack
猫头虎6 小时前
基于信创openEuler系统安装部署OpenTeleDB开源数据库的实战教程
数据库·redis·sql·mysql·开源·nosql·database
Nandeska6 小时前
17、MySQL InnoDB ReplicaSet
数据库·mysql
hlABgYML6 小时前
基于NGSIM数据的Wiedemann99跟驰模型标定
mysql
切糕师学AI6 小时前
Helm Chart 是什么?
云原生·kubernetes·helm chart
墨理学AI7 小时前
一文学会一点python数据分析-小白原地进阶(mysql 安装 - mysql - python 数据分析 - 学习阶段梳理)
python·mysql·数据分析
洛豳枭薰7 小时前
MySQL 并行复制
数据库·mysql