Compartilhando conhecimento com o mundo

Com tecnologia do Blogger.

Pesquisa

Download

Blogger Tricks

Blogger Themes

Visitas

Assuntos

2/20/2014

Como controlar os recursos utilizados por usuários no banco Informix


Muitas vezes há uma exigência para controlar quando os usuários logaram em um determinado banco de dados, quanto tempo eles acessaram o banco e os recursos que eles usaram. Esta informação pode ser usada para fins de auditoria ou cobrança pelo uso de um banco de dados os recursos consumidos pelo usuário.

O procedimento sysdbopen é executado sempre que os utilizadores emitir com sucesso o DATABASE ou CONNECT declaração para ligar explicitamente a um banco de dados onde os procedimentos são instalados. Você também pode criar o procedimento SPL sysdbclose, que é executado quando o usuário emite o CLOSE DATABASE ou declaração Desconectar para desconectar do banco de dados. O banco de dados sysmaster contém a interface de monitoramento de sistema (SMI) tabelas. As tabelas SMI fornecem informações sobre o estado do servidor de banco de dados. Você pode consultar essas tabelas para identificar gargalos de processamento, determinar o uso de recursos, a sessão de faixa ou atividade do servidor de banco de dados, e assim por diante.

Checando

sysdbopen
[teste:informix]$/export/home/informix> dbschema -d potencial -f sysdbopen

DBSCHEMA Schema Utility       INFORMIX-SQL Version 11.70.FC2

No procedure sysdbopen.
sysdbclose
[teste:informix]$/export/home/informix> dbschema -d potencial -f sysdbclose

DBSCHEMA Schema Utility       INFORMIX-SQL Version 11.70.FC2

No procedure sysdbclose.
Não existe nenhuma configuração nos banco para o public para os dois;

Criando a Tabela

Vamos criar uma tabela para armazenar todos os registros de conexão dos usuários e os recursos que eles consumiram. Esta tabela precisa ser criado no banco de dados que queremos monitorar as conexões de usuários.
CREATE TABLE connect_log
        (
        cl_id           bigserial,
        cl_login        VARCHAR(32) DEFAULT USER,
        cl_sid          BIGINT,
        cl_pid          BIGINT,
        cl_connect      datetime YEAR TO SECOND
                                        DEFAULT CURRENT YEAR TO SECOND,
        cl_disconnect   datetime YEAR TO SECOND
                                        DEFAULT NULL,
        cl_program      varchar(255),
        cl_hostname     varchar(255),
        cl_inserts      BIGINT,
        cl_updates      BIGINT,
        cl_deletes      BIGINT,
        cl_selects      BIGINT,
        cl_commits      BIGINT,
        cl_rollback     BIGINT,
        cl_sorts        BIGINT,
        cl_lgrecs       BIGINT,
        cl_numios       BIGINT,
        cl_iowait       float,
        cl_lockwait     float,
        cl_cputime      float

        ) lock mode row;
Procedure - Grava a Hora de Conexão

Depois vamos criar um procedimento que insere um registro quando o usuário se conecta ao banco e quando o usuário sai é gravado a hora de saida.
DROP PROCEDURE IF EXISTS public.sysdbopen();
CREATE PROCEDURE public.sysdbopen()
   SET ISOLATION TO DIRTY READ;

   INSERT INTO connect_log
      (cl_sid,cl_pid, cl_program,cl_hostname)
      SELECT sid, pid, progname, hostname
         FROM sysmaster:sysscblst
         WHERE sid = DBINFO("sessionid");

END PROCEDURE;
Procedure - Grava a Hora de Desconexão

Por fim, crie o procedimento que será executado após o fechamento / desconexão de um banco de dados. Este procedimento irá atualizar a linha inserida no procedimento sysdbopen com o log out e sessões de estatísticas.
DROP PROCEDURE IF EXISTS public.sysdbclose();
CREATE PROCEDURE public.sysdbclose()

   UPDATE connect_log
      SET ( cl_disconnect, cl_inserts, cl_updates, cl_deletes,
          cl_selects, cl_commits, cl_rollback, cl_sorts, cl_lgrecs,
          cl_numios, cl_iowait, cl_lockwait, cl_cputime
          ) =
    ( ( SELECT CURRENT, upf_iswrite, upf_isrwrite, upf_isdelete,
            upf_isread, upf_iscommit, upf_isrollback , upf_totsorts,
            upf_lgrecs, upf_niowaits, iowaittime, lkwaittime , cpu_time
        FROM sysmaster:sysrstcb R, sysmaster:systcblst T
        WHERE sid = DBINFO("sessionid") AND R.tid = T.tid ) )
      WHERE cl_sid = DBINFO("sessionid")
            AND cl_disconnect IS NULL;

END PROCEDURE;
Checando quem Acessou o Banco

Depois de um tempo quero ver quem acessou este banco;
echo "select * from connect_log where NOT cl_login = 'informix' order by cl_id desc;" | dbaccess nome_do_banco 
Resultado
cl_id          1
cl_login       csa
cl_sid         46
cl_pid         27366
cl_connect     2014-02-19 15:30:45
cl_disconnect  2014-02-19 15:31:05
cl_program    
cl_hostname    teste
cl_inserts     1
cl_updates     0
cl_deletes     0
cl_selects     247
cl_commits     1
cl_rollback    0
cl_sorts       1
cl_lgrecs      6
cl_numios      2
cl_iowait      3.150230604645
cl_lockwait    0.00
cl_cputime     0.00485291622
Deletando

Se você não quiser mais monitorar é só deletar as procedures "public" que criamos;

public.sysdbopen
[teste:informix]$/export/home/informix/claudemar> echo "drop procedure "public".sysdbopen;" | dbaccess potencial

Database selected.

Routine dropped.

Database closed.
public.sysdbclose
[teste:informix]$/export/home/informix/claudemar> echo "drop procedure "public".sysdbclose;" | dbaccess potencial

Database selected.

Routine dropped.

Database closed.
Retirado - Clique Aqui

0 comentários:

Enviar um comentário