因公司大量的将mysql数据库转移到kubernetes集群上,考虑到数据安全性,需要对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 <
- 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 <
- 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变量是以数组的形式存在的。
场景二:
一个数据库服务中只有一个数据库需要备份,这时候可以复制整个函数,然后将函数中涉及到数据库信息的进行修改即可,然后在调用函数就能做到多个数据库服务的数据备份了。
-
相关阅读:
前端js手写面试题汇总(二)
嵌入式快速入门学习笔记-input输入子系统
NodeMCU ESP8266 基于Arduino IDE的串口使用详解(图文并茂)
05【SpringMVC的数据绑定】
web网页设计实例作业HTML+CSS+JavaScript蔬菜水果商城购物设计
Vatee万腾平台:创新科技,助力企业腾飞
SuperMap iClient3D for WebGL教程(S3MTilesLayer)- 显示优化设置
PX4入门指南
点云从入门到精通技术详解100篇-基于路侧激光雷达的交通目标感知方法与实现(下)
网络协议三要素
-
原文地址:https://blog.csdn.net/jiang0615csdn/article/details/139746779