背景介绍:项目的数据库十分重要,必须保证数据不能丢失。项目组的数据库为mysql5.7.12,采用备份工具mysqldump
开发需求:
1. 备份指定多个数据库
2. 部分数据库的部分数据表需要指定忽略
3. 打包上传到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
注:本脚本主要放容器中运行,可在容器中配置参数和定时执行时间。