shell脚本批量执行指定路径下sql脚本

柔情只为你懂 2024-03-31 09:39 258阅读 0赞

shell脚本批量执行指定路径下sql脚本

    1. 场景描述
    1. 创建sql
    1. 创建脚本
    • 3.1 方式一
    • 3.2 方式二

1. 场景描述

Linux环境下通过shell脚本批量执行指定目录下所有sql语句,用来建表建库,初始化项目sql等。
Linux shell在线格式化:https://tool.lu/shell/

2. 创建sql

创建contract_ddl.sql

  1. -- 创建数据库contract_user
  2. CREATE DATABASE `contract_user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  3. -- 创建合同表contract
  4. DROP TABLE IF EXISTS `contract`;
  5. CREATE TABLE `contract` (
  6. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID主键',
  7. `name` varchar(64) NOT NULL COMMENT '合同名称',
  8. `code` varchar(64) NOT NULL COMMENT '合同编号',
  9. `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除 0 未删除 1 删除 默认是0',
  10. `create_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建人账号id',
  11. `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  12. `update_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '更新人账号id',
  13. `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  14. PRIMARY KEY (`id`) USING BTREE,
  15. index `idx_code_name`(`code`,`name`) USING BTREE
  16. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '合同表' ROW_FORMAT = Dynamic;

创建template_ddl.sql

  1. -- 创建数据库template_user
  2. CREATE DATABASE `template_user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  3. -- 模板设置表template
  4. DROP TABLE IF EXISTS `template`;
  5. CREATE TABLE `template` (
  6. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID主键',
  7. `name` bigint(20) NOT NULL COMMENT '模板名称',
  8. `code` bigint(20) NOT NULL COMMENT '模板编码',
  9. `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除 0 未删除 1 删除 默认是0',
  10. `create_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建人账号id',
  11. `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  12. `update_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '更新人账号id',
  13. `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  14. PRIMARY KEY (`id`) USING BTREE,
  15. index `idx_code_name`(`code`, `name`) USING BTREE
  16. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '模板表' ROW_FORMAT = Dynamic;

3. 创建脚本

3.1 方式一

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

  1. #!/bin/sh
  2. start_date=`date '+%Y%m%d-%H%M%S'`
  3. echo $start_date ${
  4. USER} "execute ddl start..."
  5. # mysql
  6. shost=127.0.0.1
  7. sport=3306
  8. suser=root
  9. spwd=123456
  10. # path,sql放入ddl下
  11. sqlpath="source /home/ddl/"
  12. sqlsource="${sqlpath}contract_ddl.sql;${sqlpath}template_ddl.sql;"
  13. # 执行sql脚本,这里会有告警,不影响执行,提示直接输入密码不安全,去掉-p后的spwd,执行时输入安全
  14. # Warning: Using a password on the command line interface can be insecure.
  15. mysql -h$shost -p$sport -u$suser -p$spwd -e"$sqlsource"
  16. # end
  17. end_date=`date '+%Y%m%d-%H%M%S'`
  18. echo $end_date ${
  19. USER} "execute ddl end..."

3.2 方式二

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

  1. #!/bin/bash
  2. #execute all script in specified directory
  3. MYDATE=$(date +%F'-'%T'-'%w)
  4. MYSQL_PATH=/tmp/scripts #指定的目录
  5. LOG_FILE=/tmp/scripts/exec_${MYDATE}.log
  6. confirm=
  7. db_name=
  8. db_pass=
  9. for file in ${MYSQL_PATH}/*; do
  10. if [ -f "$file" ]; then
  11. postfix=$(echo $file | awk -F'.' '{print "."$NF}')
  12. if [ $postfix = ".sql" ]; then
  13. if [ ! $db_name ]; then #如果没有指定数据库
  14. read -p "请输入数据库名:" db_name
  15. read -p "你输入的数据名是【$db_name】,确认继续请输入--yes--: " confirm
  16. fi
  17. if [ "$confirm" = "yes" ] && [ -n $confirm ]; then
  18. if [ ! $db_pass ]; then #如果没有设置密码
  19. stty -echo #密码输入保护关闭显示
  20. read -p "请输入数据库密码:" db_pass
  21. echo -e "\n"
  22. stty echo
  23. fi
  24. mysql -uroot -p$db_pass -P3306 --default-character-set=utf8 ${db_name} <$file >&error.log
  25. echo $file
  26. echo -e "\n===========$file=============\n" >>${LOG_FILE}
  27. cat error.log >>${LOG_FILE} #输出执行日志
  28. error=$(grep ERROR error.log) #读取错误日志信息
  29. if [ -n "$error" ]; then #如果有错误就退出程序
  30. echo $error
  31. exit
  32. fi
  33. else
  34. echo "您已经取消操作!"
  35. exit
  36. fi
  37. fi
  38. fi
  39. done

发表评论

表情:
评论列表 (有 0 条评论,258人围观)

还没有评论,来说两句吧...

相关阅读

    相关 plsql批量执行脚本

    如果脚本数量很多,手动执行脚本效率很低,而且如果涉及到多个用户的切换,那就更耗时了。 因此,这种情况批量执行就变得很重要。   在Oracle中批量执行脚本其实很简单。