今天編寫了乙個oracle的package,分享給大家。
背景是這樣的:現有的系統是從其他公司的系統移植過來的,因此有很多表都是對原來的那個公司定製的,而在移植過來之後,因為不適合業務的需求,所以就沒有使用,而長期以來也沒有人對其加以整理,因此造成系統中有很多冗餘的表,這對於系統的維護造成了很多不便,所以想要看看系統中到底哪些表是根本沒有使用的,對於這些表檢查出來之後,要做刪除。(當前系統中有2400多個表啊,初步估計其中大約有一半以上都是出於不使用的狀態)
package裡面的內容比較簡單,就是先建立了乙個表,用來儲存所有表以及是否使用的狀態。初始的時候,會把系統中所有錶抓過來,然後把使用狀態都設定為n,也就是沒有被使用。
--取得所有的表,並將其放到監控的表中procedure
get_all_tables(v_owner
invarchar2
) is
begin
insert
into
table_usage
(owner
,table_name
,is_using
,modify_date
)select
a.owner
,a.table_name,'
n'--初始的時候預設為n
,sysdate
from
all_all_tables a
where
a.owner
=v_owner
anda.status ='
valid';
commit
;end
get_all_tables;
然後會在每個表上建立乙個觸發器,當對於指定的表,有插入操作的時候,就會修改表table_usage,將使用標誌設定為y,也就是正在使用的狀態。
--為所有表建立觸發器,以進行監控
--根據table_usage表中的情況來建立
procedure
create_all_triggers
iscursor
cur_tables
isselect
owner
,table_name
from
table_usage
where
is_using ='
n';strcreatesql
varchar2
(32767
);begin
--遍歷所有表,為其建立系統觸發器,從而監控使用的情況
forrec_tables
incur_tables loop
strcreatesql :=''
;strcreatesql :
=strcreatesql ||'
create or replace trigger tri_mu_'||
rec_tables.owner ||'
_'||rec_tables.table_name ||'
';strcreatesql :
=strcreatesql ||'
after insert on '||
rec_tables.owner ||'
.'||rec_tables.table_name ||'
';strcreatesql :
=strcreatesql ||'
for each row ';
strcreatesql :
=strcreatesql ||'
';strcreatesql :
=strcreatesql ||'
begin ';
strcreatesql :
=strcreatesql ||'
';strcreatesql :
=strcreatesql ||'
update table_usage ';
strcreatesql :
=strcreatesql ||'
set is_using = ''y
''';strcreatesql :
=strcreatesql ||'
,modify_date = sysdate ';
strcreatesql :
=strcreatesql ||'
where owner =
'''||
rec_tables.owner
||'''';
strcreatesql :
=strcreatesql ||'
and table_name =
'''||
rec_tables.table_name
||'''; '
;strcreatesql :
=strcreatesql ||'
';strcreatesql :
=strcreatesql ||'
end tri_mu_'||
rec_tables.owner ||'
_'||rec_tables.table_name ||'
; ';execute
immediate strcreatesql;
endloop;
endcreate_all_triggers;
最後需要定期清理這些觸發器,儘管不會浪費太多的效能,但畢竟也會浪費,所以就有乙個清理觸發器的過程:
--為確定正在使用的表清理觸發器
procedure
clear_triggers
iscursor
cur_used_tables
isselect
owner
,table_name
from
table_usage a
where
a.is_using ='
y';strcleartriggersql
varchar2
(32767
);begin
forrec_used_table
incur_used_tables loop
strcleartriggersql :='
drop trigger tri_mu_'||
rec_used_table.owner ||'
_'||rec_used_table.table_name ||'
;';execute
immediate strcleartriggersql;
endloop;
exception
when
others
then
dbms_output.put_line(
'there is an exception -- trigger not exists--');
endclear_triggers;
需要說明的有兩點:
1、因為需要在package內執行建立和刪除觸發器的操作,所以需要確保有執行該項操作的許可權。
2、本來想要試著在table_usage表上增加乙個觸發器,一旦使用標誌由n變為y,那麼就自動刪除相應的表上的觸發器,但是沒能實現,有時間繼續試驗。
監控表使用情況的Package
今天編寫了乙個oracle的package,分享給大家。背景是這樣的 現有的系統是從其他公司的系統移植過來的,因此有很多表都是對原來的那個公司定製的,而在移植過來之後,因為不適合業務的需求,所以就沒有使用,而長期以來也沒有人對其加以整理,因此造成系統中有很多冗餘的表,這對於系統的維護造成了很多不便,...
監控linux磁碟使用情況
一.配置mail 1.安裝mail yum y install mailx 2.調整配置檔案 vi etc mail.rc 在最後兩行增加如下語句 set from abc qq.com smtp smtp.exmail.qq.com set smtp auth user abc qq.com sm...
nmon監控linux資源使用情況
mkdir root tmp nmon 建立乙個解壓內容目錄 解壓內容到指定目錄 chmod x root tmp nmon 賦予該目錄下內容有執行許可權。root tmp nmon nmon x86 64 centos6 執行該程式,比如說我現在用的是centos6.5 64位,那麼我們就選擇nm...