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

背景:

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

mysql备份脚本:

开发的脚本如下:

#!/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

开发脚本过程:

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

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

#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个功能。

功能一:

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

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"

功能二:

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

#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

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

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

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

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

总结说明:

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

场景一:

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

场景二:

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

 

相关推荐

  1. MySQL自动备份脚本

    2024-06-18 10:16:03       38 阅读
  2. MongoDB数据库自动备份脚本

    2024-06-18 10:16:03       27 阅读
  3. MySQL定时备份清理脚本

    2024-06-18 10:16:03       28 阅读
  4. entos定时自动备份mysql

    2024-06-18 10:16:03       35 阅读
  5. Ubuntu 设置mysql 自动备份

    2024-06-18 10:16:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 10:16:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 10:16:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 10:16:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 10:16:03       18 阅读

热门阅读

  1. iommu深度剖析虚拟化技术的隐形守护者

    2024-06-18 10:16:03       8 阅读
  2. Unity3D MMORPG加载背包配置表详解

    2024-06-18 10:16:03       7 阅读
  3. 单元的测试

    2024-06-18 10:16:03       6 阅读
  4. SQL server 内连接 左连接 右连接 全连接 语句

    2024-06-18 10:16:03       7 阅读
  5. 静态成员...

    2024-06-18 10:16:03       7 阅读
  6. 架构模式——分层架构

    2024-06-18 10:16:03       8 阅读
  7. MySQL:emoj表情录入

    2024-06-18 10:16:03       8 阅读
  8. 软件测试全面指南:提升软件质量的系统流程

    2024-06-18 10:16:03       9 阅读
  9. Spring Boot高级配置与自定义Starter详解

    2024-06-18 10:16:03       5 阅读