巧用shell指令碼生成快捷指令碼

yuntui發表於2016-11-03
在升級的過程中,可能需要準備一些額外的指令碼,比如說做資料遷移的時候為了考慮效能,需要做如下的額外工作:
1.將部分表置為nologging
2.將部分index置為nologging
3.將部分foreign key constraint置為disable
4.將部分trigger 置為disable
在完成資料升級後,再置為logging,enable狀態。
但是在準備指令碼的過程中,總是為這些小指令碼而頭疼,可能在升級前臨時增加了一些表或者取消了部分表。或者有了其他的變更,維護這些指令碼就顯得有些體力工作了。
最後下決心改變這種狀態,直接根據規則生成新的指令碼。在不同的環境中指令碼內容可能略有不同,但是功能不打折。
首先需要準備一個檔案tablst,裡面是檔案的列表
比如:
table1
table2
table3
...

然後使用如下的指令碼,就能生成完整的指令碼,在升級前nologging,disable的工作就生成指令碼到pre目錄下,logging,enable的工作就生成指令碼到post目錄下
指令碼內容也沒有了冗餘。

logging_flag=logging
nologging_flag=nologging
disable_flag=disable
enable_flag=enable
awk '{print "'\''" $1 "'\''" ","}' ../parfile/tablst |sed -e '/^$/d' -e '$s/.$//' > tablst.temp
table_list=`cat tablst.temp`


function pre_act
{
logging_ind=$1
enable_ind=$2
act_type=$3
     sqlplus -s $4 <<EOS
     set feedback off
     set pages 0
     set linesize 200
     spool $act_type/tab_$logging_ind.sql
     prompt -- table $logging_ind
     select 'alter table '||table_name||' $logging_ind;' from user_tables where  table_name in ($table_list);
     spool off;
     spool $act_type/index_$logging_ind.sql
     prompt -- index $logging_ind
     select 'alter index '||index_name||' $logging_ind;' from user_indexes where table_name in ($table_list);
     spool off;
     spool $act_type/fk_constraint_$disable_flag.sql
     prompt --FK constraint $enable_ind
     SELECT
           'ALTER TABLE '||TABLE_NAME||' $enable_ind  CONSTRAINT '|| CONSTRAINT_NAME||';' FROM USER_CONSTRAINTS WHERE
            CONSTRAINT_TYPE='R' UNION SELECT 'ALTER TABLE '||UCA.TABLE_NAME||' DISABLE  CONSTRAINT '|| UCA.CONSTRAINT_NAME||';'
     FROM
            USER_CONSTRAINTS UCA , 
            (SELECT  CONSTRAINT_NAME
               FROM  USER_CONSTRAINTS
               WHERE CONSTRAINT_TYPE IN ('P','U')
     ) tmp
     WHERE UCA.CONSTRAINT_TYPE = 'R' 
       AND tmp.constraint_name = UCA.R_CONSTRAINT_NAME
       and UCA.table_name in ($table_list) ;
     spool off;
     spool $act_type/trigger_disable.sql
     prompt trigger disable
     SELECT
           'ALTER TRIGGER ' ||TRIGGER_NAME||' $enable_ind ;'
     FROM
            USER_TRIGGERS;
     spool off;
EOS
}


pre_act  $nologging_flag $disable_flag pre $1
pre_act  $logging_flag   $enable_flag  post $1

指令碼生成的sql指令碼如下:
pre > 
total 83
-rw-r--r-- 1 xxxx dba 11280 Jun 23 21:00 fk_constraint_disable.sql
-rw-r--r-- 1 xxxx dba 42631 Jun 23 21:00 index_nologging.sql
-rw-r--r-- 1 xxxx dba 13888 Jun 23 21:00 tab_nologging.sql
-rw-r--r-- 1 xxxx dba   621 Jun 23 21:00 trigger_disable.sql

post > ls -lrt
total 69
-rw-r--r-- 1 xxxx dba 13886 Jun 23 21:00 tab_logging.sql
-rw-r--r-- 1 xxxx dba 42629 Jun 23 21:00 index_logging.sql
-rw-r--r-- 1 xxxx dba 11279 Jun 23 21:00 fk_constraint_disable.sql
-rw-r--r-- 1 xxxx dba   621 Jun 23 21:00 trigger_disable.sql

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

相關文章