自动化重置数据库功能的探索与实践

news2024/11/25 2:55:14

1、简介

在现代软件开发中,尤其是涉及到数据驱动的应用程序时,开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态,自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本来自动化重置MySQL数据库,以便开发团队能够轻松地在每次测试或开发新功能前将数据库恢复到一个已知的初始状态。

2、技术支撑

  • Shell脚本基础:熟悉基本的Shell命令和脚本编写技巧。
  • MySQL操作:了解如何通过命令行与MySQL数据库进行交互,包括备份、恢复和执行SQL脚本。
  • 安全性考虑:确保数据库操作的安全性,特别是涉及到数据库密码和敏感数据时。
  • 自动化实践:通过计划任务(如cron jobs)实现自动化的数据库重置。

3、数据库规则约束

1、新建Gitlab的仓库
2、根据数据库名称作为目录,地下有3(schema,init、append)目录
在这里插入图片描述

4、自动化脚本实现

#!/bin/bash

# 定义一个数组来存储选项,这些选项将由 `ls fat-db` 命令的输出填充。
options=()
read -ra options <<< $(ls fat-db)

# 定义颜色代码,用于在终端中输出不同颜色的文本。
INFO='\033[0;32m'
EINFO='\033[0m'

# 如果 `fat-db` 目录存在,则删除它。
if [ -d fat-db ]; then rm -rf fat-db ;fi

# 克隆 git 仓库到当前目录。
git clone https://xxxx.xxxx.com/group/fat-db.git   >> /dev/null 2>&1 

# 定义一个函数,用于执行 SQL 脚本。
function exec_sql(){
    # 设置数据库服务器的主机地址。
    host="127.0.0.1"
    
    # 为 MySQL 客户端设置环境变量密码。
    export MYSQL_PWD="xxxx.88"
    
    # 连接到数据库,并显示数据库中的所有表。
    # 然后删除这些表。
    read -ra list <<< `mysql -u root -h $host -e "use $1;show tables;"`
    tb_list=`echo ${list[@]:1} | sed 's/ /,/g'`
    echo -e "${INFO}开始删除${1}所有表 ${EINFO}"
    mysql -u root -h $host -e "use $1;drop tables $tb_list;"
    
    # 执行数据库的 schema 脚本。
    schema_sqls=`find fat-db/\$1/schema -type f -name *.sql`
    for schema_sql in $schema_sqls;do
        echo -e "${INFO}开始执行${schema_sql} ${EINFO}"
        mysql -u root -h $host $1 < $schema_sql
    done
    
    # 如果存在初始化脚本目录,则执行其中的 SQL 脚本。
    if [ -d fat-db/$1/init ]; then 
        init_sqls=`find fat-db/\$1/init -type f -name *.sql`
        for init_sql in $init_sqls;do
            echo -e "${INFO}开始执行${init_sql} ${EINFO}"
            mysql -u root -h $host $1 < $init_sql
        done
    fi
    
    # 如果存在追加脚本目录,则根据日期排序后执行其中的 SQL 脚本。
    if [ -d fat-db/$1/append ]; then 
        append_sqls=`find fat-db/$1/append -type f -name *.sql | sort -t '/' -k 4`
        for append_sql in $append_sqls;do
            echo -e "${INFO}开始执行${append_sql} ${EINFO}"
            mysql -u root -h $host $1 < $append_sql
        done
    fi
}

# 定义一个函数,用于当没有参数时,通过 select 提供一个菜单来选择数据库。
function select_db() {
    # 将 "all" 和 "quit" 添加到选项菜单中。
    options+=("all" "quit")
    # 使用 select 显示菜单并允许用户选择一个选项。
    select option in "${options[@]}"; do
        # 根据用户选择的选项执行不同的操作。
        case $option in
            "quit")
                echo "Exiting..."
                break
                ;;
            "all")
                # 如果选择 "all",则对所有数据库执行 exec_sql 函数。
                for db in ${options[@]}; do
                    if [[ $db =~ "all" || $db =~ "quit" ]];then continue ;fi
                    exec_sql $db
                done
                ;;
            *)
                # 如果用户选择了一个有效的数据库名称,则执行 exec_sql 函数。
                if [[ "${options[@]}" =~ "$option" ]]; then
                    echo "You selected: $option"
                    exec_sql $option
                else
                    echo "Please choose a valid option."
                fi
                ;;
        esac
    done
}

# 定义一个函数,用于当有一个参数时执行。
function arges_db() {
    # 如果参数存在于选项数组中,则执行该数据库的 SQL 脚本。
    if [[ ${options[@]/$1/} != ${options[@]} ]]; then
        exec_sql $1
    # 如果参数是 "all",则对所有数据库执行 SQL 脚本。
    elif [[ $1 == "all" ]];then
        for db in ${options[@]}; do
            exec_sql $db
        done
    # 如果参数不在选项中且不是 "all",则输出错误信息。
    else
        echo "You selected $1 not exist!"
    fi
}

# 检查传入的参数数量。
if [[ $# == 0 ]];then
    # 如果没有参数,则调用 select_db 函数。
    select_db
elif [[ $# == 1 ]];then
    # 如果有一个参数,则调用 arges_db 函数并传入该参数。
    arges_db $1
else
    # 如果参数数量不是0或1,则输出错误信息。
    echo "database:${options[@]}"
    echo "example : $(basename $0)"
    echo "example : $(basename $0) ${options[1]}"
    echo "example : $(basename $0) all"
fi

5、测试结果

执行 sh fatdb-init.sh,会列举当下的所有数据库
在这里插入图片描述
如果想重置loan_urge库,输入7后回车就可以自动执行
在这里插入图片描述
在这里插入图片描述

同理,想重置哪个库就输入库名前面的数字即可。8代表全部库,9代表退出当前操作

6、结语:

自动化数据库重置脚本的开发与实施,是提高开发效率、保证测试质量的关键一环。通过综合考虑技术选型、精心设计核心逻辑、强化安全措施及无缝融入CI/CD流程,可构建出既高效又可靠的数据库管理自动化解决方案。实践过程中,不断迭代优化,结合具体项目需求灵活调整,是实现长期成功的关键。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打印9*9乘法表(递归或压缩矩阵)python

打印9*9表def print_multiplication_table(row, col):if row > 10:return # 递归结束条件if col row:print() # 换行print_multiplication_table(row 1, 1) # 递归调用下一行else:print(f"{row-1} * {col} {(row-1) * col}\t", end"") # 打印乘法…

小程序properties默认值定义及父子组件的传值

因经常写vue&#xff0c;很久没写小程序&#xff0c;容易串频道&#xff0c;现记录一下小程序的组件用法、监听传入值及父子传值方式 首先小程序中传值是没有&#xff1a;(冒号)的&#xff0c;其次properties中定义默认值不需要写default 1.自定义组件中&#xff0c;首先json…

TransFormer学习之基础知识:STN、SENet、CBAM、Self-Attention

1.空间注意力机制STN 参考链接&#xff1a;STN(Spatial Transformer Networks) 参考链接&#xff1a;通俗易懂的Spatial Transformer Networks(STN) 核心动机&#xff1a; 在空间中捕获重要区域特征(如图像中的数字)&#xff0c;将核心区域进行放大居中&#xff0c;使得结果更…

2461. 长度为 K 子数组中的最大和(c++)

给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和&#xff1a; 子数组的长度是 k&#xff0c;且子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件&#xff0c;返回 0 。 子数…

第七节 ConfigurationClassParser 源码分析

tips&#xff1a; ConfigurationClassParser 是 Springframework 中的重要类。 本章主要是源码理解&#xff0c;有难度和深度&#xff0c;也枯燥乏味&#xff0c;可以根据实际情况选择阅读。 位置&#xff1a;org.springframework.context.annotation.ConfigurationClassPars…

怎样下载Android Studio历史版本文件包

1.在官网上下载都是推荐最新版本&#xff0c;想下载历史版本比较费劲&#xff0c;绕来绕去的。 2.进入这个网站可以下载其他版本https://android-studio.en.uptodown.com/windows/versions Older versions of Android Studio Its not uncommon for the latest version of an a…

【大数据】MapReduce实战

文章目录 [toc]Word CountMapperReducerrun.sh本地调试 基于白名单的Word CountMapperReducerrun.sh本地调试 文件分发-fileMapperReducerrun.sh -cacheFileMapperReducerrun.sh -cacheArchiveMapperReducerrun.sh 杀死MapReduce Job排序压缩文件mr_ip_lib_python本地调试 个人…

Flask Response 对象

文章目录 创建 Response 对象设置响应内容设置响应状态码设置响应头完整的示例拓展设置响应的 cookie重定向响应发送文件作为响应 总结 Flask 是一个 Python Web 框架&#xff0c;用于快速开发 Web 应用程序。在 Flask 中&#xff0c;我们使用 Response 对象来构建 HTTP 响应。…

东软联合福建省大数据集团打造“数据要素×医疗健康”服务新模式

5月23日&#xff0c;东软集团与福建省大数据集团有限公司在福州签订战略合作协议。 据「TMT星球」了解&#xff0c;双方将在健康医疗数据要素价值领域展开合作&#xff0c;通过大数据服务&#xff0c;赋能商业保险公司的产品设计和保险两核&#xff0c;打造“数据要素医疗健康…

微软开源多模态大模型Phi-3-vision,微调实战来了

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型& AIGC 技术趋势、大模型& AIGC 落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了…

Qt 报错总结 No suitable kits found

目录 “No suitable kits found” 解决 解决方法参考&#xff1a; chatGPT辅助解决QT构建报错error: multiple target patterns 我的解决方法&#xff1a;把语言设置为空 “No suitable kits found” 解决 没有找到合适的kits套件&#xff0c;在安装Qt Creator时没有安装Min…

AGI技术与原理浅析:曙光还是迷失?

前言&#xff1a;回顾以往博客文章&#xff0c;最近一次更新在2020-07&#xff0c;内容以机器学习、深度学习、CV、Slam为主&#xff0c;顺带夹杂个人感悟。笔者并非算法科班出身&#xff0c;本科学制药、研究生学金融&#xff0c;最原始的算法积累都来源于网络&#xff0c;当时…

系统架构师考试(十)

SaaS为在线客服 PaaS为二次开发&#xff0c;比如低代码平台 IaaS 硬件开发 B 是基础设施作为服务 软件架构的概念 架构风格 数据流风格 网络报文是在计算机网络中通过网络传输的数据单元&#xff0c;它是网络通信的基本单位。网络报文包含了发送方和接收方之间传输的数据&…

【Crypto】摩丝

文章目录 一、摩斯解题感悟 一、摩斯 很明显莫尔斯密码 iloveyou还挺浪漫 小小flag&#xff0c;拿下 解题感悟 莫尔斯密码这种题还是比较明显的

在Windows10中重命名文件和文件夹的6种方法,有你熟悉和不熟悉的

序言 你可以通过多种方式在Windows 10上重命名文件。如果每次你想更改文件名时仍右键单击并选择“重命名”,那么我们有一些技巧可以加快更改速度。 使用文件资源管理器重命名文件和文件夹 Windows 10的文件资源管理器是一个功能强大的工具。你知道吗,有四种不同的方法可以…

从零入门激光SLAM(二十一)——看不懂FAST-LIO?进来

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…

【Vue】input框自动聚焦且输入验证码后跳至下一位

场景:PC端 样式: <div class="verification-code-input"><input v-model="code[index]" v-for="(_, index) in 5" :key="index" type="text" maxlength="1" @input="handleInput(index)" …

数据库—— MySQL数据库安装

一、MySQL数据库定义 MySQL是一种开源关系型数据库管理系统&#xff0c;它使用SQL语言进行数据的管理。通过MySQL&#xff0c;可以创建数据库、表格、插入、查询、更新和删除数据等操作。MySQL支持多种操作系统&#xff0c;并且被广泛应用于Web应用程序开发中。MySQL以其高性能…

【HTML】制作一个跟随鼠标的流畅线条引导页界面(可直接复制源码)

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;图中线条可跟随鼠标移动&#xff0c;具体内容如下&#xff1a; 开始 首先新建一个HTML的文本&#xff0c;文本名改为[index.html]&#xff0c;创建好后右…

(Oracle)SQL优化基础(三):看懂执行计划顺序

往期内容&#xff1a; &#xff08;Oracle&#xff09;SQL优化基础&#xff08;一&#xff09;&#xff1a;获取执行计划 &#xff08;Oracle&#xff09;SQL优化基础&#xff08;二&#xff09;&#xff1a;统计信息 获取到执行计划后&#xff0c;对于新手朋友来讲可能不知道…