前言:
對于數(shù)據(jù)庫的維護(hù)而言,肯定是有SQL腳本的執(zhí)行,例如,某個(gè)項(xiàng)目需要更新,那么,可能會有很多的SQL腳本需要執(zhí)行,SQL腳本可能會包含有建表,插入數(shù)據(jù),索引建立,約束建立,主外鍵建立等等內(nèi)容。
那么,幾個(gè)SQL腳本可能無所謂,navicat或者psql命令行 簡簡單單的就導(dǎo)入了,但是有的時(shí)候腳本會比較多并且有的時(shí)候腳本會有執(zhí)行順序要求,很顯然,navicat會力不從心的,一個(gè)個(gè)點(diǎn)SQL文件導(dǎo)入也會有遺漏的情況,因此,編寫一個(gè)可自動(dòng)執(zhí)行SQL腳本文件的shell腳本就顯得很有必要了。
下面,將就以上需求,編寫一個(gè)可用的,通用的批量導(dǎo)入SQL腳本。
一,
SQL腳本的內(nèi)容
#!/bin/bash
#!author zsk
set -eu
#describe 該腳本是批量導(dǎo)入SQL語句的腳本。
#set -eu是檢查腳本內(nèi)的變量,防止空參的情況出現(xiàn)。
#如果SQL腳本遇到錯(cuò)誤,將會立刻停止,主要是參數(shù)-v ON_ERROR_STOP=1的作用
#變量 $1 是SQL腳本的存放路徑,沒有對SQL腳本文件的檢查,因此,請確定輸入的目錄正確性
# 該腳本限定運(yùn)行在非root用戶,也就是普通用戶下,在執(zhí)行SQL腳本的同時(shí)輸出logs文件在普通用戶根目錄下
#如果有任何錯(cuò)誤,可查看日志文件并結(jié)合該腳本的控制臺輸出查找問題并及時(shí)解決。
#以下是五個(gè)變量,按需要修改即可。
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
#這個(gè)是批量執(zhí)行SQL文件的入口函數(shù),日志文件放置在了postgresql用戶的根目錄
#如果有SQL腳本執(zhí)行失敗,腳本將會停止,如果SQL腳本執(zhí)行成功,將會打印成功執(zhí)行的SQL腳本名稱
#成功執(zhí)行的腳本將被移動(dòng)到腳本所在目錄下的success目錄下,將執(zhí)行失敗的腳本原因找到后
#可再次從失敗的SQL腳本執(zhí)行,等于斷點(diǎn)執(zhí)行。
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 這個(gè)SQL腳本執(zhí)行成功了!?。?!\033[0m"
mv $pwd$i $pwd/success/
echo -e "\033[33m $pwd$i $pwd$i 移動(dòng)到了success目錄下 \033[0m"
else
echo -e "\033[31m $dir$i 這個(gè)SQL腳本沒有能夠執(zhí)行成功,請查看日志查找原因?。。?!\033[0m"
exit
fi
done
}
if [ `whoami` == "root" ]
then
#天藍(lán)底黑字
echo -e "\033[46;30m 該腳本不能運(yùn)行在root用戶下,請?jiān)趐ostgresql用戶下運(yùn)行該腳本,腳本即將結(jié)束?。。033[0m"
sleep 5
exit
else
read -p "檢查SQL文件,請確定文件是否是正確的排列順序,并做出選擇,yes,批量運(yùn)行指定SQL腳本;no,退出此腳本:" result
echo -e "\033[35m 將要批量執(zhí)行的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,請重新運(yùn)行腳本,慎重輸入您的選擇?。。033[0m"
exit 220
;;
esac
fi
二,
腳本功能介紹
以上腳本具有以下功能,并經(jīng)過了測試,對于多少個(gè)SQL腳本,基本都是毫無壓力
1,
腳本限定運(yùn)行在普通用戶下,如果是root用戶,該腳本將不會被執(zhí)行
2,
腳本內(nèi)的變量問題
需要根據(jù)自己的實(shí)際情況修改變量,主要是這三個(gè)變量:
database=test
pg_user=postgres
port=5432
SQL腳本內(nèi)定義的數(shù)據(jù)庫名稱,本例是test數(shù)據(jù)庫,一般情況下,SQL腳本最好還是使用postgre這個(gè)超級用戶,以確保SQL腳本的正確執(zhí)行。port是數(shù)據(jù)庫開放的端口,一般都不會是默認(rèn)的5432端口
3,
shell腳本的邏輯
通過$1也就是外部參數(shù),這個(gè)參數(shù)是SQL腳本的存放路徑,該參數(shù)傳入腳本后,首先,運(yùn)行用戶檢測if語句,判斷是非root用戶后,將進(jìn)入下一步,否則腳本退出。
read命令后,接收用戶輸入,限定在yes,no,或者其它輸出的選擇,如果是輸入的yes,那么,就開始SQL導(dǎo)入,這里是調(diào)用上面的函數(shù),函數(shù)名稱是psql1,如果有一些別的想法還沒準(zhǔn)備好,那么,輸入no,將會退出腳本。如果輸錯(cuò)了,也就是其它任意,也會退出腳本,并做一個(gè)小的提示:重新運(yùn)行腳本
sql1函數(shù)是腳本的主要功能,通過for循環(huán),讀取外部參數(shù)$1設(shè)定的目錄下的所有SQL文件,并按SQL文件的名稱排序,并逐個(gè)執(zhí)行。
如果在執(zhí)行SQL腳本中,SQL腳本有報(bào)錯(cuò),將會停止整個(gè)腳本,并在控制臺打印出錯(cuò)信息,如果執(zhí)行成功的,將把成功執(zhí)行的SQL腳本文件移入$1 目錄下新建的success文件夾,也就達(dá)到了斷點(diǎn)執(zhí)行的效果。
三,
腳本執(zhí)行的效果示例:
SQL腳本內(nèi)容:
[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和任意輸出的結(jié)果:?
正確輸入yes后的SQL腳本批量執(zhí)行:
?文章來源:http://www.zghlxwxcb.cn/news/detail-427997.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-427997.html
到了這里,關(guān)于postgresql|數(shù)據(jù)庫|批量執(zhí)行SQL腳本文件的shell腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!