利用shell脚本生成动态sql

简介: 在一些分布式环境中,可能涉及到的数据库有很多,相关的数据库用户也不少,有些看似简单的变更可能需要在不同的库,不同的用户间要进行复杂的操作。 现在我们有3套环境,一套是测试环境test,一套是准生产环境xprd,一套是生产环境prod, 比如在prod上有5个库一共20个用户,某一个变更可能在这20个用户里面要进行一些的操作。
在一些分布式环境中,可能涉及到的数据库有很多,相关的数据库用户也不少,有些看似简单的变更可能需要在不同的库,不同的用户间要进行复杂的操作。
现在我们有3套环境,一套是测试环境test,一套是准生产环境xprd,一套是生产环境prod,
比如在prod上有5个库一共20个用户,某一个变更可能在这20个用户里面要进行一些的操作。xprd里面和生产环境类似,也有数据库用户,test环境中有10个用户,需要在这10个用户中进行相应的操作。
最开始的时候,使用sqlplus和shell脚本,如下
sqlplus  -s dbuser1/dbuser1@test xxxxx
EOF
exit
。。。。。

但是发现每次在测试环境中部署的时候,得重新修改所有的用户名密码和数据库实例,在测试环境部署了之后,在准生产环境还得重新改一次,到生产环境还是得修改,每次改动都得花费不少的时间和精力,反复验证数据库连接串是否正确。如果脚本中有使用到db link,db link的名字也可能不一样,修改的时候就可能会漏掉。
每次做变更都很头疼。
这一次是下定决心来做改变了,决定使用shell脚本来生成动态的sql,通过将变量嵌入到sql中达到动态的效果。
下面是需要用到的环境变量,每一个后面都是一些数据库连接串。
专门用一个shell脚本来保存这些变量,conn_init.sh
export testwork_conn=testtestWORK/TESTtestwork@TESTCUS1
export testwait_conn=testtestWAIT/TESTtestwait@TESTCUS1
export testssca_conn=testtestSSCA/TESTtestssca@TESTCUS1 
export testsscb_conn=testtestSSCB/TESTtestsscb@TESTCUS1 
export DIS1_testssca_conn=testDIS1SSCA/TESTDIS1ssca@TESTDIS1
export DIS1_testsscb_conn=testDIS1SSCB/TESTDIS1sscb@TESTDIS1
export DIS2_testssca_conn=testDIS2SSCA/TESTDIS2ssca@TESTDIS2  
export DIS2_testsscb_conn=testDIS2SSCB/TESTDIS2sscb@TESTDIS2  
export DIS3_testssca_conn=testDIS3SSCA/TESTDIS3ssca@TESTDIS3  
export DIS3_testsscb_conn=testDIS3SSCB/TESTDIS3sscb@TESTDIS3 
export DIS4_testssca_conn=testDIS4SSCA/TESTDIS4ssca@TESTDIS4  
export DIS4_testsscb_conn=testDIS4SSCB/TESTDIS4sscb@TESTDIS4 
export CUST_DBA_conn=testdba/testdba@TESTCUS1 
export DIS1_DBA_conn=testdba/testdba@TESTDIS1 
export DIS2_DBA_conn=testdba/testdba@TESTDIS2
export DIS3_DBA_conn=testdba/testdba@TESTDIS3
export DIS4_DBA_conn=testdba/testdba@TESTDIS4
export opr_conn=testOPRC/TESTOPRC@TESTCUS1   
export test_mst_ins=testtestWAIT.TESTCUS1


然后在所有的sql脚本中,来引用这些变量,使没个脚本在执行前对应的环境变量都生效。
脚本的内容可能是下面的样子:
chmod +x ./conn_init.sh
. ./conn_init.sh


sqlplus  $ testwork_conn
spool    TEST_TAB_CHG.log                                                          
set echo on            
CREATE TABLE TEST_TAB_CHG(
        HOT_LINE_NO     VARCHAR2(25)
                CONSTRAINT test_l_HOT_LINE_NO_NN   NOT NULL,
     .....
        FUTURE_3        VARCHAR2(30)) 
 TABLESPACE DATAL01
 LOGGING
;

grant UPDATE on MI9_OUTCOL_CS_HOTLINE to CCBSSOAUSR_SEL;       
!##testtestWAIT
conn  $testwait_conn
CREATE TABLE TEST_TAB_CHG(
      
        FUTURE_3        VARCHAR2(30)) 
 TABLESPACE DATAL01
 LOGGING
;


grant SELECT on TEST_TAB_CHG to testtestWORK_SEL;            
grant SELECT,UPDATE,INSERT,DELETE on TEST_TAB_CHG to testtestWORK_ALL;    



!##testOPRC
conn $opr_conn
Insert into DST_ACTIVE_SNAPSHOT
   (REFTABLENAME, SYS_CREATION.......
commit;   
   
   
!##TESTDIS1
conn $DIS1_testssca_conn
CREATE MATERIALIZED VIEW  TEST_TAB_CHG REFRESH FORCE ON DEMAND                                          
WITH ROWID USING DEFAULT LOCAL ROLLBACK SEGMENT DISABLE QUERY REWRITE AS                              
SELECT *FROM  TEST_TAB_CHG @$ref_mst_ins;                                                          
                                                                                                      
grant SELECT on TEST_TAB_CHG to PUBLIC;                                                     
 
                                          
EOF
exit

可以从上面的脚本看到相关的连接串都会从conn_init.sh中获取,为了确保连接串的正常,可以单独创建一个通用的文件,对已经存在的表来进行测试,比如说存在的表是TEST在所有的用户中都存在。
比如:
test.sh
 sqlplus $testwork_conn select count(*)from TEST where rownum conn  $testwait_conn
select count(*)from TEST where rownum
conn  $testssca_conn
select count(*)from TEST where rownum
conn $ testsscb_conn
select count(*)from TEST where rownum
。。。。。
EOF
exit

这样随时可以进行简单的测试,不用为连接串而苦恼了,可以专心考虑业务部分了。
目录
相关文章
|
21天前
|
弹性计算 Shell Perl
ecs服务器shell常用脚本练习(二)
【4月更文挑战第1天】shell代码训练(二)
104 1
|
24天前
|
Java Shell
SpringBoot启动脚本Shell
SpringBoot启动脚本Shell
16 0
|
1天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
22 3
|
5天前
|
运维 监控 Shell
利用Shell脚本编写局域网监控软件:实时监测主机连接情况
本文介绍了如何使用Shell脚本创建一个局域网监控工具,以实时检查主机连接状态。脚本包括扫描IP地址范围检测主机可达性及使用`netstat`监控ESTABLISHED连接。此外,还展示了如何每60秒将连接数数据自动提交到指定网站API,以便实时跟踪网络活动。这个自动化监控系统有助于提升网络安全性和故障排查效率。
23 0
|
6天前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句
|
7天前
|
JSON 运维 监控
训练shell常用脚本练习(三)
【4月更文挑战第14天】shell代码训练(三)
22 1
|
10天前
|
存储 弹性计算 Shell
ecs服务器shell常用脚本练习(十)
【4月更文挑战第11天】shell代码训练(十)
140 0
|
11天前
|
弹性计算 Shell Go
ecs服务器shell常用脚本练习(九)
【4月更文挑战第10天】shell代码训练(八)
131 0
|
14天前
|
弹性计算 Shell Linux
ecs服务器shell常用脚本练习(六)
【4月更文挑战第4天】shell代码训练(六)
108 0
|
19天前
|
弹性计算 Shell 应用服务中间件
ecs服务器shell常用脚本练习(四)
【4月更文挑战第4天】shell代码训练(四)
96 0