背景:
因公司大量的将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变量是以数组的形式存在的。
场景二:
一个数据库服务中只有一个数据库需要备份,这时候可以复制整个函数,然后将函数中涉及到数据库信息的进行修改即可,然后在调用函数就能做到多个数据库服务的数据备份了。