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=10

backup_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 ]; then
    echo "ERROR: MySQL is not running! Backup stopped!"
    exit 1
else
    echo $welcome_msg
fi

# 备份函数
backup_database() {
    local db_name=$1
    local backup_dir=$2

    mkdir -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.gz

    if [ $? -eq 0 ]; then
        echo "Database backup success. Backup saved to $backup_dir/$db_name-$backup_time.sql.gz"
    else
        echo "Database backup failed for $db_name!"
        exit 1
    fi
}

# 删除过期备份函数
delete_expired_backups() {
    local backup_dir=$1
    local db_name=$2

    if [ "$expire_backup_delete" == "ON" ] && [ -n "$backup_dir" ]; then
        expired_file_prefix="$db_name-$(date -d "-$expire_days days" +%Y%m%d)"
        find $backup_dir/ -type f -name "$expired_file_prefix*.sql.gz" -delete
        echo "Expired backup data deleted in $backup_dir for $db_name!"
    fi
}

# 备份视图创建语句函数
backup_views() {
    local db_name=$1
    local backup_dir=$2

    mkdir -p $backup_dir

    local 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_file

    if [ $? -eq 0 ]; then
        echo "View export successful. File saved to $view_backup_file"
    else
        echo "View export failed for $db_name!"
        exit 1
    fi

    gzip -c $view_backup_file > $compressed_view_backup_file

    if [ $? -eq 0 ]; then
        echo "Backup file compressed. Compressed file saved to $compressed_view_backup_file"
    else
        echo "Compression failed for $view_backup_file!"
        exit 1
    fi

    rm -f $view_backup_file
}

# 循环备份所有数据库
for i in "${!databases[@]}"; do
    backup_database "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"
	#backup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"
    if [ "${databases[i]}" == "dflow_jnzn" ]; then
        backup_views "${databases[i]}" "$backup_base_dir/${backup_dirs[i]}"
    fi
done

# 删除过期备份
for i in "${!databases[@]}"; do
    delete_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命令实现自动备份

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

es6新语法

es6新语法 1 什么是ES6 JS语法分三块 ECMAScript : 基础语法BOM 浏览器对象 history location windowDOM 文档对象 document 编程语言JavaScript是ECMAScript的实现和扩展 。ECMAScript是由ECMA(一个类似W3C的标准组织)参与进行标准化的语法规范。ECMAS…

Selenium的这些自动化测试技巧你知道几个?

Selenium自动化测试技巧 与以前瀑布式开发模式不同,现在软件测试人员具有使用自动化工具执行测试用例套件的优势,而以前,测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试,而是最大程度地减少…

阶段总结——基于深度学习的三叶青图像识别

阶段总结——基于深度学习的三叶青图像识别 文章目录 一、计算机视觉图像分类系统设计二、训练模型2.1. 构建数据集2.2. 网络模型选择2.3. 图像数据增强与调参2.4. 部署模型到web端2.5. 开发图像识别小程序 三、实验结果3.1. 模型训练3.2. 模型部署 四、讨论五、参考文献&#…

js函数扩展内容---多参数,函数属性,字符串生成函数

1.多参数 在js中,Math.max()方法可以接受任意数量的参数, Math.max(1,2,3,4);//4 Math.max(1,2,3,4,5,6,7,8,9,10)//10 在max方法里面有一个rest参数,它接受了所有参数全部合成到了一个number数组里面, function rest(a,b,...a…

MSPM0G3507——读取引脚的高低电平方法(数字信号循迹模块)

SYSCFG配置 代码部分 //第一个传感器if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT_PIN1_PIN )xunji_PORT_PIN1_PIN) //黑,不亮 高{a1;}if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT…

第4-5天:30余种加密编码和资产架构端口应用CDNWAF站库分离负载均衡

文章目录 前言知识点常见加密编码等算法解析 资产架构&端口&应用&CDN&WAF&站库分离&负载均衡资产架构番外安全考虑阻碍 前言 在安全测试中常见的敏感信息密码等会采用加密方式,因此作为一名安全人员要了解常见加密。 知识点 主要有存储加…

Linux权限概述

一、权限概述 1.权限的基本概念 2.为什么要设置权限 3.linux用户的身份类别 4.user文件的拥有者 5.group文件所属组内用户 6.other其他用户 7.特殊用户root 二、普通权限管理 1.ls -l查看文件权限 2.文件类型以及权限解析 3.文件或文件夹的权限设置 4.通过数字给文件…

2024亚太杯中文赛B题洪水灾害的数据分析与预测原创论文分享

大家好,从昨天肝到现在,终于完成了2024年第十四届 APMCM 亚太地区大学生数学建模竞赛B题洪水灾害的数据分析与预测的完整论文啦。 实在精力有限,具体的讲解大家可以去讲解视频: 2024亚太杯中文赛B题洪水灾害预测原创论文保姆级教…

(一)优化算法-遗传算法

目录 前言 一、什么是遗传算法? (一)基本结构 (二)遗传操作 二、仿真过程 (一)主程序部分 (二)选择函数 (三)交叉函数 (四&a…

【优化论】约束优化算法

约束优化算法是一类专门处理目标函数在存在约束条件下求解最优解的方法。为了更好地理解约束优化算法,我们需要了解一些核心概念和基本方法。 约束优化的核心概念 可行域(Feasible Region): 比喻:想象你在一个园艺场…

软连接迁移 Docker 的默认安装(存储)目录

前言 经常我们会拿到一些别人装好的服务器,需要在这些系统上启动我们的docker服务。 但是这些“专业人员”呢,有时候就会有非常不专业的操作,比如他把根目录/只划分50GB,/home却有51TB。这个时候就会导致我们的服务器还有很多空间…

万界星空科技机械加工行业MES解决方案

机械加工行业作为制造业的重要组成部分,面临着生产效率、成本控制和产品质量提升等多重挑战。为了应对这些挑战,引入并实施制造执行系统(MES)成为了行业的必然选择。本文将详细介绍一种针对机械加工行业的MES解决方案,…

STM32-HAL-FATFS(文件系统)(没做完,stm32f103zet6(有大佬的可以在评论区说一下次板子为什么挂载失败了))

1STM32Cube配置 1-1配置时钟 1-2配置调试端口 1-3配置uart 1-4配置SDIO(注意参数)(其中他的初始化的异常函数给注释,SD卡文件写了) 配置了还要打开中断和DMA可在我的其他文章中看一样的 1-5配置FatFs (只改了图选中…

【Kubernetes】Pod 资源调度之亲和性调度

Pod 资源调度之亲和性调度 1.Node 亲和性调度1.1 Node 硬亲和性1.2 Node 软亲和性 2.Pod 亲和性调度2.1 Pod 硬亲和2.2 Pod 软亲和2.3 Pod 反亲和 Kubernetes 的 默认调度器 以 预选、优选、选定机制 完成将每个新的 Pod 资源绑定至为其选出的目标节点上,不过&#…

Javase-异常

文章目录 1. 异常概述2. 异常的继承结构3. 自定义异常4. 异常的处理5. 异常的使用6. finally语句块7. 方法覆盖与异常 1. 异常概述 什么是异常 ①什么是异常?有什么用? 1.Java中的异常是指程序运行时出现了错误或异常情况,导致程序无法继续正常执行的现象。例如&…

【CG】计算机图形学(Computer Graphics)基础(其壹)

0 学习视频 B站GAMES101-现代计算机图形学入门-闫令琪 1 什么是计算机图形学 1.1 什么是好的画面? 画面足够亮。如果全局光照做的好,整个画面就会亮,看起来很舒服。 1.2 计算机图形学涉及到的领域 数学(透视)投影…

java基础:面向对象(一)

一、概念 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。面向对象适合处理复杂的问题,适合处理需要多人协作的问题!对于描…

vulhub靶场之DEVGURU:1

1 信息收集 1.1 主机发现 arp-scan -l 发现主机IP地址为“192.168.1.11 1.2 端口发现 nmap -sS -sV -A -T5 -p- 192.168.1.11 发现端口为:22,80,8585 1.3 目录扫描 dirsearch -u 192.168.1.11 发现存在git泄露 2 文件和端口访问 2…

idea中没有显示‘‘Spring‘‘一栏 (已解决)

第一步: 随便找一个Bean(即直接或者间接使用Component的类) 第二步: 找到左边的图标, 右键这个图标, 然后选择如下选项: 第三步: 成功 然后就成功了, 可以看到具体的bean了以及其bean的关系图等.

MySQL的Geometry数据处理之WKB方案

MySQL的Geometry数据处理之WKT方案:https://blog.csdn.net/qq_42402854/article/details/140134357 MySQL的Geometry数据处理之WKT方案中,介绍WTK方案的优点,也感受到它的繁琐和缺陷。比如: 需要借助 ST_GeomFromText和 ST_AsTex…