監控表使用情況的Package

2021-09-05 22:08:45 字數 3621 閱讀 5010

今天編寫了乙個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...