背景介绍:项目的数据库十分重要,必须保证数据不能丢失。项目组的数据库为mysql5.7.12,采用备份工具mysqldump
开发需求:
-
备份指定多个数据库
-
部分数据库的部分数据表需要指定忽略
-
打包上传到go-FastDFS文件管理器
下面为脚本代码:
#!/bin/bash
# 数据库连接配置
mysql_host="10.6.111.10"
mysql_user="root"
mysql_password="xxxxx"
# 需要备份的数据库。不同数据库以空格分隔,同一数据库中需要忽略备份的多个表以.号连接。如:数据库名1.数据表名1.数据表名2 数据库名2.数据表名1.数据表名2
backup_databases="demo nacos xxl_job_xujunwei.xxl_job_log.xxl_job_user"
# 当前日期
curr_date=$(date +%Y%m%d)
backup_dir="${curr_date}"
# 上传文件服务器配置
upload_host="10.10.110.10"
upload_port="8080"
upload_scene="mysql"
upload_group="group1/upload"
# 生成命令以忽略部分表的备份,如--ignore-table=xxl_job_xujunwei.xxl_job_user
function build_ignore_table_name(){
database_table=$@
arr=($(echo $database_table | tr "." "\n"))
database=${arr[0]}
ignore_key="--ignore-table="
ignore_table=""
# 遍历拼接--ignore-table字段
for((i=1; i<${#arr[@]};i++))
do
str="$ignore_key$database.${arr[$i]}"
ignore_table="$str $ignore_table"
done
}
echo "* 备份数据库信息,并上传到文件服务器。*" >> backup.log
# 判断文件夹是否存在,不存在则创建
mkdir -p ${backup_dir}
echo -e "\n当前日期${curr_date},开始备份数据库:" >> backup.log
# 遍历备份数据库
for database_table in ${backup_databases}
do
# 获取数据库名称
str_arr=($(echo $database_table | tr "." "\n"))
database=${str_arr[0]}
# 查看是否包含“.”符号
contain_str=$(echo $database_table | grep "\.")
# 若没有包含“.”符号,则完整备份该数据库;否则包含“.”符号,则忽略部分数据表的备份
if [ -z "$contain_str" ]; then
# echo "等于空,说明不包含. 应执行完整备份" --set-gtid-purged=OFF会记录binlog日志,以便恢复主库时,主从同步
mysqldump -h ${mysql_host} -p${mysql_password} -u${mysql_user} --databases ${database} --ssl-mode=disabled --single-transaction --column-statistics=0 --set-gtid-purged=OFF >./${backup_dir}/${database}_${curr_date}.sql
else
# echo "不等于空,则执行忽略表的备份"
# 调用函数,生成忽略表的命令
build_ignore_table_name ${database_table}
mysqldump -h ${mysql_host} -p${mysql_password} -u${mysql_user} --databases ${database} $ignore_table --ssl-mode=disabled --single-transaction --column-statistics=0 --set-gtid-purged=OFF >./${backup_dir}/${database}_${curr_date}.sql
fi
done
# 打包压缩以便备份
tar -jcf ${curr_date}.tar ./${backup_dir}/*.sql
echo -e "\n${curr_date}.tar 打包压缩完成" >> backup.log
# 上传压缩的备份文件到go-fastDFS
curl -F scene=${upload_scene} -F file=@./${curr_date}.tar http://${upload_host}:${upload_port}/${upload_group}
# 判断返回状状态,是否上传成功
if [ $? -eq 0 ]; then
echo -e "\n${curr_date}.tar上传完成。" >> backup.log
else
echo -e "\n${curr_date}.tar上传失败,请校验" >> backup.log
fi
注:本脚本主要放容器中运行,可在容器中配置参数和定时执行时间。