巧用shell指令碼生成快捷指令碼
在升級的過程中,可能需要準備一些額外的指令碼,比如說做資料遷移的時候為了考慮效能,需要做如下的額外工作:
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell指令碼指令碼
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- shell指令碼案例指令碼
- 常用shell指令碼指令碼
- Linux Shell指令碼Linux指令碼
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- 使用Mac自定義快捷鍵執行shell指令碼Mac指令碼
- shell 指令碼加密 | shc指令碼加密
- 執行shell指令碼指令碼
- Shell 指令碼語句指令碼
- 初識shell指令碼指令碼
- 【指令碼】shell語法指令碼
- shell 指令碼寫法:指令碼
- 如何加密shell指令碼加密指令碼
- shell指令碼總結指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- redolog生成指令碼指令碼
- [20231023]生成bbed的執行指令碼(bash shell).txt指令碼
- shell指令碼-免互動指令碼
- 【shell】磁碟監控指令碼指令碼
- linux常用的shell指令碼Linux指令碼
- Shell指令碼最佳實踐指令碼
- shell指令碼——基本運算子指令碼
- Shell指令碼應用(三)指令碼
- 前端釋出shell指令碼前端指令碼
- shell指令碼之迴圈指令碼
- 批次解壓shell指令碼指令碼
- 通用程式部署shell指令碼指令碼
- shell指令碼報錯:[: missing `]‘指令碼
- 程式碼上線的shell指令碼指令碼
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- sqoop指令碼批量生成OOP指令碼
- Shell指令碼實現生成SSL自簽署證書指令碼
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- Shell指令碼 | 抓取log檔案指令碼
- shell指令碼文字處理工具指令碼
- linux shell指令碼中 =~ 的作用Linux指令碼
- shell指令碼正規表示式指令碼
- Linux 【Shell指令碼經典案例】Linux指令碼