利用shell脚本生成动态sql(67天)
在一些分布式环境中,可能涉及到的数据库有很多,相关的数据库用户也不少,有些看似简单的变更可能需要在不同的库,不同的用户间要进行复杂的操作。
现在我们有3套环境,一套是测试环境test,一套是准生产环境xprd,一套是生产环境prod,
比如在prod上有5个库一共20个用户,某一个变更可能在这20个用户里面要进行一些的操作。xprd里面和生产环境类似,也有数据库用户,test环境中有10个用户,需要在这10个用户中进行相应的操作。
最开始的时候,使用sqlplus和shell脚本,如下
sqlplus -s dbuser1/dbuser1@test <<EOF
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<<EOF
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 <<EOF
select count(*)from TEST where rownum<2;
conn $testwait_conn
select count(*)from TEST where rownum<2;
conn $testssca_conn
select count(*)from TEST where rownum<2;
conn $ testsscb_conn
select count(*)from TEST where rownum<2;
。。。。。
EOF
exit
这样随时可以进行简单的测试,不用为连接串而苦恼了,可以专心考虑业务部分了。
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。
- IO约束(下)
- 可以通过基类实现的几种功能。vs2008 .net 2.0
- Python基础知识2:字典
- 桶式移位器
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.7 增加了一个js函数的分页方式。
- FireEye报告:揭露新型工控系统恶意软件TRITON
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.6 修改了几个小bug,使用演示。
- Invoke-PSImage:将PS脚本隐藏进PNG像素中并用一行指令去执行它
- linux的内存清理相关知识!
- 一个页面搞定几乎所有的列表需求的实现思路和一点代码。
- 实现 Table 的行交替颜色、选中行变色的一种方法。演示+源码
- 【知识】使用Python来学习数据科学的完整教程
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.4 增加了几个分页算法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [译] React 测试驱动开发:从用户故事到产品
- 计算机基础之位运算 | 按位取反
- 关于php的ini文件相关操作函数浅析
- PHP中的输出缓冲控制
- SpringCloud微服务:基于Nacos组件,整合Dubbo框架
- [译] 使用 microbundle 打包 TypeScript 组件库
- 3分钟短文 | Laravel 获取模型查询生成的SQL语句
- 基于git的测试用例管理方案
- 【赵渝强老师】MongoDB管理用户的认证机制
- 使用Microsoft Teams Updater执行代码
- 腾讯云 Serverless 云函数实现 CKafka 数据转存到 ES
- 软硬件都开源!基于千兆以太网的温度传感应用
- 【赵渝强老师】使用Docker Compose进行服务编排
- Kubernetes Pod入门指南
- Java线程池深度揭秘