正文

shell脚本批量执行指定路径下sql脚本的实现(批量执行shell命令)原创

文章摘要

文章介绍了在Linux环境下通过Shell脚本批量执行指定目录下的所有SQL语句,用于创建数据库和表,以及初始化项目SQL。文章提出了两种方式:方式一需要手动指定SQL全路径,相对麻烦;方式二通过脚本遍历指定目录下的所有SQL文件,自动执行,相对方便。两种方式均附有详细的实现示例,帮助用户理解操作流程。文章还提到了注意事项,如处理密码输入和错误日志的输出,确保操作的安全性和稳定性。通过这篇文章,读者可以掌握通过Shell脚本实现高效、安全的SQL批量执行操作。


目录1. 场景描述2. 创建sql3. 创建脚本3.1 方式一3.2 方式二

Linux环境下通过shell脚本批量执行指定目录下所有sql语句,用来建表建库,初始化项目sql等。

Linux shell在线格式化:https://tool.lu/shell/

创建contract_ddl.sql

— 创建数据库contract_user CREATE DATABASE `contract_user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; — 创建合同表contract DROP TABLE IF EXISTS `contract`; CREATE TABLE `contract` ?( ? `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘ID主键’, ? `name` varchar(64) NOT NULL COMMENT ‘合同名称’, ? `code` varchar(64) NOT NULL COMMENT ‘合同编号’, ? `deleted` tinyint NOT NULL DEFAULT 0 COMMENT ‘是否删除 0 未删除 1 删除 默认是0’, ? `create_id` bigint(20) NOT NULL DEFAULT 0 COMMENT ‘创建人账号id’, ? `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’, ? `update_id` bigint(20) NOT NULL DEFAULT 0 COMMENT ‘更新人账号id’, ? `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ?COMMENT ‘更新时间’, ? ? PRIMARY KEY (`id`) USING BTREE, ? index `idx_code_name`(`code`,`name`) USING BTREE ) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=’合同表’ ROW_FORMAT=Dynamic;

创建template_ddl.sql

— 创建数据库template_user CREATE DATABASE `template_user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; — 模板设置表template DROP TABLE IF EXISTS `template`; CREATE TABLE `template` ?( ? `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘ID主键’, ? `name` bigint(20) NOT NULL COMMENT ‘模板名称’, ? `code` bigint(20) NOT NULL COMMENT ‘模板编码’, ? `deleted` tinyint NOT NULL DEFAULT 0 COMMENT ‘是否删除 0 未删除 1 删除 默认是0’, ? `create_id` bigint(20) NOT NULL DEFAULT 0 COMMENT ‘创建人账号id’, ? `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’, ? `update_id` bigint(20) NOT NULL DEFAULT 0 COMMENT ‘更新人账号id’, ? `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ?COMMENT ‘更新时间’, ? ? PRIMARY KEY (`id`) USING BTREE, ? index `idx_code_name`(`code`, `name`) USING BTREE ) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=’模板表’ ROW_FORMAT=Dynamic;

方式一需要手动指定sql全路径名称,相对比较麻烦,仅供参考。

#!/bin/sh start_date=`date ‘+%Y%m%d-%H%M%S’` echo $start_date ${USER} “execute ddl start…” # mysql shost=127.0.0.1 sport=3306 suser=root spwd=123456 # path,sql放入ddl下 sqlpath=”source /home/ddl/” sqlsource=”${sqlpath}contract_ddl.sql;${sqlpath}template_ddl.sql;” # 执行sql脚本,这里会有告警,不影响执行,提示直接输入密码不安全,去掉-p后的spwd,执行时输入安全 # Warning: Using a password on the command line interface can be insecure. mysql -h$shost -p$sport -u$suser -p$spwd -e”$sqlsource” # end end_date=`date ‘+%Y%m%d-%H%M%S’` echo $end_date ${USER} “execute ddl end…”

方式二只需要指定sql路径即可,通过shell遍历,相对方便。

#!/bin/bash #execute all script in specified directory MYDATE=$(date +%F’-‘%T’-‘%w) MYSQL_PATH=/tmp/scripts #指定的目录 LOG_FILE=/tmp/scripts/exec_${MYDATE}.log confirm=db_name=db_pass=for file in ${MYSQL_PATH}/*; do ?if [ -f “$file” ]; then ? ?postfix=$(echo $file | awk -F’.’ ‘{print “.”$NF}’) ? ?if [ $postfix=”.sql” ]; then ? ? ?if [ ! $db_name ]; then #如果没有指定数据库 ? ? ? ?read -p “请输入数据库名:” db_name ? ? ? ?read -p “你输入的数据名是【$db_name】,确认继续请输入–yes–: ” confirm ? ? ?fi ? ? ?if [ “$confirm”=”yes” ] && [ -n $confirm ]; then ? ? ? ?if [ ! $db_pass ]; then #如果没有设置密码 ? ? ? ? ?stty -echo #密码输入保护关闭显示 ? ? ? ? ?read -p “请输入数据库密码:” db_pass ? ? ? ? ?echo -e “\n” ? ? ? ? ?stty echo ? ? ? ?fi ? ? ? ?mysql -uroot -p$db_pass -P3306 –default-character-set=utf8 ${db_name} <$file >&error.log ? ? ? ?echo $file ? ? ? ?echo -e “\n===========$file=============\n” >>${LOG_FILE} ? ? ? ?cat error.log >>${LOG_FILE} ? #输出执行日志 ? ? ? ?error=$(grep ERROR error.log) #读取错误日志信息 ? ? ? ?if [ -n “$error” ]; then #如果有错误就退出程序 ? ? ? ? ?echo $error ? ? ? ? ?exit ? ? ? ?fi ? ? ?else ? ? ? ?echo “您已经取消操作!” ? ? ? ?exit ? ? ?fi ? ?fi ?fi done

到此这篇关于shell脚本批量执行指定路径下sql脚本的实现的文章就介绍到这了,更多相关shell批量执行sql脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:shell在指定目录下批量执行sql脚本的实例shell脚本批量复制及执行命令的示例详解