当前位置: 首页 > news >正文

Linux上脚本备份数据库(升级版)

直接上代码:

#!/bin/bash# 配置部分
mysql_user="root"
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8mb4"
mysql_defaults_file="/home/mysql/mysql_back/.my.cnf"backup_base_dir="/mnt/sdd/home/mysqlbak"
backup_dirs=("dflowsql" "dflow_clientsql" "dflow_hcwysql" "dflow_jnznsql")
databases=("dflow" "dflow_client" "dflow_hcwy" "dflow_jnzn")expire_backup_delete="ON"
expire_days=10backup_time=$(date +%Y%m%d%H%M)welcome_msg="Welcome to use MySQL backup tools!"# 检查MySQL实例是否正常运行
mysql_ps=$(pgrep -f mysql | wc -l)
mysql_listen=$(netstat -an | grep LISTEN | grep ":$mysql_port" | wc -l)if [ $mysql_ps -eq 0 ] || [ $mysql_listen -eq 0 ]; thenecho "ERROR: MySQL is not running! Backup stopped!"exit 1
elseecho $welcome_msg
fi# 备份函数
backup_database() {local db_name=$1local backup_dir=$2mkdir -p $backup_dir/usr/local/mysql/bin/mysqldump --defaults-extra-file=$mysql_defaults_file \--add-drop-table -h $mysql_host -P $mysql_port \--default-character-set=$mysql_charset --hex-blob $db_name \--single-transaction --routines --events | gzip > $backup_dir/$db_name-$backup_time.sql.gzif [ $? -eq 0 ]; thenecho "Database backup success. Backup saved to $backup_dir/$db_name-$backup_time.sql.gz"elseecho "Database backup failed for $db_name!"exit 1fi
}# 删除过期备份函数
delete_expired_backups() {local backup_dir=$1local db_name=$2if [ "$expire_backup_delete" == "ON" ] && [ -n "$backup_dir" ]; thenexpired_file_prefix="$db_name-$(date -d "-$expire_days days" +%Y%m%d)"find $backup_dir/ -type f -name "$expired_file_prefix*.sql.gz" -deleteecho "Expired backup data deleted in $backup_dir for $db_name!"fi
}# 备份视图创建语句函数
backup_views() {local db_name=$1local backup_dir=$2mkdir -p $backup_dirlocal view_backup_file="$backup_dir/${db_name}_views-$backup_time.sql"local compressed_view_backup_file="$view_backup_file.gz"mysql --defaults-extra-file=$mysql_defaults_file -h $mysql_host -P $mysql_port -D $db_name -B -N -e "SELECT CONCAT('CREATE OR REPLACE VIEW \`', '$db_name', '\`.\`', TABLE_NAME, '\` AS ', VIEW_DEFINITION, ';') FROM information_schema.VIEWS WHERE TABLE_SCHEMA = '$db_name' ORDER BY TABLE_NAME;" > $view_backup_fileif [ $? -eq 0 ]; thenecho "View export successful. File saved to $view_backup_file"elseecho "View export failed for $db_name!"exit 1figzip -c $view_backup_file > $compressed_view_backup_fileif [ $? -eq 0 ]; thenecho "Backup file compressed. Compressed file saved to $compressed_view_backup_file"elseecho "Compression failed for $view_backup_file!"exit 1firm -f $view_backup_file
}# 循环备份所有数据库
for i in "${!databases[@]}"; dobackup_database "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"#backup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"if [ "${databases[i]}" == "dflow_jnzn" ]; thenbackup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"fi
done# 删除过期备份
for i in "${!databases[@]}"; dodelete_expired_backups "$backup_base_dir/${backup_dirs[i]}" "${databases[i]}"
done
  • MySQL 配置:定义了数据库连接所需的参数,包括用户、主机、端口、字符集和数据库名称。
  • 备份路径:定义了备份文件的保存位置和文件名,使用当前日期时间作为文件名的一部分,以确保文件名唯一。
  • 欢迎信息:输出一条开始备份的提示信息。
  • 创建备份目录:使用 mkdir -p 创建备份目录(如果不存在)。
  • 导出视图创建语句:使用 MySQL 命令从information_schema.VIEWS 表中提取视图创建语句,并保存到文件中。
  • 检查导出是否成功:通过检查上一个命令的退出状态码来判断导出是否成功。
  • 压缩备份文件:使用 gzip 压缩生成的 SQL 文件。
  • 检查压缩是否成功:通过检查上一个命令的退出状态码来判断压缩是否成功。
  • 清理未压缩的备份文件:删除未压缩的原始文件,只保留压缩后的文件。
  • 完成提示:输出备份完成的提示信息。

升级比较(增加视图语句的备份)

  • 新增函数 backup_views
    作用:导出视图创建语句,并将其保存为一个SQL文件,然后压缩该文件。
    步骤: 连接到数据库,提取视图创建语句并保存到文件中。
    检查导出是否成功,并输出相应的信息。 将导出的SQL文件压缩。 检查压缩是否成功,并输出相应的信息。 删除未压缩的原始文件。

  • 在循环中调用 backup_views
    条件:当数据库名为 dflow_jnzn 时,调用 backup_views 函数来备份视图创建语句。

  • 结构调整:

    确保所有数据库的备份和视图备份在循环中进行,并且保持脚本的逻辑清晰。

自动备份具体看我上一篇文章Linux上通过mysqldump命令实现自动备份

相关文章:

  • 贪心算法——加工木棍(C++)
  • 上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)
  • vue3实现多表头列表el-table,拖拽,鼠标滑轮滚动条优化
  • Batch Size 不同对evaluation performance的影响
  • Stream toArray 好过collect
  • 常用知识点问答
  • 【Spring Boot】Java 持久层 API:JPA
  • 数据结构-第七章(B树和B+树)
  • 每日一道算法题 判断子序列
  • linux 环境报错:Peer reports incompatible or unsupported protocol version
  • sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理
  • 不使用AMap.DistrictSearch,通过poi数据绘制省市县区块
  • 巴西市场有哪些电商平台?巴西最畅销的产品有哪些?
  • 揭秘,PyArmor库让你的Python代码更安全
  • Linux 程序打包
  • [译]前端离线指南(上)
  • js ES6 求数组的交集,并集,还有差集
  • Mysql数据库的条件查询语句
  • win10下安装mysql5.7
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 物联网链路协议
  • 项目实战-Api的解决方案
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • HanLP分词命名实体提取详解
  • #数据结构 笔记三
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (六)激光线扫描-三维重建
  • (十) 初识 Docker file
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转载)hibernate缓存
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .htaccess 强制https 单独排除某个目录
  • .Net core 6.0 升8.0
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET业务框架的构建
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [20190416]完善shared latch测试脚本2.txt
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [C++]:for循环for(int num : nums)
  • [C++]高精度 bign (重载运算符版本)
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [CF407E]k-d-sequence
  • [codevs] 1029 遍历问题
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?
  • [HDU] 1054 Strategic Game 入门树形DP
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [Java基础]—JDBC
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用