巧用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 生成 HTML指令碼HTML指令碼
- 巧用shell指令碼統計磁碟使用情況指令碼
- 使用shell指令碼生成只讀許可權的sql指令碼指令碼SQL
- 利用shell指令碼生成動態sql指令碼SQL
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- 巧用shell指令碼分析資料庫使用者指令碼資料庫
- shell指令碼指令碼
- [Shell] Shell 生成 HTML指令碼,可顯示錶格HTML指令碼
- 如何用Shell指令碼生成XML檔案指令碼XML
- 生成insert指令碼的指令碼指令碼
- shell指令碼(二)指令碼
- shell指令碼心得指令碼
- shell指令碼案例指令碼
- 常用shell指令碼指令碼
- 使用Mac自定義快捷鍵執行shell指令碼Mac指令碼
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- Shell指令碼匯入外部指令碼內容指令碼
- 使用shell生成orabbix自動化配置指令碼指令碼
- 9、在Shell指令碼中呼叫其他指令碼指令碼
- shell指令碼:一鍵安裝LAMP、LNMP指令碼指令碼LAMPLNMP
- 如何加密shell指令碼加密指令碼
- 初識shell指令碼指令碼
- 執行shell指令碼指令碼
- Shell 指令碼語句指令碼
- shell 指令碼加密 | shc指令碼加密
- Linux Shell指令碼Linux指令碼
- shell指令碼例項指令碼
- 【指令碼】shell語法指令碼
- shell指令碼舉例指令碼
- Shell指令碼基礎指令碼
- Linux shell 指令碼Linux指令碼
- Shell 指令碼編寫指令碼
- shell指令碼總結指令碼
- shell 指令碼寫法:指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- shell指令碼實現自動生成awr報告指令碼
- Linux/Unix shell 指令碼中呼叫SQL,RMAN指令碼Linux指令碼SQL