terça-feira, 13 de abril de 2010

Monitorando data/hora de último acesso em objetos

Olá a todos,

A carta traduzida do VP da IBM gerou um volume alto de acessos no meu blog, estou postando outro artigo para dar um quebrada no gelo, não é nada novo no Informix porém surgiu de uma necessidade diária de DBAS.

Para uma necessidade especifica elaborei um script para monitorar a data/hora de acesso.

Segue abaixo a estrutura da tabela:

create table dba_tab_stat
(objpartnum integer,
objname varchar(28),
objcreated date,
objlastacc datetime year to second
)

create unique index key001dbatabstat on dba_tab_stat (objpartnum,objname);
create index key002dbatabstat on dba_tab_stat (objname);

O shell script deve ser construido com o codigo abaixo:

vi mon_read.sh

------------------------------------------------------------------------------------

while true
do

dbaccess ibs << FIM


select partnum, tabname, today created
from sysmaster:systabnames a
where not exists (select 1 from dba_tab_stat where objname = a.tabname)
into temp x with no log;


insert into ibs:dba_tab_stat (objpartnum, objname, objcreated, objlastacc)
select *, '' from x
where partnum not in( select dbsnum*1048576 from sysmaster:sysdbspaces
where is_temp=1);

select * from sysmaster:sysptprof into temp prof1 with no log;
!sleep 60
select * from sysmaster:sysptprof into temp prof2 with no log;

create index ix01prof1 on prof1(partnum);
update statistics low for table prof1;

select partnum, tabname, bufreads
from prof2
where not exists (select 1 from prof1 where prof1.partnum=prof2.partnum )
into temp t_buffreads with no log;

insert into t_buffreads
select partnum, tabname, bufreads
from prof2
where exists
(select 1 from prof1 where prof1.partnum=prof2.partnum and prof2.bufreads!=prof1.bufreads);

update ibs:dba_tab_stat set objlastacc=current
where exists (select 1 from t_buffreads
where objpartnum=t_buffreads.partnum
and objname=t_buffreads.tabname)

FIM

done
------------------------------------------------------------------------------------

chmod +x mon_read.sh

./mon_read.sh

O shell ficara executando em loop, para consultar a data/hora de ultimo acesso das tabelas é só executar a query abaixo:

select objpartnum, objname, objlastacc
from dba_tab_stat
where objlastacc is not null

objpartnum objname objlastacc

1048579 tab_1048579 2010-04-13 19:12:02
1048585 tab_1048585 2010-04-13 19:11:13
1048597 tab_1048597 2010-04-13 19:08:58
7340064 tab_7340064 2010-04-13 15:54:35
9437190 tab_9437190 2010-04-13 15:57:39
10485762 tab_10485762 2010-04-13 19:08:58
11534339 tab_11534339 2010-04-13 19:11:13
11534341 tab_11534341 2010-04-13 19:11:13
11534347 tab_11534347 2010-04-13 17:33:57
11534349 tab_11534349 2010-04-13 17:11:13
11534351 tab_11534351 2010-04-13 19:11:13
11534353 tab_11534353 2010-04-13 19:08:58


O Script está porém pode ser melhorado, talvez a data/hora de última gravação no objeto, é possivel usar a mesma logica para ter regsitro de ultimo acesso em procedures.

Espero que este tipo de informação faça parte do catálogo do Informix na versão Panther.

Frequentemente ouço queixas dos DBAS SQL Server de algumas informações que o Informix não possue, no caso do Informix o produto foi criado para que os dbas criem suas próprias ferramentas.

Em uma nova versão do script seria interessante converte para a versão 11 do Informix e usar as funções task() e sensor() mas isto vai dar um trabalho e deixo a cargo do Cesar , meu camarada de Jundiai).

Vagner