利用shell指令碼生成動態sql
在一些分散式環境中,可能涉及到的資料庫有很多,相關的資料庫使用者也不少,有些看似簡單的變更可能需要在不同的庫,不同的使用者間要進行復雜的操作。
現在我們有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;
。。。。。
現在我們有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
這樣隨時可以進行簡單的測試,不用為連線串而苦惱了,可以專心考慮業務部分了。
exit
這樣隨時可以進行簡單的測試,不用為連線串而苦惱了,可以專心考慮業務部分了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-2127757/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell動態指令碼和pl/sql動態指令碼的比較指令碼SQL
- [Shell] Shell 生成 HTML指令碼HTML指令碼
- 利用shell指令碼監控網站狀態指令碼網站
- 使用shell指令碼生成只讀許可權的sql指令碼指令碼SQL
- sqlplus動態生成linux shell指令碼並執行SQLLinux指令碼
- 巧用shell指令碼生成快捷指令碼指令碼
- 自動ftp,生成control file,sql*load的shell指令碼FTPSQL指令碼
- 利用SCHEDULER呼叫shell指令碼指令碼
- 使用shell生成orabbix自動化配置指令碼指令碼
- PowerDesigner: 利用sql指令碼檔案逆生成模型SQL指令碼模型
- 透過shell指令碼定位效能sql和生成報告指令碼SQL
- 通過shell指令碼定位效能sql和生成報告指令碼SQL
- 使用sql生成sql指令碼SQL指令碼
- shell指令碼實現自動生成awr報告指令碼
- shell指令碼自動化採集效能sql指令碼SQL
- SQL Server映象自動生成指令碼方法SQLServer指令碼
- 透過shell指令碼生成查詢表資料的sql指令碼SQL
- 通過shell指令碼生成查詢表資料的sql指令碼SQL
- 一個自動生成awr報告的shell指令碼指令碼
- [Shell] Shell 生成 HTML指令碼,可顯示錶格HTML指令碼
- Xcode新增Shell指令碼打包靜態庫和動態庫XCode指令碼
- 利用shell指令碼統計程式碼行數指令碼
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- Linux/Unix shell 指令碼中呼叫SQL,RMAN指令碼Linux指令碼SQL
- 使用批處理指令碼或SHELL配合SQL指令碼指令碼SQL
- shell指令碼-免互動指令碼
- 如何用Shell指令碼生成XML檔案指令碼XML
- iOS使用指令碼跟隨工程程式碼動態生成FrameworkiOS指令碼Framework
- 【Shell】使用Shell指令碼快速完成SQL指令碼中重複枯燥的任務指令碼SQL
- android 利用shell指令碼重新打包簽名Android指令碼
- IDEA 利用groovy指令碼生成註釋Idea指令碼
- 巧用shell生成資料庫檢查指令碼資料庫指令碼
- 生成sql monitor active report指令碼SQL指令碼
- sql server 資料指令碼生成工具SQLServer指令碼
- 利用shell指令碼實現計劃任務功能指令碼
- shell指令碼指令碼
- ORACLE自動備份shell指令碼Oracle指令碼
- svn and maven 自動部署shell指令碼Maven指令碼