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

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;doecho -e "${INFO}开始执行${schema_sql} ${EINFO}"mysql -u root -h $host $1 < $schema_sqldone# 如果存在初始化脚本目录,则执行其中的 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;doecho -e "${INFO}开始执行${init_sql} ${EINFO}"mysql -u root -h $host $1 < $init_sqldonefi# 如果存在追加脚本目录,则根据日期排序后执行其中的 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;doecho -e "${INFO}开始执行${append_sql} ${EINFO}"mysql -u root -h $host $1 < $append_sqldonefi
}# 定义一个函数,用于当没有参数时,通过 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[@]}; doif [[ $db =~ "all" || $db =~ "quit" ]];then continue ;fiexec_sql $dbdone;;*)# 如果用户选择了一个有效的数据库名称,则执行 exec_sql 函数。if [[ "${options[@]}" =~ "$option" ]]; thenecho "You selected: $option"exec_sql $optionelseecho "Please choose a valid option."fi;;esacdone
}# 定义一个函数,用于当有一个参数时执行。
function arges_db() {# 如果参数存在于选项数组中,则执行该数据库的 SQL 脚本。if [[ ${options[@]/$1/} != ${options[@]} ]]; thenexec_sql $1# 如果参数是 "all",则对所有数据库执行 SQL 脚本。elif [[ $1 == "all" ]];thenfor db in ${options[@]}; doexec_sql $dbdone# 如果参数不在选项中且不是 "all",则输出错误信息。elseecho "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.mzph.cn/diannao/14720.shtml

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

相关文章

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务&#xff0c;但我是部署在自己的家庭nas-极空间z4pro里的&#xff0c;属于内网环境。 另外我有一台阿里云服务器&#xff0c;做跳板机。 我有一个阿里的域名…

老Java学 Go 笔录(二) 从 go 的编译开始学起

目录 一.版本选择二.环境准备三.工具的选择四.第一个 hello go4.1 开发4.2 编译4.3 编译运行4.4 直接安装 五.用 go 快速搭建 webserver六.调用外部三方方法七.go vs java 的执行 前言 专栏旨在利用现有的 java 体系内容去完成 go 语言的学习. 本次行文是在 https://go.dev/doc…

迈向2024年,投资无人售货机的盈利能力

在科技进步的浪潮下&#xff0c;无人值守自动售货商店已悄然引领了零售业的新风尚。但关于在2024年开设此类商店是否依旧能实现盈利&#xff0c;这需要一番深思熟虑的分析。 首先不可否认&#xff0c;无人售货机拥有多项显著优势。它打破了传统零售的时间与地点局限&#xff0…

[Linux] 进程概念

目录 1.冯诺依曼硬件体系结构 2.操作系统&#xff08;OS&#xff09; 3.系统接口 4.进程的概念 5.进程状态 6.四个其他概念 7.环境变量 8.进程地址空间 1.冯诺依曼硬件体系结构 在冯诺依曼体系结构中&#xff0c;计算机是由输入、输出、存储设备和中央处理器cpu组成的。图中体结…

Unity 自定义Web GL 发布模板

前言 使用讯飞语音识别时&#xff0c;发布Web GL 平台后需要在index.html 中添加相应的script 标签&#xff0c;但每次发布完添加比较麻烦&#xff0c;添加一个发布模板就可以不必每次发布完再手动添加修改。 实现 在Assets 文件夹下新建一个文件夹&#xff0c;重命名为WebG…

重构2:重构的原则之笔记

最近在看重构2&#xff1a;改善既有代码的设计这本书&#xff0c;对于代码重构指导非常有帮助&#xff0c;然后也是做个笔记记录下&#xff0c;以下是我阅读本书的前两章的时候整理的思维导图&#xff1a;

华为手机卡顿(仅针对于部分人来说,我也不清楚是否真的有用)

关机&#xff01; 之前一段时间手机变得特别卡顿&#xff0c;然后网上搜了一堆教程一点用没有&#xff0c;结果因为昨天下午在考试所以把手机关机了一个多小时&#xff0c;再打开之后手机就变得很流畅&#xff0c;原因不详&#xff0c;但效果显著&#xff0c;如有需要可尝试一…

docker 挂载运行镜像

文章目录 前言docker 挂载运行镜像1. 作用2. 命令3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢…

软考 软件设计师 场景分析题 速成篇

文章目录 试题一&#xff1a;数据流图&#x1f496; 基本图形元素1. 外部实体2. 数据存储3. 加工4. 数据流 &#x1f4da; 例题&#xff08;1&#xff09;实体名称&#xff08;2&#xff09;数据存储名称&#xff08;3&#xff09;数据流① 父子图平衡② 加工有输入有输出④ 数…

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

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

CSS【常用CSS样式、盒子模型、定位、浮动 、扩展样式】--学习JavaEE的day46

day46 CSS 练习 页面实现&#xff1a; 分析&#xff1a; 未优化&#xff1a; 优化&#xff1a; 参考代码&#xff1a;&#xff08;包含样式优化–选择器CSS属性&#xff09; 先写上table方便实现&#xff0c;之后再去除即可 name没有服务器&#xff0c;可暂时不写 <!…

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

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

零部件销售|基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现(源码+数据库+文档)

轻型卡车零部件销售平台 目录 基于SSM&#xff0b;vue的轻型卡车零部件销售平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

stream( ).collect ( Collectors.groupingBy ( ) ) 的用法

文章目录 第一种解释1、基本用法2、指定值收集器3、多级分组4、常见应用场景和用处 第二种解释1、基本语法2、示例3、更复杂的用法 第一种解释 Collectors.groupingBy 是 Java 8 引入的 Stream API 中的一个收集器&#xff08;Collector&#xff09;&#xff0c;它用于将流&am…

【笔记】Qt 按钮控件介绍(QPushButton,QCheckBox,QToolButton)

文章目录 QAbstractButton 抽象类(父类)QAbstractButton 类中的属性QAbstractButton 类中的函数QAbstractButton 类中的信号QAbstractButton 类中的槽 QPushButton 类(标准按钮)QPushButton 类中的属性QPushButton 类中的函数、槽 QCheckBox 类(复选按钮)QCheckBox 类的属性QCh…

Html中,想利用JS引入Jquery文件;$.getScript()无效

在使用$.getScript()时&#xff0c;会爆出错误&#xff1a;ReferenceError: $ is not defined &#xff0c;这是因为没有在JS文件前引入Jquery。 那么可以这样使用&#xff1a;(这个方式只适合放在页面代码最后面使用) (function () {var script window.document.createEleme…

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

ComfyUI 本地部署指南:概念、部署过程、生成图片、共享 WebUI 模型

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要讲解 ComfyUI 的本地部署指南&#xff0c;内容主要包括&#xff1a;ComfyUI 的概念、ComfyUI 本地部署过程、使…

inventor 2021 Inventor 无法访问您的许可。网络许可不可用 也会出现在其他软件上

错误提示一般如下图 Inventor 无法访问您的许可。 无法访问您的许可 最常见的原因有: 未连接到 Internet许可服务器不工作许可服务器找不到有效许可 您可以执行以下操作: 检查是否连接到 Intemnet停止/重新启动许可服务器 如需进一步帮助&#xff0c;您可以: -与 CAD或IT管理…

【全开源】班级管家微信小程序(FastAdmin+ThinkPHP)

班级管家微信小程序 班级管家微信小程序&#xff0c;作为一款专注于家校沟通、作业管理、成绩发布等方面的工具&#xff0c;凭借其丰富的特色功能和显著的优势&#xff0c;已经成为广大教师、家长和学生日常学习生活中不可或缺的一部分。 一、特色功能 家校沟通便捷&#xff…