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

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…

C# 标识符、变量的命名规范

标识符: 定义的变量名 方法名 类名 等用于识别的内容(变量的命名规范) 命名注意事项: 1.不能以数字开头 2.不能有特殊符号(下划线除外) 3.不能有程序关键字 4.不能重复使用一个名字 命名方法(常用): 驼峰命名法 帕斯卡命名法 不建议使用拼音或汉字命名

迈向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;

【示例】MySQL-4类SQL语言-DQL

文章目录 前言DQL | Data Query Language总述 | 涵盖几乎所有关键字的DQL语句单表查询关键字 | 用在Select后面查询内容&#xff1a;表字段查询内容&#xff1a;聚合函数查询内容&#xff1a;[排序函数] [聚合函数] 窗口函数查询内容&#xff1a;表字段函数 关键字 | 用在Where…

【MySQL精通之路】InnoDB(18)-备份与恢复

目录 1.InnoDB备份 1.1 热备份 1.2 冷备份 1.3 使用mysqldump的逻辑备份 2.InnoDB恢复 2.1 实时恢复 2.2 从数据损坏或磁盘故障中恢复 2.3 InnoDB崩溃恢复 2.3.1 表空间发现 2.3.2 Redolog应用程序 2.3.3 未完成交易的回滚 2.3.4 更改缓冲区合并 2.3.5 清除 2.4 …

GPT-3可以用于哪些行业

GPT-3的应用已经渗透到了多个行业&#xff0c;其广泛的用途和强大的能力使得它成为了各行各业的重要工具。以下是一些GPT-3的主要应用领域&#xff1a; 在线客服&#xff1a;GPT-3可以理解和生成人类语言&#xff0c;使得它能够更好地满足用户的需求。它可以根据用户的提问实时…

数据湖对比(hudi,iceberg,paimon,Delta)

Delta 数据湖 Delta 更新原理 update/delete/merge 实现均基于spark的join功能。 定位 做基于spark做流批一体的数据处理 缺点 本质为批处理。强绑定spark引擎。整体性能相较其他数据湖比较差 hudi 数据湖 hudi 更新原理 通过hudi自定义的主键索引hoodiekey 布隆过…

Ali-Sentinel-集群流控

归档 GitHub: Ali-Sentinel-集群流控 测试 参考&#xff1a;热点流控-测试 新建 ClusterDemoApplication2 public class ClusterDemoApplication2 {public static void main(String[] args) {System.setProperty("csp.sentinel.dashboard.server", "127.0.…

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

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

docker使用PostgreSQL容器

要执行 db/migrations/ 目录下的多个 SQL 文件以迁移数据库&#xff0c;可以按照以下步骤进行&#xff1a; 1 确认 PostgreSQL 容器正在运行&#xff1a; 确认你已经启动了 PostgreSQL 容器并且它在运行&#xff1a; docker ps -a2 确认容器 beaconchain 是 Up 状态。 将 SQ…

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的文件资源管理器是一个功能强大的工具。你知道吗,有四种不同的方法可以…

电商API接口接入电商平台抓取热门商品推荐上货api接入示例

电商API接口接入电商平台抓取热门商品推荐上货的示例代码如下&#xff1a; # coding:utf-8 """ Compatible for python2.x and python3.x requirement: pip install requests """ from __future__ import print_function import requests # 请求…

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

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

智能驾驶核心伪代码

智能驾驶是一个复杂且广泛的领域&#xff0c;涉及多个子系统和组件&#xff0c;包括但不限于感知、定位、决策规划、控制等。由于智能驾驶系统的复杂性&#xff0c;不可能简单地提供一个通用的代码片段。然而&#xff0c;我可以提供一个简单的示例&#xff0c;展示如何使用一些…