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流程,可构建出既高效又可靠的数据库管理自动化解决方案。实践过程中,不断迭代优化,结合具体项目需求灵活调整,是实现长期成功的关键。