巧用shell生成資料庫檢查指令碼

yuntui發表於2016-11-03
在生產環境中需要部署大量的資料變更。對於新增的表,需要注意許可權和同義詞等。但是手動去檢查這些變更是否生效就很麻煩。而且也不易維護,比如寫好了一個指令碼,可能在過一段時間,有一些緊急變更,需要把這些變更加進來,可能就忘了更新檢查指令碼。

考慮到檢查的效能,不想查詢資料,只需要保證能夠正常訪問表即可。所以寫了如下的sql。目標就是透過shell來生成這樣的sql指令碼。
比如對於表TEST,檢查是否可以訪問,如果可以訪問,就顯示錶TEST is accessible...
SELECT decode (count(*),0,rpad(' TEST' ,30,' ')),'is accessible...' comm FROM TEST WHERE ROWNUM<1;

可以採用如下的shell來生成對應的sql指令碼。其中需要考慮單引號在awk中的使用。需要轉義為 " '\'' "才可以。然後透過sqlplus來直接呼叫即可。
grep -i "CREATE TABLE" *.*|grep -v "|sort|uniq|awk"|sort|uniq|awk -F"CREATE TABLE" '{print $2}'|uniq|awk '{print "SELECT decode(count(*) ,0 ,rpad('\''  "$1" '\'',30,'\'' '\''))  tab_name,'\'' is accessible... '\''  comm FROM "$1" WHERE ROWNUM<1;"}' >sanity_check.sql
sqlplus  -s $1 << EOF
set pages 0
@sanity_check.sql
!rm sanity_check.sql 
EOF

來看看效果。
> ksh sanity_check.sh n1/n1
  TEST9_EXT_BILL_STATEMENT        is accessible...
  TEST9_EXT_CHARGE_INFO           is accessible...
  TEST9_ROOT_CHILD_CL_ACTION      is accessible...
  TEST9_ROOT_CHILD_NTWK_ACT       is accessible...
  TEST9_TMP_BAN_AUTO_FIXPATH      is accessible...
  TEST99_MNP_AGR_PARAM             is accessible...
  TEST99_MNP_AGR_SERVICES          is accessible...
  TEST99_MNP_SUB_INFO              is accessible...
  TEST9_ADDRESS_DATA            is accessible...
  TEST9_ADDRESS_HIS             is accessible...
  TEST9_ADDRESS_NAME_LINK       is accessible...
  TEST9_ADR_NM_LINK_HIS         is accessible...
  TEST9_TEST9_RULE_BASE            is accessible...
  TEST9_NAME_DATA               is accessible...
  TEST9_NAME_HIS                is accessible...
  TEST9_PREPAID_RES_HIS         is accessible...
  TEST9_PREPAID_RESOURCE        is accessible...
  TEST9_PREPAID_SUB_HIS         is accessible...


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-2127758/,如需轉載,請註明出處,否則將追究法律責任。

相關文章