postgresql|数据库|批量执行SQL脚本文件的shell脚本

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: postgresql|数据库|批量执行SQL脚本文件的shell脚本

前言:

对于数据库的维护而言,肯定是有SQL脚本的执行,例如,某个项目需要更新,那么,可能会有很多的SQL脚本需要执行,SQL脚本可能会包含有建表,插入数据,索引建立,约束建立,主外键建立等等内容。

那么,几个SQL脚本可能无所谓,navicat或者psql命令行 简简单单的就导入了,但是有的时候脚本会比较多并且有的时候脚本会有执行顺序要求,很显然,navicat会力不从心的,一个个点SQL文件导入也会有遗漏的情况,因此,编写一个可自动执行SQL脚本文件的shell脚本就显得很有必要了。

下面,将就以上需求,编写一个可用的,通用的批量导入SQL脚本。

一,

SQL脚本的内容

#!/bin/bash
#!author zsk
set -eu
#describe 该脚本是批量导入SQL语句的脚本。
#set -eu是检查脚本内的变量,防止空参的情况出现。
#如果SQL脚本遇到错误,将会立刻停止,主要是参数-v ON_ERROR_STOP=1的作用
#变量  $1 是SQL脚本的存放路径,没有对SQL脚本文件的检查,因此,请确定输入的目录正确性
# 该脚本限定运行在非root用户,也就是普通用户下,在执行SQL脚本的同时输出logs文件在普通用户根目录下
#如果有任何错误,可查看日志文件并结合该脚本的控制台输出查找问题并及时解决。
#以下是五个变量,按需要修改即可。
sql_file=`ls $1|grep sql |sort -n`
database=test
pg_user=postgres
port=5432
pwd=$1
mkdir -p $pwd/success
sqlfile_success=$pwd/success
#这个是批量执行SQL文件的入口函数,日志文件放置在了postgresql用户的根目录
#如果有SQL脚本执行失败,脚本将会停止,如果SQL脚本执行成功,将会打印成功执行的SQL脚本名称
#成功执行的脚本将被移动到脚本所在目录下的success目录下,将执行失败的脚本原因找到后
#可再次从失败的SQL脚本执行,等于断点执行。
sql1 ()
{
echo $sql_file
for i in $sql_file
do psql -U$pg_user -p$port -d $database -v ON_ERROR_STOP=1 -f $pwd$i 2>&1 >>~/logs
if [ $? -eq 0 ]
then
echo -e "\033[32m $pwd$i 这个SQL脚本执行成功了!!!!\033[0m"
mv $pwd$i $pwd/success/
echo -e "\033[33m $pwd$i $pwd$i 移动到了success目录下 \033[0m"
else
echo -e "\033[31m $dir$i 这个SQL脚本没有能够执行成功,请查看日志查找原因!!!!\033[0m"
exit
fi
done
}
if [ `whoami` == "root" ]
then
#天蓝底黑字
echo  -e "\033[46;30m 该脚本不能运行在root用户下,请在postgresql用户下运行该脚本,脚本即将结束!!!\033[0m"
sleep 5
exit 
else
read -p "检查SQL文件,请确定文件是否是正确的排列顺序,并做出选择,yes,批量运行指定SQL脚本;no,退出此脚本:" result
echo  -e "\033[35m 将要批量执行的SQL文件如下:$result \033[0m"
case $result in
     "yes")
      sql1
      ;;
      "no")
      echo -e "\033[45;30m 您的选择是no,因此,该脚本将会自行退出了!!!!\033[0m"
      exit 110
      ;;
      *)
      echo -e "\033[41;30m 您的选择不合适,不是yes或者no,请重新运行脚本,慎重输入您的选择!!!\033[0m"
      exit 220
      ;;
esac
fi

二,

脚本功能介绍

以上脚本具有以下功能,并经过了测试,对于多少个SQL脚本,基本都是毫无压力

1,

脚本限定运行在普通用户下,如果是root用户,该脚本将不会被执行

2,

脚本内的变量问题

需要根据自己的实际情况修改变量,主要是这三个变量:

database=test
pg_user=postgres
port=5432

SQL脚本内定义的数据库名称,本例是test数据库,一般情况下,SQL脚本最好还是使用postgre这个超级用户,以确保SQL脚本的正确执行。port是数据库开放的端口,一般都不会是默认的5432端口

3,

shell脚本的逻辑

通过$1也就是外部参数,这个参数是SQL脚本的存放路径,该参数传入脚本后,首先,运行用户检测if语句,判断是非root用户后,将进入下一步,否则脚本退出。

read命令后,接收用户输入,限定在yes,no,或者其它输出的选择,如果是输入的yes,那么,就开始SQL导入,这里是调用上面的函数,函数名称是psql1,如果有一些别的想法还没准备好,那么,输入no,将会退出脚本。如果输错了,也就是其它任意,也会退出脚本,并做一个小的提示:重新运行脚本

sql1函数是脚本的主要功能,通过for循环,读取外部参数$1设定的目录下的所有SQL文件,并按SQL文件的名称排序,并逐个执行。

如果在执行SQL脚本中,SQL脚本有报错,将会停止整个脚本,并在控制台打印出错信息,如果执行成功的,将把成功执行的SQL脚本文件移入$1 目录下新建的success文件夹,也就达到了断点执行的效果。

三,

脚本执行的效果示例:

SQL脚本内容:

[pg1@EULEER ~]$ cat  SQL/1emp-bak.sql 
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.5
-- Dumped by pg_dump version 12.5
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: emp; Type: TABLE; Schema: mytest; Owner: postgres
--
drop  table if  exists mytest.emp ;
CREATE TABLE if not exists mytest.emp (
    empno numeric NOT NULL,
    ename character varying(10),
    job character varying(9),
    mgr numeric,
    hiredate date,
    sal numeric(7,2),
    comm numeric(7,2),
    deptno numeric(2,0)
);
ALTER TABLE mytest.emp OWNER TO postgres;
--
-- Data for Name: emp; Type: TABLE DATA; Schema: mytest; Owner: postgres
--
COPY mytest.emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) FROM stdin;
7369  SMITH CLERK 7902  1980-12-17  800.00  \N  20
7499  ALLEN SALESMAN  7698  1981-02-20  1600.00 300.00  30
7521  WARD  SALESMAN  7698  1981-02-22  1250.00 500.00  30
7566  JONES MANAGER 7839  1981-04-02  2975.00 \N  20
7654  MARTIN  SALESMAN  7698  1981-09-28  1250.00 1400.00 30
7698  BLAKE MANAGER 7839  1981-05-01  2850.00 \N  30
7782  CLARK MANAGER 7839  1981-06-09  2450.00 \N  10
7788  SCOTT ANALYST 7566  0087-04-19  3000.00 \N  20
7839  KING  PRESIDENT \N  1981-11-17  5000.00 \N  10
7844  TURNER  SALESMAN  7698  1981-09-08  1500.00 0.00  30
7876  ADAMS CLERK 7788  0087-05-23  1100.00 \N  20
7900  JAMES CLERK 7698  1981-12-03  950.00  \N  30
7902  FORD  ANALYST 7566  1981-12-03  3000.00 \N  20
7934  MILLER  CLERK 7782  1982-01-23  1300.00 \N  10
\.
--
-- Name: emp pk_emp; Type: CONSTRAINT; Schema: mytest; Owner: postgres
--
ALTER TABLE ONLY mytest.emp
    ADD CONSTRAINT pk_emp PRIMARY KEY (empno);
--
-- Name: emp fk_deptno; Type: FK CONSTRAINT; Schema: mytest; Owner: postgres
--
--ALTER TABLE ONLY mytest.emp
--    ADD CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES mytest.dept(deptno);
--
-- PostgreSQL database dump complete
--

输入no和任意输出的结果:

正确输入yes后的SQL脚本批量执行:

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
54 32
|
4月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
150 1
|
2月前
|
Oracle 安全 关系型数据库
【赵渝强老师】PostgreSQL的参数文件
PostgreSQL数据库的四个主要参数文件包括:`postgresql.conf`(主要配置文件)、`pg_hba.conf`(访问控制文件)、`pg_ident.conf`(用户映射文件)和`postgresql.auto.conf`(自动保存修改后的参数)。视频讲解和详细说明帮助理解各文件的作用。
137 19
|
2月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的控制文件
本文介绍了PostgreSQL数据库的物理存储结构,重点解析了控制文件,包括其重要性及如何通过`pg_controldata`命令查看控制文件内容。控制文件记录了数据库运行的关键信息,如数据库状态、WAL位置等。
133 14
|
2月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
存储 SQL 关系型数据库
【赵渝强老师】PostgreSQL的运行日志文件
PostgreSQL的物理存储结构包括数据文件、日志文件等。运行日志默认未开启,需配置`postgresql.conf`文件中的相关参数如`log_destination`、`log_directory`等,以记录数据库状态、错误信息等。示例配置中启用了CSV格式日志,便于管理和分析。通过创建表操作,可查看生成的日志文件,了解具体日志内容。
|
2月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的数据文件
PostgreSQL的物理存储结构主要包括数据文件、日志文件等。数据文件按oid命名,超过1G时自动拆分。通过查询数据库和表的oid,可定位到具体的数据文件。例如,查询数据库oid后,再查询特定表的oid及relfilenode,即可找到该表对应的数据文件位置。
104 1
|
3月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
101 2
6种方法打造出色的Shell脚本
|
3月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
123 1
|
3月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
123 2

热门文章

最新文章