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变量是以数组的形式存在的。

场景二:

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

相关推荐
是芽芽哩!1 小时前
【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)
云原生·容器·kubernetes
KELLENSHAW1 小时前
MySQL45讲 第三十七讲 什么时候会使用内部临时表?——阅读总结
数据库·mysql
四七伵2 小时前
MySQL外键类型与应用场景总结:优缺点一目了然
mysql
core5122 小时前
flink cdc各种数据库 jar下载地址
mysql·oracle·flink·jar·oceanbase·cdc
怡雪~3 小时前
k8s使用ceph
ceph·容器·kubernetes
别致的影分身3 小时前
MySQL 常用程序介绍
数据库·mysql
运维小文4 小时前
K8S中的服务质量QOS
云原生·容器·kubernetes
华为云开发者联盟4 小时前
Karmada v1.12 版本发布!单集群应用迁移可维护性增强
云原生·kubernetes·开源·容器编排·karmada
HD2436088364 小时前
【mysql】id主键列乱了之后,重新排序(可根据日期顺序)
数据库·sql·mysql
Hadoop_Liang4 小时前
Kubernetes Secret的创建与使用
云原生·容器·kubernetes