Compartilhando conhecimento com o mundo

Com tecnologia do Blogger.

Pesquisa

Download

Blogger Tricks

Blogger Themes

Visitas

Assuntos

1/30/2014

Comandos Oracle


Agora irei detalhar um pouco alguns dos principais comandos para administrar uma instância do Oracle. Lembrando que os comandos a seguir foram executados em ambiente Linux, mais nada impede de executar em ambiente Windows também.

Parar o Servidor Oracle

Parar o Banco
sqlplus / as sysdba
SQL> shutdown immediate
SQL> exit
Iniciar o Servidor Oracle

Iniciar o Banco
sqlplus / as sysdba
SQL> startup
SQL> exit
Shutdown Limpo (conectado no SQLPlus)

Opção Normal
shutdown
startup
Opção Transactional
shutdown transactional
startup
Opção Immediate
shutdown immediate
startup
Shutdown Sujo (conectado no SQLPlus)

Opção Abort
shutdown abort
startup
Reinicialização forçada
startup force
Acessar Enterprise Manager no Servidor
firefox http://localhost:1158/em
Acessar SQLPlus

Acessar SQLPlus com Autenticação Normal
sqlplus system/oracle
Acessar SQLPlus com Autenticação pelo Arquivo de Senhas
sqlplus sys/oracle as sysdba
sqlplus sys/oracle as sysoper
Acessar SQLPlus com Autenticação pelo Sistema Operacional
sqlplus / as sysdba
sqlplus / as sysoper
Acessar iSQLPlus

Iniciar iSQLPlus
isqlplusctl start
Parar iSQLPlus
isqlplusctl stop
Acessar iSQLPlus no Servidor
firefox http://localhost:5560/isqlplus
Manipular Arquivos de Inicialização (conectado no SQLPlus)

Visualizar todos os parâmetros da Instância
show parameters
Visualizar parâmetro da Instância
show parameters sga_target
show parameter pga_aggregate_target
Alterar parâmetros no SPFile
alter system set sga_target=256M scope=memory;
show parameter sga_target;
alter system set pga_aggregate_target=70M scope=spfile;
show parameter pga_aggregate_target;
shutdown immediate
startup
show parameter sga_target;
show parameter pga_aggregate_target;
alter system set sga_target=50M scope=both;
alter system set sga_target=50M scope=spfile;
shutdown immediate
startup
Criar PFile com base no SPFile para edição manual
create pfile='$ORACLE_HOME/dbs/initorcl.ora' from spfile='$ORACLE_HOME/dbs/spfileorcl.ora';
Editar arquivo de parâmetros no Sistema Operacional (Terminal do Linux)
vim $ORACLE_HOME/dbs/initorcl.ora
Criar SPFile com base no PFile editado manualmente
create spfile='$ORACLE_HOME/dbs/spfileorcl.ora' from pfile='$ORACLE_HOME/dbs/initorcl.ora';
startup
show parameter sga_target;
show parameter pga_aggregate_target;
Processos de Inicialização do Servidor Oracle (conectado no SQLPlus)

Iniciar em modo NOMOUNT
shutdown immediate
startup nomount
Alterar para modo MOUNT
alter database mount;
Iniciar em modo MOUNT
shutdown immediate
startup mount
Alterar para modo OPEN para somente leitura
alter database open read only;
Alterar para modo OPEN
shutdown immediate
startup mount
alter database open;
Habilitar modo OPEN restrito
alter system enable restricted session;
Desabilitar modo OPEN restrito
alter system disable restricted session;
Iniciar em modo OPEN restrito e desabilitar modo restrito;
shutdown immediate
startup restrict
alter system disable restricted session;
commit;
Iniciar em modo OPEN utilizando um pfile específico
shutdown immediate
startup pfile='$ORACLE_HOME/dbs/initorcl.ora'
shutdown immediate
startup
Acessar Log de Alerta

Localizar diretório do log de alerta (conectado no SQLPLus)
show parameter background_dump_dest;
Visualizar log de alerta (no terminal do linux)
vim /alert_orcl.log
Acessar views dinâmicas de desempenho

Ajustar SQLPlus
set linesize 200;
set pagesize 100;
Consultar views dinâmicas
select * from v$fixed_table;
Consultar sessões correntes
col machine format a10;
col program format a30;
col username format a10;
col osuser format a10;
select machine, program, username, osuser from v$session where username is not null;
Consultar instruções SQL que demoram mais de um segundo
col sql_text format a50;
col executions format 99999;
select sql_text, executions from v$sql where cpu_time > 1000000;
Consultar informações da sga
select * from v$sgainfo;
Consultar informações dos processos servidores
col username format a10;
col program format a30;
select pid, username, program, pga_used_mem, pga_alloc_mem, pga_freeable_mem, pga_max_mem from v$process;
Comandos de Stop/Start Listener

12.1. Parar Listener
lsnrctl stop
12.2 Iniciar Listener
lsnrctl start
12.3 Status Listener
lsnrctl status
Enterprise Manager

Inicar
emctl start dbconsole
Parar
emctl stop dbconsole
Status
emctl status dbconsole
Manutenção de Tablespaces

Criando uma tablespace de DADOS com tamanho de 1GB
SQL>create tablespace TS_DADOS datafile '/oracle/oradata/dbteste/TS_DADOS01.dbf' size 1024m;
Adicionando um segundo datafile de 512MB ao tablespace TS_DADOS
SQL>alter tablespace TS_DADOS add datafile '/oracle/oradata/dbteste/TS_DADOS02.dbf' size 512m;
Adicionando arquivo de dados ao tablespace de dados
SQL>alter database datafile '/oracle/oradata/dbteste/TS_DADOS01.dbf' resize 1024m;
Aumentando o tablespace TS_DADOS para 512m
SQL>alter tablespace TS_DADOS resize 512m;
Criando uma segunda tablespace de UNDO, UNDOTBS2
SQL>create undo tablespace UNDOTBS2 datafile '/oracle/oradata/dbteste/UNDOTBS201.dbf' size 512m;
Definindo a tablespace de UNDO da instância como UNDOTBS2
SQL>alter system set undo_tablespace=UNDOTBS2;
Criando uma tablespace temporaria adicional de 512MB.
SQL>create temporary tablespace TS_TEMP2 tempfile '/oracle/oradata/dbteste/TS_TEMP201.dbf' size 512m;
Definindo a tablespace temporária dafault da instância
SQL>alter database default temporary tablespace TS_TEMP2;
Renomeando uma tablespace
SQL>alter tablespace TEMP rename to TS_TEMP2;
Definindo a tablespace de dados dafault da instância
SQL>alter database default tablespace TS_DADOS;
Manutenção de Tabelas

Adicionando um campo a tabela
SQL>alter table TB_CLIENTE add ( FL_SITUACAO VARCAHR2(1));
Eliminando a coluna FL_SITUACAO da tabela de clientes
SQL>alter table TB_CLIENTE drop column FL_SITUACAO;
Eliminando a tabela de clientes
SQL>drop table TB_CLIENTE;
Os índices da tabela ficarão inválidos após a execução desta operação, devendo ser reconstruídos em seguida
SQL>alter table TB_CLIENTE move tablespace TB_MANUTENCAO_D;
Reorganizando a tabela na mesma tablespace - Opção disponível apenas a partir do 10g
SQL> alter table hr.employees enable row movement;
SQL> alter table hr.employees shrink space;
SQL> alter table hr.employees disable row movement;
Criando um índice simples, com apenas uma coluna – DT_NASCIMENTO, na tabela de clientes.
SQL>create index IX_CLIENTE1 on TB_CLIENTE (DT_NASCIMENTO) tablespace TB_ERPX_I;
Reconstruindo o índice IX_CLIENTE1 em uma nova tablespace
SQL>alter index IX_CLIENTE1 rebuild tablespace TS_MANUTENCAO_I;
Utilização dos Utilitários Export e Impor

EXP - Fazendo um export completo, full do banco oracle
exp userid=system/manager file=exp_FULL.dmp log=exp_FULL.log full=y
EXP - Fazendo o export somente do esquema, OWNER, chamado ERP
exp userid= file=exp_ERP.dmp log=exp_ERP.log owner=ERP
IMP - Fazendo o import do esquema ERP, como usuário SYSTEM, com buffer de 10MB e com salvamentos, commits, intermediários
imp userid=system/manager file=exp_ERP.dmp
Atribuindo e Revogando Privilégios

Atribuindo privilégios sobre a tabela TB_CLIENTE para o usuário CLI_ERP1
SQL>grant select, insert, update on TB_CLIENTE to CLI_ERP1;
Atribuindo o privilégio de sistema SELECT ANY TABLE para o usuário ERP
SQL>grant SELECT ANY TABLE to ERP;
Removendo o privilégio de sistema EXECUTE ANY PROCEDURE do usuário ERP
SQL>revoke EXECUTE ANY PROCEDURE from ERP;
Removendo o privilégio de DELETE na tabela de usuário CLI_ERP1
SQL>revoke DELETE on TB_CLIENTE from CLI_ERP1;
Criando Roles - Atribuições

Criando uma ROLE chamada RO_SISTEMA_ERP
SQL>create role RO_SISTEMA_ERP;
Criando um Database Link

Criando um database link do banco de desenvolvimento para o bano de produção identificado pelo usuário ERP_PRD, usando a string de conexão DB_PROD.
SQL>create public database link DB_PROD
connect to ERP_PRD identified by ERP1234
using 'DB_PROD';
Sinônimos Privados – Visíveis para um usuário específico

Criando um sinônimo chamado CLIENTES para o usuário CLI_ERP1 apontando para a tabela TB_CLIENTE do usuário, dono, ERP.
SQL>create synonym CLI_ERP1.CLIENTES for ERP.TB_CLIENTE;
Sinônimos Públicos – Visíveis para todos os usuários

Criando um sinônimo público, chamado, CLIENTES, para a tabela TB_CLIENTE
SQL>create public synonym CLIENTES for ERP.TB_CLIENTE;

1/28/2014

Matar Sessão de Usuário no Oracle


Trabalhando com desenvolvedores, muitas vezes me perguntam para matar sessões órfãos presos no Oracle. Estas sessões em algum momento usam um monte de recursos ou bloqueiam os objetos e linhas das tabelas. Os desenvolvedores geralmente trabalham com aplicações instáveis ​​que fazem transações, ou depuradores permitindo que o desenvolvedor possa parar e interromper o processo de aplicação abruptamente assim para pular a parte commit/rollback e até mesmo a parte de desconexão do código. O programa cliente para de rodar mais e não informa ao banco de dados Oracle para cancelar a declaração e desligar de forma adequada. Isso pode produzir um processo órfão no banco de dados. Na verdade o Oracle (o processo PMON em segundo plano) vai matar esses processos órfãos, por si só, mas pode demorar um pouco antes que ele seja identificados e morto, neste meio tempo os desenvolvedores podem estar enfrentando bloqueios ou lentidão no Oracle. Quando o ambiente de desenvolvimento é relativamente pequeno, é fácil de identificar as sessões que precisam de ser matadas. Mas em um ambiente grande, com vários desenvolvedores conectados ao mesmo servidor de banco de dados com o mesmo nome, às vezes, é um pouco complicado. Para enfrentar esta tarefa demorada e repetitiva, criei algumas maneiras para facilitar e agilizar este processo de matar processos.

Matar Manualmente

Primeiro temos que descobrir algumas identificadores da sessão para matar manualmente que é o PID e o serial number (que identifica unicamente objetos de uma sessão): Acessando o sqlplus
[s401:oracle]$/home/oracle> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jan 28 13:26:30 2014

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Release 10.2.0.5.0 - 64bit Production

SQL> 
Para matar uma sessão no Oracle precisamos de dois dados importantes ( SID e SERIAL# ), ambos podem ser obtidos da VIEW V$SESSION. Quero matar alguns processos do usuário ADRH que estão rodando no PROGRAM GFP804910G - este é o select para descobrir o SID e o SERIAL desse usuário. Para pegarmos estes dados podemos executar o seguinte comando.
SQL> select sid, serial#, STATUS, PROGRAM from v$session where username = 'ADRH';

       SID    SERIAL# STATUS   PROGRAM
---------- ---------- -------- ------------------------------------------------
      1574      28283 ACTIVE   GFP804910G@s401.lm (TNS V1-V3)
      1594      53302 ACTIVE   GFP804910G@s401.lm (TNS V1-V3)
      1604      58352 ACTIVE   GFP804910G@s401.lm (TNS V1-V3)
      1618      45607 INACTIVE SQL Developer
      1630          7 ACTIVE   GPRDAEMO@s401.lm (TNS V1-V3)
      1642      45102 INACTIVE w3wp.exe

6 rows selected.

SQL> 
Peguei o SID e o SERIAL# do que quero matar e executei este comando, importante o usuário pediu para matar os processos processos que estão rodando com o program GFP804910G - O IMMEDIATE especifica para o banco Oracle efetuar o final da transação com rollback, liberando e retornando o controle para você imediatamente.
SQL> ALTER SYSTEM KILL SESSION '1574,28283' IMMEDIATE;
SQL> ALTER SYSTEM KILL SESSION '1594,53302' IMMEDIATE;
SQL> ALTER SYSTEM KILL SESSION '1604,58352' IMMEDIATE;
Pronto, processos mortos;
SQL> select sid, serial#, STATUS, PROGRAM from v$session where username = 'ADRH';

       SID    SERIAL# STATUS   PROGRAM
---------- ---------- -------- ------------------------------------------------
      1618      45607 INACTIVE SQL Developer
      1630          7 ACTIVE   GPRDAEMO@s401.lm (TNS V1-V3)
      1642      45102 INACTIVE w3wp.exe

3 rows selected.

SQL> 

Script em Shell

Uma alternativa é criar uma rotina em shell para facilitar a vida do dba, dá para checar os usuários online e tem uma opção para matar;
-------------------------------------------------------------------------------------------------
27/01/2014                        ***** ORACLE BASIC SERVICES *****                      15:22:07
-------------------------------------------------------------------------------------------------
                                  s401.lm - oracle - ORACLE_SID=URHDES

USERNAME        OSUSER                 SID    SERIAL# SPID         STATUS   PROGRAM                        LOGON_TIME
--------------- --------------- ---------- ---------- ------------ -------- ------------------------------ --------------------
                oracle                1592      16336 19810        ACTIVE   oracle@s401.lm (J000)          27-JAN-2014 15:17:27
                oracle                1556         20 19893        ACTIVE   oracle@s401.lm (J001)          27-JAN-2014 15:17:22
SYS             oracle                1562         29 19959        ACTIVE   sqlplus@s401.lm (TNS V1-V3)    27-JAN-2014 15:17:51
ADRH            oracle                1620      12770 15011        ACTIVE   GFP804910G@s401.lm (TNS V1-V3) 27-JAN-2014 11:20:20
ADRH            oracle                1572      10408 13151        ACTIVE   GFP804910G@s401.lm (TNS V1-V3) 27-JAN-2014 09:53:57
ADRH            oracle                1603      44946 14731        ACTIVE   GFP804910G@s401.lm (TNS V1-V3) 27-JAN-2014 11:09:44

        Codigo   Funcao                                      
        -------  -------------------------------------------
           1     Checar Determinado Processo              
           2     Matar Processo                              
           0     Sair da Aplicacao                        
        -------  -------------------------------------------


     Digite um Codigo – 2
A opção 2 escolhida dá para matar o processo
-------------------------------------------------------------------------------------------------
27/01/2014                        ***** ORACLE BASIC SERVICES *****                      15:28:38
-------------------------------------------------------------------------------------------------
                                  s401.lm - oracle - ORACLE_SID=URHDES


Digite o SID do usuario    :  1620

Digite o SERIAL do usuario :  12770
Processo SID 1620 com a SERIAL 12770 não esta mais ativo;
-------------------------------------------------------------------------------------------------
27/01/2014                        ***** ORACLE BASIC SERVICES *****                      15:22:07
-------------------------------------------------------------------------------------------------
                                  s401.lm - oracle - ORACLE_SID=URHDES

USERNAME        OSUSER                 SID    SERIAL# SPID         STATUS   PROGRAM                        LOGON_TIME
--------------- --------------- ---------- ---------- ------------ -------- ------------------------------ --------------------
                oracle                1592      16336 19810        ACTIVE   oracle@s401.lm (J000)          27-JAN-2014 15:17:27
                oracle                1556         20 19893        ACTIVE   oracle@s401.lm (J001)          27-JAN-2014 15:17:22
SYS             oracle                1562         29 19959        ACTIVE   sqlplus@s401.lm (TNS V1-V3)    27-JAN-2014 15:17:51
ADRH            oracle                1572      10408 13151        ACTIVE   GFP804910G@s401.lm (TNS V1-V3) 27-JAN-2014 09:53:57
ADRH            oracle                1603      44946 14731        ACTIVE   GFP804910G@s401.lm (TNS V1-V3) 27-JAN-2014 11:09:44

        Codigo   Funcao                                      
        -------  -------------------------------------------
           1     Checar Determinado Processo              
           2     Matar Processo                              
           0     Sair da Aplicacao                        
        -------  -------------------------------------------


     Digite um Codigo – 2

Script completo em shell script
# ------------------------------------------------------------------------------------------------------------------------- 
# Funcao: Mata uma sessao imediatamente e faz  rollback na transacao; 
# Criada: 28/01/2013 
#  Autor: Claudemar Martins
# -------------------------------------------------------------------------------------------------------------------------

Principal () {

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                  ***** ORACLE BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                  $(hostname) - $(whoami) - $(env | grep ORACLE_SID)"

sqlplus -s '/as sysdba' << endofcommand

set linesize 220
set pagesize 100

col USERNAME for a15
col OSUSER   for a15
col PROGRAM  for a30

SELECT s.username, s.osuser, s.sid, s.serial#, p.spid, s.status, s.program, TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time FROM v\$session s  inner join v\$process p     on s.paddr = p.addr   WHERE s.STATUS <> 'INACTIVE'  and s.type <> 'BACKGROUND'

/ 
EXIT
endofcommand
echo 
echo ""
echo "        Codigo   Funcao                                      "
echo "        -------  ------------------------------------------- "
echo "           1     Checar Determinado Processo                 "
echo "           2     Matar Processo                              "
echo "           0     Sair da Aplicacao                           "
echo "        -------  ------------------------------------------- "
echo ""

echo
echo -n "     Digite um Codigo - "   
   read OPCAO2
   case $OPCAO2 in
      1) CHECAR_DETERMINADO_PROCESSO_RODANDO ;;
      2) MATAR_PROCESSO ;;
      0) exit ;;
      *) Principal ;;
   esac
}

# ======================================================================================================
# Matando o processo desejado
# ======================================================================================================

MATAR_PROCESSO ()
{
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                  ***** ORACLE BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                  $(hostname) - $(whoami) - $(env | grep ORACLE_SID)"
echo
echo
echo -n "Digite o SID do usuario    :  "
read SID_DESEJADO
echo
echo -n "Digite o SERIAL do usuario :  "
read SERIAL_DESEJADO

sqlplus -s '/as sysdba' << endofcommand

ALTER SYSTEM KILL SESSION '$SID_DESEJADO, $SERIAL_DESEJADO' IMMEDIATE

/ 
EXIT
endofcommand

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                  ***** ORACLE BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                  $(hostname) - $(whoami) - $(env | grep ORACLE_SID)"
echo
echo
echo "                    +---------------------------------------------------------+"
echo "                    |                                                         |"
echo "                    |                aguarde alguns segundos ...              |"
echo "                    |                                                         |"
echo "                    +---------------------------------------------------------+"
echo
sleep 2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                  ***** ORACLE BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                  $(hostname) - $(whoami) - $(env | grep ORACLE_SID)"
echo

sqlplus -s '/as sysdba' << endofcommand

set linesize 220
set pagesize 100
col USERNAME for a15
col OSUSER   for a15
col PROGRAM  for a30

SELECT s.username, s.osuser, s.sid, s.serial#, p.spid, s.status, s.program, TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time FROM v\$session s  inner join v\$process p on s.paddr = p.addr WHERE s.sid = '$SID_DESEJADO'

/ EXIT
endofcommand

echo -n "Check se o processo continua rodando;"
echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
Principal
}

# ======================================================================================================
# ======================================================================================================

CHECAR_DETERMINADO_PROCESSO_RODANDO ()
{
# ALTER SYSTEM KILL SESSION '$SID_DESEJADO, $SERIAL_DESEJADO' IMMEDIATE;
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                  ***** ORACLE BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                  $(hostname) - $(whoami) - $(env | grep ORACLE_SID)"
echo
echo
echo -n "Digite o SID do usuario    :  "
read SID_DESEJADO
echo
echo -n "Digite o SERIAL do usuario :  "
read SERIAL_DESEJADO

echo 

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                  ***** ORACLE BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                  $(hostname) - $(whoami) - $(env | grep ORACLE_SID)"
echo

sqlplus -s '/as sysdba' << endofcommand

set linesize 220
set pagesize 100

col USERNAME for a15
col OSUSER   for a15
col PROGRAM  for a30

SELECT s.username, s.osuser, s.sid, s.serial#, p.spid, s.status, s.program, TO_CHAR(s.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time FROM v\$session s  inner join v\$process p on s.paddr = p.addr WHERE s.sid = '$SID_DESEJADO'

/ 
EXIT
endofcommand

echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
Principal
}

# ======================================================================================================
# Nao remover a linha abaixo
# ======================================================================================================

Principal
Matar Todas as Sessões usando um script PL/SQL

Dá para matar todas as sessões de um usuário fazendo um PL/SQL loop. Primeiro vamos acessar o sqlplus e rodar um script PL/SQL
[s401:oracle]$/home/oracle> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jan 28 13:26:30 2014

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Release 10.2.0.5.0 - 64bit Production

SQL> @MataUsuarioADRH.sql

PL/SQL procedure successfully completed.
Script PL/SQL loop 1 -- em username tenho que colocar o usuário que vou matar - este não tem o IMMEDIATE !!!
begin
    for x in ( select *
                 from v$session
                where (username = 'ADRH' OR username = 'PUBLICACAO') AND module LIKE 'GFP804910G%')
    loop
        execute immediate 'alter system kill session ''' || x.sid || ',' || x.serial# || '''';
        dbms_output.put_line( 'Alter session done' );
    end loop;
end;
/
Script PL/SQL loop 2 -- em username tenho que colocar o usuário que vou matar
begin
    for x in ( select * from v$session where (username = 'ADRH' OR username = 'PUBLICACAO') AND module LIKE 'GFP804910%')
    loop
        execute immediate 'alter system kill session ''' || x.sid || ',' || x.serial# || ''' IMMEDIATE';
        dbms_output.put_line( 'Alter session done' );
    end loop;
end;
/
Script PL/SQL loop 3 - Este pede para digitar o username para matar no sqlplus;
PROMPT Digite o Username para Matar;
DEFINE username = &1
BEGIN
  FOR c IN (SELECT s.sid, s.serial# FROM v$session s WHERE  s.username = '&&username' and module LIKE 'GFP804910%')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || ''' IMMEDIATE';
  END LOOP;
END;
/
Matar Usuário via Procedure

Uma outra alternativa é criar uma procedure para fazer este procedimento de matar usuário - Clique Aqui
1. Os desenvolvedores não tem a permissão de alter system / alter user privileges.
2. Ao criar usuários para desenvolvedores o DBA pode adicionar um prefixo ao nome (DEV_USER1, DEV_JOHN, DEV_RACHEL …).
3. Desenvolvedores não compartilham o mesmo nome de usuário (username).
4. Vários desenvolvedores podem executar a partir do mesmo cliente usando diferentes nomes de usernames para acessar Oracle.
5. Um desenvolvedor pode executar a partir de várias máquinas cliente - neste caso, ele vai querer matar sessões abertas apenas
   a partir de uma máquina cliente específico.
Testado em:
1. Oracle 10g
2. Oracle 10g RAC
3. Oracle 11g
4. Oracle 11g RAC
Agora, vou mostrar o código de configuração, seguida por uma explicação: Create owner for the procedure (schema);
1 - create user killer identified by killer;
2 - grant alter system to killer;
3 - grant select on v_$session, gv_$session to killer;
4 - alter user killer account lock;
Criando a procedure;
create or replace PROCEDURE killer.KILL_MY_CLIENTS AUTHID DEFINER AS
   job_no number;
   user_prefix varchar(20);
   domain_name varchar(20);
   num_of_kills number := 0;
   BACKSLASH constant char(1) := chr(92);
begin
   user_prefix := 'DEV';       -- All my developer username prefixed with DEV
                               -- (DEV_USER1, DEV_USER2, DEV_MIKE, DEV_JOHN ...)
   domain_name := 'WORKGROUP'; -- We work in a workgroup.
                               -- Once we work in a windows domain this variable should
                               -- hold the domain name

   for REC in
       (SELECT SID, SERIAL#, INST_ID, MODULE,
               SYS_CONTEXT('USERENV', 'INSTANCE') MY_INST_ID
        from gv$session s
        where s.username like user_prefix || '%'                  -- precaution
          and s.username = sys_context('USERENV', 'SESSION_USER') -- only my username
          and not (S.SID = SYS_CONTEXT('USERENV', 'SID')          -- excluding my session
          and INST_ID = SYS_CONTEXT('USERENV', 'INSTANCE'))
          and replace(upper(machine), domain_name || BACKSLASH, '')     -- my machine
                 = replace(upper(sys_context('USERENV', 'HOST')), domain_name || BACKSLASH, '')
          and s.module not in ('SQL*Plus', 'SQL Developer')       -- not sqlplus
                                                                  -- nor sql developer
          and s.module not like 'sqlplus@%'
          and S.LOGON_TIME < sysdate-(1/24/60/60)                 -- logged-on more
                                                                  -- than a second
        ORDER BY inst_id asc
       ) LOOP
      if rec.inst_id = rec.my_inst_id then
         ---------------------------------------------------------------------------
         -- kill local sessions immediately
         ---------------------------------------------------------------------------
         dbms_output.put('LOCAL SID ' || rec.sid || '(' || rec.module || ')');
         execute immediate 'alter system kill session ''' || rec.sid || ', ' ||
                            rec.serial# || '''' ;
         dbms_output.put_line('. killed locally ' || job_no);
      ELSE
         ---------------------------------------------------------------------------
         -- kill remote sessions (for RAC) as a job
         ---------------------------------------------------------------------------
         DBMS_OUTPUT.PUT('REMOTE SID ' || REC.SID || ' on instance ' || REC.INST_ID  ||
                         '(' || rec.module || ')');
         DBMS_JOB.SUBMIT (
                 job => job_no,
                 what => 'execute immediate ''alter system kill session ''''' || rec.sid ||', ' ||
                          rec.serial# || ''''''';',
                 INSTANCE => rec.inst_id);
         dbms_output.put_line('. killed with job ' || job_no);
         COMMIT;
      end if;
      num_of_kills := num_of_kills + 1;
   end loop;
   dbms_output.put_line ('number of killed sessions: ' || num_of_kills);
end kill_my_clients;
Fazer com que a procedure fique disponível para todos
1 - create public synonym kill_my_clients for killer.kill_my_clients;
2 - grant execute on killer.kill_my_clients to public;
3 - alter user killer account lock;
Use: O login como o desenvolvedor na máquina do cliente para qualquer aplicativo que possa executar instruções como o SQL * Plus
1 - exec kill_my_clients
Explicação: Os comandos da primeira seção criam um usuário chamado "killer". Esse usuário é o owner (proprietário) da procedure descrita na próxima seção. Observe que este usuário é muito poderoso, pois pode matar qualquer usuário com a permissão "alter system". É por isso que temos de limitar o acesso a ele para que ele esteja bloqueado. Os grants as tabelas v_$session e gv_$session devem ser feito pelo SYS ou outro usuário com opções de administração sobre essas views. A segunda seção é a procedure em si. Deve ser compilado em "kill" (como o código demonstra). Aqui está uma explicação deste procedure:

1. Identifica todas as sessões em execução da máquina do desenvolvedor a partir dele/dela username, exceto para a sessão de executar esta consulta no nó atual e nós RAC remotos.

1. Se a sessão é na mesma instância da conexão atual - mata imediatamente.
2. Se a sessão estiver em um nó RAC diferente - mata através da apresentação de um job nesse nó.

Existem 2 variáveis ​​que eu costumo mudar quando eu implanto esse procedimento em um ambiente:

* USER_PREFIX – Eu tento nomear todos os usuários para desenvolvedores com um prefixo como DEV_USER1, DEV_USER2, DEV_MIKE, DEV_JOHN ... Eu uso esse prefixo, como medida de precaução - Eu não quero que a minha procedure mate todos os usuários não comecem com este prefixo. Dessa forma, se o meu desenvolvedor está executando esse procedimento a partir do usuário sys ou system por engano ele não vai fazer mal nenhum.

* DOMAIN_NAME – quando se trabalha com clientes Windows, por vezes, a aplicação é prefixado com o nome de domínio (como o SQL Developer) e às vezes não (como o SQL*Plus). Esta variável se tornará crucial para identificar sessões abertas da máquina do desenvolvedor.

Outro fator que ter em conta é que eu não quero matar conexões do SQL * Plus ou de SQL Developer. Se você estiver trabalhando com outros programas, tais como PL / SQL Developer ou Toad você pode querer incluí-los na cláusula onde também.

A terceira seção mostra como usar esse mecanismo: Você só precisa se logar como o desenvolvedor da máquina do cliente para qualquer aplicativo que possa executar instruções como o SQL * Plus e executar o procedimento (você não tem que usar o nome do proprietário na chamada porque você declarou um sinônimo público para ele).
Importante; Para efetuar este procedimento o usuário que der o privilégio de ALTER SYSTEM.

1/27/2014

Sistema Travado - Tabela em Lock - Informix


Os usuários começaram a reclamar dizendo que o sistema estava travado, para descobrir não tem outro jeito tem que sair procurando pra ver o que esta acontecendo;

Primeiro vou checar a performance - ok normal;
[s275:informix]$/export/home/informix> sar 1 5
Linux 2.6.18-128.1.10.el5 (s105.fazenda.ms)     05/12/2011

12:15:22 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle
12:15:23 PM       all     16.88      0.00      7.50      8.38      0.00     67.25
12:15:24 PM       all     12.98      0.00      7.24      5.62      0.00     74.16
12:15:25 PM       all     14.86      0.00      7.49     10.74      0.00     66.92
12:15:26 PM       all     12.86      0.00      8.49      6.74      0.00     71.91
12:15:27 PM       all     14.75      0.00      8.25     10.75      0.00     66.25
Average:          all     14.46      0.00      7.79      8.44      0.00     69.30
Checando as mensagens de log (onstat -m) e não tinha nenhuma mensagem estranha - ok normal;
[s275:informix]$/export/home/informix> onstat -m

IBM Informix Dynamic Server Version 11.70.FC2 -- On-Line -- Up 59 days 21:28:28 -- 1575104 Kbytes

Message Log File: /export/home/informix/online.log

01/27/12 12:00:02  Attempting to free unused operating system segments.  This
operation may take several minutes.
01/27/12 12:15:01  Attempting to free unused operating system segments.  This
operation may take several minutes.
01/27/12 12:30:01  Attempting to free unused operating system segments.  This
operation may take several minutes.
01/27/12 12:45:02  Attempting to free unused operating system segments.  This
operation may take several minutes.
01/27/12 13:00:01  Attempting to free unused operating system segments.  This
operation may take several minutes.
01/27/12 13:15:02  Attempting to free unused operating system segments.  This
operation may take several minutes.
Checando as logical logs - ok normal;
[s275:informix]$/export/home/informix> onstat -l

IBM Informix Dynamic Server Version 11.70.FC2 -- On-Line -- Up 59 days 21:50:45 -- 1575104 Kbytes

Physical Logging
Buffer bufused  bufsize  numpages   numwrits   pages/io
  P-1  60       64       2813842    44025      63.91
      phybegin         physize    phypos     phyused    %used   
      1:263            524288     419611     7900       1.51    

Logical Logging
Buffer bufused  bufsize  numrecs    numpages   numwrits   recs/pages pages/io
  L-3  0        64       21847576   2295707    1206287    9.5        1.9     
        Subsystem    numrecs    Log Space used
        OLDRSAM      21847540   2995372876    
        HA           36         1584          

address          number   flags    uniqid   begin                size     used    %used
4f126fa8         3        U-B----  349      1:555271            15360    15360   100.00
4f275f50         9        U-B----  350      6:53                51200    51200   100.00
4f275fb8         10       U-B----  351      6:51253             51200    51200   100.00
4f127838         11       U-B----  352      6:102453            51200    51200   100.00
4f1278a0         1        U-B----  353      1:570631            33280    33280   100.00
4f127908         2        U-B----  354      1:603911            33280    33280   100.00
4f127970         4        U-B----  355      1:654905            33280    33280   100.00
4f1279d8         12       U-B----  356      6:153653            51200    51200   100.00
4f127a40         13       U-B----  357      6:204853            51200    51200   100.00
4f127aa8         14       U-B----  358      6:256053            51200    51200   100.00
4f127b10         15       U-B----  359      6:307253            51200    51200   100.00
4f127b78         16       U-B----  360      6:358453            51200    51200   100.00
4f127be0         17       U-B---L  361      6:409653            51200    51200   100.00
4f127c48         18       U---C--  362      6:460853            51200    11239    21.95
 14 active, 14 total
Criei um script em shell para descobrir se tem alguma tabela em lock;
-------------------------------------------------------------------------------------------------
27/01/2012                      ***** INFORMIX BASIC SERVICES *****                      12:15:59
-------------------------------------------------------------------------------------------------


        Code  Function                                    
        ----  ------------------------------------------- 
         1    Tabelas em Lock - Simples                   
         2    Tabelas em Lock - Completo                  
         3    Tabelas em Lock - Resumido                  
         4    Tabelas em Lock - Banco                     
         5    Tabelas em Lock - Banco e Usuario           
         6    Usuarios com Maiores Locks                  
         0    Sair da Aplicacao                           
        ----  ------------------------------------------- 

     Digite um Codigo - 
Usando a opção 1 - Tabelas em Lock - Aparece 5 processos com lock - 4 com o mesmo processo 2368206;
-------------------------------------------------------------------------------------------------
27/02/2012                      ***** INFORMIX BASIC SERVICES *****                      12:16:38
-------------------------------------------------------------------------------------------------


dbsname    publicacao
tabname    ultima_notific_tra
type       IX
owner      2368206
ownername  emorisantos
waitname   mjesus

dbsname    publicacao
tabname    pacote
type       X
owner      2368206
ownername  emorisantos
waitname   emorisantos

dbsname    publicacao
tabname    ultimo_tvf
type       X
owner      2378509
ownername  emorisantos
waitname   wdias

dbsname    publicacao
tabname     167_455
type       X
owner      2368206
ownername  emorisantos
waitname   emorisantos

dbsname    publicacao
tabname    pendencia_nf
type       X
owner      2368206
ownername  emorisantos
waitname   emorisantos

Pressione qualquer tecla para continuar...
Só para ter certeza vou tentar dar acessar a tabela (pacote) ela em lock por muito tempo ninguém consegue fazer nada;
[s275:informix]$/export/home/informix> echo "select count(*) from  pacote          ; " | dbaccess publicacao ;

Database selected.

      (count(*))

  252: Cannot get system information for table.

  113: ISAM error:  the file is locked.
Error in line 1
Near character position 31

Database closed.
Matando o processo 2368206 (que tem mais processo preso);
[s275:informix]$/export/home/informix> onmode -z 2368206
Checando para ver se tem algum processo preso - não tem - conversando com o usuário o sistema agora esta ok;
-------------------------------------------------------------------------------------------------
27/02/2012                      ***** INFORMIX BASIC SERVICES *****                      12:16:38
-------------------------------------------------------------------------------------------------


               +-----------------------------------------------------------------+
               |                                                                 |
               |                   NAO TEM TABELA PRESA NO BANCO                 |
               |                                                                 |
               +-----------------------------------------------------------------+


Pressione qualquer tecla para continuar...
Script completo para descobrir quem esta dando lock em uma tabela - Clique Aqui

1/13/2014

Solução de Problemas no Informix


Este artigo descreve as estratégias que ajudam você a ajustar e a monitorar os bancos Informix. Nele, você vai aprender as tarefas do dia-a-dia que podem ajudar a manter seus sistemas saudáveis ​​por um longo tempo. No caso em que os problemas ocorrem, ele vai ajudar você a entender como resolvê-los. Este capítulo irá ajudá-lo:

- Como realizar o monitoramento do sistema em curso. Existem muitas tarefas básicas que podem ajudá-lo a compreender o que está acontecendo com seu sistema;

- Métodos de ajuste e verificação de seus bancos de dados. Existem diferentes maneiras para ajudar e a manter seus sistemas carregados e livre de erros por um longo tempo. Muitas dessas tarefas não precisam ser realizada mais de uma vez por semana, ou até mesmo uma vez por mês.

- Como solucionar problemas. Grande parte da solução dos problemas é um processo de aprendizagem. No entanto, pensar as coisas através de procedimentos básicos e seguir irá ajudá-lo mais facilmente a chegar ao fundo do problema.

Assim que assumi a posição de DBA, encontrei muitos artigos dizendo que todos os dias deveriam ser realizadas uma serie de verificações, a famosa lista de checagem (Check List) do DBA, dentre elas, se os backups foram realizados corretamente, se tem espaço em disco disponível. Criei esses dois Check List que rodo sempre de manhã quando checo e durante o dia rodo só para ver como esta o sistema, facilitou muito a minha vida na administração do banco Informix;

Uso do Disco de monitoramento

As configurações dos discos muitas vezes pode ser um equilíbrio difícil no Informix. A meta que prevalece é fazer o uso mais eficiente de seus discos embora não preenchendo-los. Layout do disco deve ser planejada com cuidado, especialmente quando você é primeiro criar a instância Informix. Obviamente, não é possível prever o uso completamente do seu sistema, mas é importante para colocar o máximo que você pode no planejamento de espaço em disco. Se você precisa mudar alguma coisa, você pode adicionar chunks mais tarde. Segue-se a saída do onstat -d , que mostra a dbspaces corrente e chunks em uma instância Informix:
Dbspaces
address number  flags  fchunk  nchunks flags  owner      name
a28e3e   1          1      1      1       N     informix   rootdbs
a28e4e   2          1      2      1       N     informix   dbspace
a28f2a   3          1      3      1       N T   informix   tempdbs
2 active, 2047 maximum
Chunks
address chk/dbs offset  size  free bpages  flags pathname
a26f220 1   1   0      25000  10000         PO-  /usr/informix/rootdbs
a26f240 2   2   0      60000  45000         PO-  /usr/informix/chunk1
a26f290 3   3   0      50000  49000         PO-  /usr/informix/tempdbs
2 active, 2047 maximum
A saída é dividido em duas partes: as informações dos dbspace e as informações dos chunks. Em poucas palavras, um dbspace é uma coleção de chunk. Cada chunk representa a totalidade ou parte de uma unidade de disco físico. O dbspaces são exibidos na parte superior da saída seguido pelo chunks que mapeiam a eles. O "number" de campo na seção dbspaces é o número dbspace, que mapeia o "dbs" campo na parte de chunk da tela. Para essa discussão, vamos apenas olhar para o uso chunk.

As colunas que são de interesse particular são "size" (tamanho) e "free" (livre). Estas colunas em páginas definem o tamanho do chunk e quanto ele permanece livre. O tamanho da página pode ser encontrado usando o comando onstat -b . É muito importante o monitoramento da quantidade de páginas disponíveis. Pois ficando sem espaço, sua instância inteira pode ser forçado a ficar Off Line.

Para saber o tamanho usado e disponível de cada banco criei um script para mostrar isso;
-------------------------------------------------------------------------------------------------
13/01/2014                      ***** INFORMIX BASIC SERVICES *****                      14:25:51
-------------------------------------------------------------------------------------------------


+----------------------+------------------------------+------------------------------+------------------------------+
| Dbspace              | Total do Espaco              | Espaco Usado                 | Espaco Livre                 |
+----------------------+------------------------------+------------------------------+------------------------------+
| rootdbs              | 4.0                       Gb | 1.25439453125             Gb | 2.74560546875             Gb | 
| tmp1dbs              | 1.0                       Gb | 0.0001010894775390625     Gb | 0.9998989105224609375     Gb | 
| tmp2dbs              | 1.0                       Gb | 0.0001010894775390625     Gb | 0.9998989105224609375     Gb | 
| phydbs               | 1.0                       Gb | 0.0001010894775390625     Gb | 0.9998989105224609375     Gb | 
| data                 | 29.086456298828125        Gb | 7.305908203125            Gb | 21.780548095703125        Gb | 
| logdbs               | 1.0                       Gb | 0.9766635894775390625     Gb | 0.0233364105224609375     Gb | 
+----------------------+------------------------------+------------------------------+------------------------------+
Script para checar Espaço Disponível no Banco
LOG1='/tmp/calculando_espaco1.log'
LOG2='/tmp/calculando_espaco2.log'

dbaccess sysmaster  > /dev/null <<+
unload to $LOG1

select name dbspace, (chksize/1024/1024*2) Pages_size, 
(chksize/1024/1024*2 - nfree/1024/1024*2) Pages_used, 
(nfree/1024/1024*2) Pages_free, round ((nfree / chksize) * 100, 2) 
percent_free from sysdbspaces d, syschunks c where d.dbsnum = c.dbsnum
+

cat $LOG1 | awk -F "|" '{
   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-20s | %-25s Gb | %-25s Gb | %-25s Gb | \n",$1,$2,$3,$4)}' > $LOG2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                         $(hostname) - $(whoami)"
echo

echo "+----------------------+------------------------------+------------------------------+------------------------------+"
echo "| Dbspace              | Total do Espaco              | Espaco Usado                 | Espaco Livre                 |"
echo "+----------------------+------------------------------+------------------------------+------------------------------+"
cat $LOG2       
echo "+----------------------+------------------------------+------------------------------+------------------------------+"
rm $LOG1
rm $LOG2
Para ver a atividade de certos chunk

Se o comando onstat -g iof. A seguir está a saída deste comando:
AIO global files:
gfd    pathname    totalops    dskread    dskwrite    io/s
3    rootdb1    15562    12746    2816    0.0
4    dbspace1    64    64    0    0.0
Se você perceber que uma das partes tem um número elevado de leituras ou gravação quando comparado com outros chunks, o que pode estar causando problemas de desempenho. Neste caso você pode considerar a redistribuição dos dados contidos nesse chunks.
 +---------------------------------------------------------------------------------------------------------------------+ 
 | O onstat -g iof e util para verificar o desempenho geral de I/O. Um tempo de 1,0 segundo e muito muito muito muito  | 
 | ruim. Mesmo um decimo de segundo e ruim. A maioria do sistema deve estar em baixo os centesimos ou tipicamente      | 
 | milhares de segundo.                                                                                                | 
 |                                                                                                                     | 
 | Observe o campo (avg. time) ele mostra o tempo de cada disco;                                                       | 
 |                                                                                                                     | 
 | O servidor de banco de dados pode precisar executar operacoes de E/S em mais de um objeto (como uma tabela e um     | 
 | arquivo de log logico) localizado no mesmo disco. A contencao entre os processos ocupados com demandas altas de E/S | 
 | podem diminui-los. E importante monitorar o uso de disco. Em tal cenario, e possivel ver ganhos de balanceamento ao | 
 | fazer balanceamento de carga (movendo as tabelas para outro disco).                                                 | 
 +---------------------------------------------------------------------------------------------------------------------+ 
VPs assistindo

Os processadores virtuais (VPs) podem ajudar as coisas de forma eficiente no processo do Informix. As VPs são "mini CPUs" que são na verdade processos operacionais do sistema. Essas VPs lidam com usuário "threads" e fornecem as capacidades multi-threading do Informix. É importante ter bastante VPs e tê-las devidamente configuradas.

O comando onstat-g glo fornece informações sobre todos os processadores atuais virtual, bem como as estatísticas de cada classe de processador virtual (CPU, por exemplo). Você pode usar os resultados deste comando para procurar por certas classes de VPs que podem ter um enorme quantidade de atividade, fazendo com que você adicione mais VPs.

O comando onstat -g ioq pode ajudar a determinar se você precisa adicionar mais VPs AIO e tem saída como a seguir:
AIO I/O queues:
q name/id     len maxlen totalops dskread dskwrite dskcopy
adt    0    0    0    0    0    0    0
opt    0    0    0    0    0    0    0
msc    0    0    1    1423    0    0    0
aio    0    0    1    2    1    0    0
pio    0    0    1    215    0    215    0
lio    0    0    1    241    0    241    0
Se este comando mostra uma fila de I/O que continua a crescer, talvez seja necessário adicionar mais VPs AIO.

Monitoramento de Memória Compartilhada

A quantidade de memória usada pelo Informix pode variar, dependendo da atividade do seu sistema. Memória é alocado inicialmente como a quantidade de KB dada pelo parâmetro SHMVIRTSIZE no ONCONFIG e pode ser dinamicamente alocados pelo Informix pelo SHMADD da ONCONFIG. Prestar atenção na quantidade de memória alocada pelo Informix, basta usar o comando onstat - , que rapidamente exibe o montante total utilizado pelo Informix. Para obter informações sobre os segmentos de memória específicos que foram alocados, use o comando onstat -g seg, que exibe informações como mostra este exemplo de saída:

COMANDO: onstat -g seg
Segment Summary:
id         key        addr             size             ovhd     class blkused  blkfree 
5570578    52564801   44000000         4609867776       54455488 R*    1125453  3       
5603347    52564802   156c50000        5120000000       60001896 V*    125835   1124165 
Total:     -          -                9729867776       -        -     1251288  1124168 

   (* segment locked in memory)
No reserve memory is allocated
Quando o Informix é inicialmente, há um segmento de memória virtual, que é igual ao tamanho do SHMVIRTSIZE. Se os segmentos mais são adicionados, você vai vê-los na saída acima, com uma classe de "V." Alternativamente, você pode verificar o log da mensagem para mensagens que mencionam "dynamically allocated new shared memory segment (size xx)." Para fazer isso, use onstat -m (para ver últimos 20 entradas no log de ​​mensagens) ou olhar através do registro de mensagem inteiro usando um comando correspondência (grep em UNIX).

Em um ambiente DSS, você também pode definir o DS_TOTAL_MEMORY variável. Esse valor é normalmente definido como uma determinada percentagem de SHMTOTAL. O percentual depende de quantos DSS contra consultas OLTP são executadas. O uso DS_TOTAL_MEMORY é monitorado através onstat -g mgm.

Espaço em Disco

Verificar o espaço em disco em um micro é sempre muito importante, agora imagina a importância quando falamos espaço nos servidores onde estão os bancos de dados, tendo em vista que servidores rodam serviços críticos e não podem parar.

Para verificar o espaço em disco utilizamos o comando “df -h” (sem as aspas), então serão exibidas as partições e dispositivos de armazenamento mapeados pelo sistema, contendo o caminho de montagem, espaço total, espaço usado, espaço disponível, porcentagem de uso. O “-h” é responsável por exibir os dados de forma a ser lida facilmente por humanos (-h vem de “human”, ou humano em inglês). Na imagem abaixo criei um script que ajuda em muito o monitoramento;
-------------------------------------------------------------------------------------------------
13/01/2014                      ***** INFORMIX BASIC SERVICES *****                      14:25:51
-------------------------------------------------------------------------------------------------

+--------+--------+-------------+------------+----------------------------------------------------+
| Total  | Usado  | Disponivel  | % de Uso   | FileSystem                                         |
+--------+--------+-------------+------------+----------------------------------------------------+
| 30G    | 22G    | 6.9G        | 76%        | /                                                  | 
| 1.1G   | 0      | 1.1G        | 0%         | /dev/shm                                           | 
+--------+--------+-------------+------------+----------------------------------------------------+

                    +---------------------------------------------------------+
                    |           Particao Com Mais de 70% Utilizacao           |
                    +---------------------------------------------------------+

+--------+--------+-------------+------------+----------------------------------------------------+
| Total  | Usado  | Disponivel  | % de Uso   | FileSystem                                         |
+--------+--------+-------------+------------+----------------------------------------------------+
| 28G    | 20G    | 6.4G        | 76%        | /                                                  | 
+--------+--------+-------------+------------+----------------------------------------------------+
Script para checar o Espaço disponível no servidor do banco
LOG1="/tmp/espaco_no_servidor_1234_$(whoami)_pode_deletar_1234_1.log"
LOG2="/tmp/espaco_no_servidor_1234_$(whoami)_pode_deletar_1234_2.log"

df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom | Use' | awk '{ print $2 "|" $3 "|" $4 "|" $5 "|" $6 }' > $LOG1

cat $LOG1 | awk -F "|" '{

    t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-6s | %-6s | %-11s | %-10s | %-50s | \n",$1,$2,$3,$4,$5)}' > $LOG2


clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo 


echo "+--------+--------+-------------+------------+----------------------------------------------------+"
echo "| Total  | Usado  | Disponivel  | % de Uso   | FileSystem                                         |"
echo "+--------+--------+-------------+------------+----------------------------------------------------+"

cat $LOG2

echo "+--------+--------+-------------+------------+----------------------------------------------------+"
echo
rm $LOG1
rm $LOG2

if [ $(df -hP | grep -vE 'Filesystem' | awk '{x=$5;sub ("%","",x)}x>70' | wc -l) -eq 1 ]
then

LOG3="/tmp/espaco_no_servidor_1234_$(whoami)_pode_deletar_1234_1.log"
LOG4="/tmp/espaco_no_servidor_1234_$(whoami)_pode_deletar_1234_2.log"

df -hP | grep -vE 'Filesystem' | awk '{x=$5;sub ("%","",x)}x>70 { print $2 "|" $3 "|" $4 "|" $5 "|" $6 }' > $LOG3
cat $LOG3 | awk -F "|" '{

   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-6s | %-6s | %-11s | %-10s | %-50s | \n",$1,$2,$3,$4,$5)}' > $LOG4

echo "                    +---------------------------------------------------------+"
echo "                    |           Particao Com Mais de 70% Utilizacao           |"
echo "                    +---------------------------------------------------------+"
echo
echo "+--------+--------+-------------+------------+----------------------------------------------------+"
echo "| Total  | Usado  | Disponivel  | % de Uso   | FileSystem                                         |"
echo "+--------+--------+-------------+------------+----------------------------------------------------+"

cat $LOG4

echo "+--------+--------+-------------+------------+----------------------------------------------------+"
echo
rm $LOG3
rm $LOG4

fi
Monitorando Atividade do Usuário

Problemas de desempenho às vezes pode ser totalmente relacionado com o que os usuários estão fazendo. Se as consultas aleatórias são permitidos em um sistema, ou há consultas demais, o desempenho do sistema pode ser bastante reduzido. Para descobrir quais usuários estão usando a instância Informix, utilize o comando onstat -u , que exibe a saída parecida com esta:
Userthreads
address flags    sessid  user   tty   wait tout locks nreads  nwrites
a270010  ---P--D 0       root   -     0    0    0    324     166
a270444  ---P--F 0       root   -     0    0    0    0       0
a270878  ---P--B 4       root   -     0    0    0    0       3
a270cac  ---P--D 0       root   -     0    0    0    0       0
a270cbd  ---P--D 49      ron    -     0    0    0    3224    1423
a270cbd  ---P--D 50      bob    -     0    0    0    7201    1244
6 active, 128 total, 38 maximum concurrent
Uma rápida observação sobre esta saída pode ver quem tem o maior número de leituras e gravações. A saída da impressão maior, pode ser mais difícil de monitorar, no entanto. A última linha da saída pode ajudar a decidir se o número de usuários é o problema.

Para acompanhar, através de uma consulta particular, você pode usar o ID da sessão ("sessid") que é exibido aqui. Executar o comando onstat -g ses sesid e ver as informações sobre a sessão particular, incluindo a consulta e informações mais detalhadas. Por exemplo, a seguir mostra parte da saída do comando onstat-g ses 49:
session                         #RSAM   total    used
id    user   tty   pid  hostname threads memory   memory
49    ron    4     9798 sparky   1      65536    55480
                                  
tid   name     rstcb    flags  curstk  status        
412   sqlexec   a271514  Y--P--- 1872    cond wait(netnorm)  
                                  
Memory pools  count 1                      
name       class addr    totalsize  freesize  #allocfrag  #freefrag
374        V     a42a010 65536      10056     156        8
...
Sess SQL        Current      Iso  Lock     SQL  ISAM  F.E.
Id   Stmt type   Database     Lvl Mode      ERR  ERR  Vers
374  SELECT      stores7      NL  Not Wait  0    0    7.14
                                  
Current statement name : slctcur                  
                                  
Current SQL statement :                        
select * from customer                      
                                  
Last parsed SQL statement :                      
select * from customer
Há vários campos úteis na saída deste comando, incluindo a consulta, a memória do usuário, e outras informações. Você pode obter uma parte menor da mesma informação usando o comando onstat -g sql sesid. Para obter informações para uma determinada linha dentro da sessão, o comando onstat -g tpf tid onde tid é o valor mostrado na saída do comando acima.

Você também pode usar onstat -g wai para encontrar segmentos que estão aguardando para serem processados ​​pelo Informix. Usando onstat -g rea mostra tópicos que estão prontos para ser executado.

Usando Utilitários para Monitoramento de Desempenho

Outra forma de monitorar o desempenho e a saúde de seus sistemas é através de ferramentas de monitoramento. Estas ferramentas são projetados para monitorar coisas como uso de CPU, uso de memória, e possíveis problemas. Algumas ferramentas fornecem suporte para assistir o desempenho do banco de dados, incluindo o monitoramento de consulta, uso do dbspace, e muito mais. Escolher uma ferramenta automatizada como este pode salvar um monte de etapas manuais que já foi mencionado anteriormente. Estas ferramentas são feitas para automatizar estas tarefas e pode simplificar muito a vida de um administrador.

Há muitas opções nessas ferramentas e mais se tornando disponíveis. Algumas das ferramentas fornecidas pelo Informix incluem onperf, oncockpit, and Informix Enterprise Command Center (IECC). IECC. O IECC é uma ferramenta baseada em GUI que simplifica as operações administrativas e de controle. Além disso, existem várias ferramentas de terceiros, como ferramentas da Compuware ECO e BMC Patrol.

Logical Log

A Logical Log do Informix mantém o histórico de transações da instância de todas as mudanças ocorridas desde o ultimo backup executado (nivél 0,1 ou 2) ,o INFORMIX gera logical logs conforme transações com o banco são efetuadas. O INFORMIX armazena registros dos logical logs que são gravados de forma circular através de arquivos criados dentro do chunk destinado ao Logical Log. Para saber as informações das logical logs disponiveis para gravação utilize o comando "onstat -l", quando todas as logical logs estão cheias ocorre o travamento do banco então é importante sempre monitorar a disponibilidade das logical logs;
Physical Logging
Buffer bufused  bufsize  numpages   numwrits   pages/io
  P-1  21       64       124        3          41.33
      phybegin         physize    phypos     phyused    %used   
      1:263            524288     338327     87         0.02    

Logical Logging
Buffer bufused  bufsize  numrecs    numpages   numwrits   recs/pages pages/io
  L-2  0        64       690        103        76         6.7        1.4     
        Subsystem    numrecs    Log Space used
        OLDRSAM      689        112344        
        HA           1          44            

address          number   flags    uniqid   begin                size     used    %used
54141fa8         3        U-B----  391      1:555271            15360    15360   100.00
54294f50         9        U-B----  392      6:53                51200    51200   100.00
54294fb8         10       U-B----  393      6:51253             51200    51200   100.00
54143838         11       U-B----  394      6:102453            51200    51200   100.00
541438a0         1        U-B----  395      1:570631            33280    33280   100.00
54143908         2        U-B----  396      1:603911            33280    33280   100.00
54143970         4        U-B----  397      1:654905            33280    33280   100.00
541439d8         12       U-B----  398      6:153653            51200    51200   100.00
54143a40         13       U-B----  399      6:204853            51200    51200   100.00
54143aa8         14       U---C-L  400      6:256053            51200    16093    31.43
54143b10         15       U-B----  387      6:307253            51200    51200   100.00
54143b78         16       U-B----  388      6:358453            51200    51200   100.00
54143be0         17       U-B----  389      6:409653            51200    51200   100.00
54143c48         18       U-B----  390      6:460853            51200    51200   100.00
 14 active, 14 total
Usando o banco de dados sysmaster

O banco de dados sysmaster é criado quando você inicia o Informix. Ele fornece uma boa parte da informação fornecida pelo comando "on". Usando o banco sysmaster ele permite que você construa suas próprias consultas e programas que fazem monitoramento. Por exemplo, você pode criar um programa que irá acompanhar grande parte das informações fornecidas pelo comando onstat -p (perfil do sistema). Isso permitirá que você criar suas próprias condições de alarme e processá-los em conformidade.

Um exemplo de uma consulta que esta analisando o comando onstat -p:
[teste:informix]$/export/home/informix> echo "select name, value from sysprofile" | dbaccess sysmaster

Database selected.

name                         value 

dskreads                      5674
bufreads                    166437
dskwrites                      137
bufwrites                     1242
isamtot                     127942
isopens                      15608
isstarts                      5884
isreads                      66377
iswrites                      1523
isrewrites                     158
isdeletes                        8
iscommits                      149
isrollbacks                      0
ovlock                           0
ovuser                           0
ovtrans                          0
latchwts                       210
buffwts                        250
lockreqs                     79363
lockwts                          0
ckptwts                          0
deadlks                          0
lktouts                          0
numckpts                         1
plgpagewrites                  124
plgwrites                        3
llgrecs                        690
llgpagewrites                  103
llgwrites                       76
pagreads                     37792
pagwrites                      268
flushes                          2
compress                        66
fgwrites                         0
lruwrites                        0
chunkwrites                     51
btradata                       225
btraidx                         35
dpra                            67
rapgs_used                     314
seqscans                       409
totalsorts                     104
memsorts                       104
disksorts                        0
maxsortspace                     0

45 row(s) retrieved.

Database closed.
Monitorando o Sistema Operacional e a Rede

É claro, problemas de desempenho podem ocorrer nos mais diferentes níveis. Se você está tendo tempo de resposta extremamente lento, por exemplo, o problema pode residir na rede. Da mesma forma, se a instância Informix está começando a ter problemas para acessar alguns dos drives de disco, você pode estar tendo erros de hardware. Finalmente, se o sistema está com falta de memória ou processador, você pode olhar para outras coisas que estão em execução no sistema operacional. Lembre-se que o Informix é o compartilhamento de disco, memória e CPU com o sistema operacional, que necessita de seus próprios recursos. Tenha em mente, porém, que eles não estão disponíveis em todos os sistemas UNIX. Se eles não estiverem disponíveis, descobrir quais utilitários do seu sistema oferece. Você pode obter informações que você precisa usando os comandos UNIX.

Estes comandos podem dar-lhe informações que você pode usar em conjunto com as informações que você recebe do Informix. Entre os dois, você deve ter uma boa idéia se o problema é um problema de configuração Informix ou apenas falta de recursos (como CPU).

A maioria dos sistemas operacionais possuem seus próprios arquivos de log. Esses arquivos podem mostrar erros que mais tarde poderiam afetar Informix (erro de I/O, por exemplo). Eles também devem ser regularmente monitorado.

Não se esqueça que as aplicações podem estar causando os problemas. Seguindo alguns dos métodos indicados para acompanhar as sessões do usuário, você pode rastrear o SQL original que estava sendo executado pelo usuário. Se você encontrar usuários que estão fazendo certas consultas (varredura seqüencial, por exemplo), você pode querer sugerir índices ou alterações em suas aplicações.

Estabilidade de Longo Prazo

Alguns comandos de manutenção em curso devem ser realizadas, mas não tão frequentemente como muitos dos comandos que já discutimos. Estes comandos podem ser melhor executadas em um job em bacth que executa em uma programação regular. Esta próxima seção descreve alguns desses comandos.

Update Statistic

As estatísticas de seu banco Informix ajuda o trabalho do otimizador de consultas a ficar mais eficaz. As estatísticas dizem ao Informix que tipo de dados está no banco de dados e que os seus valores aproximados. Esta informação ajuda o otimizador de consultas a encontrar a melhor maneira de fazer consultas. Abaixo vamos ver no banco producao_fiscal a tabela notas_fiscais esta com o update statistic ok - a data que rodei foi 25/08/2011 - esta atualizada a estatística dessa tabela:
[teste:informix]$/export/home/informix/utils2> dbschema -d producao_fiscal -hd all -t notas_fiscais | grep Constructed
Constructed on 2011-08-25 08:40:35.87640
Constructed on 2011-08-25 08:40:35.89038
Constructed on 2011-08-25 08:40:35.88854
Constructed on 2011-08-25 08:40:35.91328
Constructed on 2011-08-25 08:40:35.92672
Constructed on 2011-08-25 08:40:35.92451
Constructed on 2011-08-25 08:40:35.87555
Constructed on 2011-08-25 08:40:35.88929
Constructed on 2011-08-25 08:40:35.88751
Constructed on 2011-08-25 08:40:35.87061
Verificando suas tabelas e índices

No Informix as vezes as tabela e os dados de índice podem ser danificados (tem vários motivos para isso ocorrer um que poderia causa isso é o cancelamento do update statistic). Se os dado danificado não são acessados, ninguém vai saber do problema, até que mais dano ocorra. Ambos os casos não são bons. Uma maneira de evitar isso é para verificar regularmente suas tabelas e índices, dando os seguintes comandos:
oncheck -cD    -- checks data pages and answers no to questions
oncheck -cI    -- checks index pages and answers no to questions
Observe o "n" fornecido para cada comando. Isto instrui oncheck a ignorar qualquer pergunta sobre a tentativa de corrigir os dados se um erro for encontrado. Se você achar que você precisa para corrigir os erros, você pode executar oncheck novamente e atender manualmente ou executar o comando com "y" em vez de "n" no final.

Dica - Em alguns casos, pode ser difícil ou impossível para oncheck para corrigir os problemas. Se o problema é um índice, uma alternativa é deletando o indice (drop) e recriando ele de novo. Se for páginas de dados, você pode tentar descarregar os dados, mas pode não ser capaz de descarregar todos os seus dados.

Verificação de informações do sistema

Cada instância Informix tem informações importantes que está contido em suas "reserved pages" (páginas reservadas). Estas páginas são um roteiro para os dados na instância Informix, incluindo informações sobre cada chuck, checkpoints, arquivos, configuração de instância em geral (deve corresponder ONCONFIG), e outras estatísticas. Se as páginas reservadas estão danificados, o Informix pode ter sérios problemas. Para validar e, possivelmente, corrigir problemas, use o comando oncheck -cr
[teste]$/export/home/informix> oncheck -cr

Validating IBM Informix Dynamic Server reserved pages  

    Validating PAGE_PZERO...

    Validating PAGE_CONFIG...


    Validating PAGE_1CKPT & PAGE_2CKPT...
          Using check point page PAGE_2CKPT.

    Validating PAGE_1DBSP & PAGE_2DBSP...
          Using DBspace page PAGE_2DBSP.

    Validating PAGE_1PCHUNK & PAGE_2PCHUNK...
          Using primary chunk page PAGE_1PCHUNK.

    Validating PAGE_1ARCH & PAGE_2ARCH...
          Using archive page PAGE_1ARCH.
Ou para mostrar as páginas reservadas, use oncheck -pr

Cada banco de dados tem um conjunto de catálogos do sistema que contém informações sobre suas tabelas, índices e outros itens no banco de dados. Esses catálogos são tabelas que começam com "sys". É crucial que esses catálogos tenham as informações apropriadas, se danificado, podem deixar um banco de dados inteiro inacessível. Para verificar os catálogos, execute o comando SQL "update statistics" em cada banco de dados na instância e, em seguida, executar o comando oncheck -cc.

Revisando a Estrutura de Tabelas: Extents and Otherwise

Durante um período de tempo, os dados em tabelas podem ser distribuídos por várias unidades de disco/ou misturar com dados de várias outras tabelas. A maneira de evitar isso é para criar o espaço adequado extensões disco dedicado a algumas tabelas.

Tabelas com as extensões demais podem ter um impacto negativo sobre os tempos de resposta desde que os dados Informix está espalhado em muitas partes diferentes do disco. Um bom número máximo de extensões é de 10. Você pode evitar esse problema através da criação de extensões que são grandes o suficiente para manter os seus dados. A extensão pode ser criado com o quadro ou acrescentado mais tarde com a tabela nas declarações de create table ou alter table. Para monitorar a quantidade de extensões, tente executar o comando oncheck -pe, que irá exibir uma saída semelhante ao seguinte:
... Disk usage for Chunk 1                Start    Length
        ----------------------------      -------  ----------
      stores7:customer                    1000     13
      stores7:item                        1250     12
      stores7:customer                    3000     2500
Se você ver uma tabela que mostra muitas vezes esta saída, você pode considerar fazer o backup, dropping, e re-criando em uma tabela com o um bom tamanho de extensão inicial e no próximo.

O comando oncheck -pt irá mostrar as informações resumidas de todas as tabelas. Esta informação pode dizer quantas extensões cada tabela tem, como no exemplo a seguir:
TBLspace sysmaster:informix.syscolumns
  Physical Address    100011  
  Creation date    07/01/97 12:15:13
  TBLspace Flags    2    Row Locking
  Maximum row size    48    
  Number of special columns    0    
  Number of keys    1    
  Number of extents    7    
  Current serial value    1    
  First extent size    8    
  Next extent size    8    
  Number of pages allocated    64    
  Number of pages used    61    
  Number of data pages    34    
  Number of rows    1700  
  Partition partnum    1048580
Note que "Number of extents" é sete, ainda um número aceitável.

A última maneira de descobrir todos os tamanhos de extensão é a consulta a banco de dados sysmaster.

Script para Descobrir os Maiores Extents das Tabelas e Indices
-------------------------------------------------------------------------------------------------
18/02/2014                      ***** INFORMIX BASIC SERVICES *****                      12:47:42
-------------------------------------------------------------------------------------------------
                                         teste - informix

        Code  Function                                  
        ----  --------------------------------------------
          1   Maiores Tabelas                             
          2   Numero de Extents                           
          3   Nome da Tabela                              
          4   Extents/Banco de Dados                      
          0   Sair deste Programa                         
        ----  ------------------------------------------- 

     Digite um Codigo - 
Opção 01 - Maiores Tabelas
-------------------------------------------------------------------------------------------------
18/02/2014                      ***** INFORMIX BASIC SERVICES *****                      12:49:27
-------------------------------------------------------------------------------------------------


+----------------+------------------------------------+------------+------------+
| Database       | Table Name/Index                   | Extents    | Size       |
+----------------+------------------------------------+------------+------------+
| nfeletronica   | nfe_item_nf                        |         31 |      64985 |
| nfeletronica   | nfe_item_nf_entrada                |         28 |      39288 |
| sgf_desenv     | sgf_int_arr_gerencial              |          1 |      23143 |
| desenv         | guia_transito                      |         22 |      20004 |
| cteletronico   | cte_pessoa                         |          1 |      18432 |
| nfeletronica   | nfe_eletronica                     |         32 |      14340 |
| cteletronico   |  104_15                            |         32 |      14336 |
| sgf_desenv     | contribuinte                       |          1 |      12097 |
| nfeletronica   | pk_nfe_item_nf2                    |         29 |       9175 |
| desenv         | contribuinte                       |         23 |       9124 |
| sgf_desenv     | sgf_dad_econ                       |          2 |       8650 |
| sgf_desenv     | sgf_int_ent_interest_detalhe       |          1 |       8216 |
| fronteiras     | contribuinte                       |         27 |       8188 |
| nfeletronica   | pk_nfe_item_nf2_claudemar          |         22 |       5568 |
| efronteiras    | nf_dec_compra                      |         13 |       5120 |
| sgf_desenv     | ix_sgf_int_arr_817                 |          1 |       3605 |
| sgf_desenv     | ix_sgf_int_arr_380                 |          1 |       3099 |
| desenv         | ixgui_ins_guia                     |         19 |       3080 |
| sgf_desenv     | sgf_int_cartao_detalhe             |          1 |       2843 |
| desenv         |  168_491                           |         18 |       2820 |
| sgf_desenv     | notes_alim                         |          6 |       2459 |
| sgf_desenv     | ix_sgf_int_arr_755                 |          1 |       2246 |
| desenv         | lote                               |         17 |       2040 |
| sgf_desenv     | notes_alim_multa                   |          4 |       2014 |
| sgf_desenv     | sgf_int_divergencias               |          1 |       1913 |
| desenv         | ixgui_dt_saida                     |         14 |       1800 |
| sgf_desenv     | sgf_int_arr_desempenho             |          1 |       1657 |
| sgf_desenv     | sgf_int_ent_saida_detalhe          |          5 |       1646 |
+----------------+------------------------------------+------------+------------+

Pressione qualquer tecla para continuar...
Opção 02 - Numero de Extents - Tabelas com maiores extents
-------------------------------------------------------------------------------------------------
18/02/2014                      ***** INFORMIX BASIC SERVICES *****                      12:50:18
-------------------------------------------------------------------------------------------------


+----------------+------------------------------------+------------+------------+
| Database       | Table Name/Index                   | Extents    | Size       |
+----------------+------------------------------------+------------+------------+
| eletronicoct   |  104_15                            |         32 |      14336 | 
| nfeletronica   | nfe_eletronica                     |         32 |      14340 | 
| nfeletronica   | nfe_item_nf                        |         31 |      64985 | 
| nfeletronica   | pk_nfe_item_nf2                    |         29 |       9175 | 
| nfeletronica   | nfe_item_nf_entrada                |         28 |      39288 | 
| fronteiras     | contribuinte                       |         27 |       8188 | 
| desenv         | contribuinte                       |         23 |       9124 | 
| nfeletronica   | pk_nfe_item_nf2_claudemar          |         22 |       5568 | 
| desenv         | guia_transito                      |         22 |      20004 | 
| desenv         | ixgui_ins_guia                     |         19 |       3080 | 
| desenv         |  168_491                           |         18 |       2820 | 
| desenv         | lote                               |         17 |       2040 | 
| nfeletronica   |  108_55                            |         16 |       1408 | 
| fronteiras     | ixcon_nome_fan                     |         15 |       1280 | 
| desenv         | ix_lot_ins                         |         14 |       1280 | 
| desenv         | bal_vei_aferido                    |         14 |       1528 | 
| desenv         | ixgui_dt_saida                     |         14 |       1800 | 
| nfeletronica   | ix_nfe_chave_old                   |         14 |       1152 | 
| desenv         | ixgui_doc_mot_r                    |         13 |       1544 | 
| fronteiras     | ixcon_nome                         |         13 |       1024 | 
| efronteiras    | nf_dec_compra                      |         13 |       5120 | 
| fronteiras     |  112_51                            |         12 |        896 | 
| sysadmin       | mon_table_profile                  |         12 |       1428 | 
| desenv         | ixcon_nome_fan                     |         12 |       1256 | 
| nfeletronica   | ix_nfe_cons1                       |         11 |        768 | 
| fronteiras     | ixcgc_cpf                          |         11 |        768 | 
| desenv         | ixcon_nome                         |         11 |       1024 | 
+----------------+------------------------------------+------------+------------+

Pressione qualquer tecla para continuar...
Opção 4 - Extents/Banco de Dados
-------------------------------------------------------------------------------------------------
18/02/2014                      ***** INFORMIX BASIC SERVICES *****                      12:52:42
-------------------------------------------------------------------------------------------------

 +------------------+
 | BANCOS DE DADOS  |
 +------------------+
 | sysmaster        | 
 | sysutils         | 
 | sysuser          | 
 | sysadmin         | 
 | local            | 
 | teste            | 
 | teste2           | 
 | cteletronico     | 
 | efronteiras      | 
 | exp_desenv       | 
 | fronteiras       | 
 | syspgm4gl        | 
 | desenv           | 
 | onpload          | 
 | sgf_desenv       | 
 | nfeletronica     | 
 +------------------+


 Digite o NOME DO BANCO  : desenv
Maiores extents de tabelas neste banco;
-------------------------------------------------------------------------------------------------
18/02/2014                      ***** INFORMIX BASIC SERVICES *****                      12:53:07
-------------------------------------------------------------------------------------------------


============== ================================== ========== ==========
Database       Table Name/Index                   Extents    Size      
============== ================================== ========== ==========
desenv         contribuinte                               23       9124 
desenv         guia_transito                              22      20004 
desenv         ixgui_ins_guia                             19       3080 
desenv          168_491                                   18       2820 
desenv         lote                                       17       2040 
desenv         ix_lot_ins                                 14       1280 
desenv         bal_vei_aferido                            14       1528 
desenv         ixgui_dt_saida                             14       1800 
desenv         ixgui_doc_mot_r                            13       1544 
desenv         ixcon_nome_fan                             12       1256 
desenv         ixcon_nome                                 11       1024 
desenv          112_51                                    11        892 
desenv          284_1248                                  10        880 
desenv         ixvei_placa                                10       1160 
desenv         bal_dt                                      9        640 
desenv          319_1481                                   9        752 
desenv         ixvei_cavalo                                9       1032 
desenv         ixcgc_cpf                                   9        768 
desenv          168_2616                                   8        904 
desenv          168_2473                                   8        904 
desenv         ixgui_dt_entrada                            8        904 
desenv          509_2642                                   7        256 
desenv          168_2459                                   7        808 
desenv         ixgui_cgc_trans                             7        776 
desenv          168_2617                                   7        776 
desenv         ixmalote                                    7        384 
desenv         ix_cons_1                                   7        776 
desenv         alim                                        6        896 

Pressione qualquer tecla para continuar...
Script completo
# -----------------------------------------------------------------------------------------------#
# Funcao  : Checar os extents do banco Informix                                                  #  
# Autor   : Claudemar Martins de Sa                                                              #
# Data    : 14/04/2012                                                                           #
# Fonte   : http://www.vivaolinux.com.br/script/Menu-tarefas-com-SSH                             #
# -----------------------------------------------------------------------------------------------#
 
EXTENTS ()
{
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo "                                         $(hostname) - $(whoami)"

echo
echo "        Code  Function                                    "   
echo "        ----  --------------------------------------------"
echo "          1   Maiores Tabelas                             "
echo "          2   Numero de Extents                           "
echo "          3   Nome da Tabela                              " 
echo "          4   Extents/Banco de Dados                      " 
echo "          0   Sair deste Programa                         "      
echo "        ----  ------------------------------------------- "
echo
echo -n "     Digite um Codigo - "   
   read OPCAO2
   case $OPCAO2 in
      1) EXTENTS_TABLE_0001 ;;
      2) EXTENTS_TABLE_0002 ;;
      3) EXTENTS_TABLE_0003 ;;
      4) EXTENTS_TABLE_0004 ;; 
      0) exit ;;
      *) Opcao Invalida ; echo ; EXTENTS ;;
   esac
}  

# ======================================================================================================
# ======================================================================================================

EXTENTS_TABLE_0001 ()
{
LOG1="/tmp/1234_pode_deletar_1234_0.log"
LOG2="/tmp/1234_pode_deletar_1234_1.log"
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo "                    +---------------------------------------------------------+"
echo "                    |                                                         |"
echo "                    |                aguarde alguns segundos ...              |"
echo "                    |                                                         |"
echo "                    +---------------------------------------------------------+"
echo
dbaccess sysmaster > /dev/null <<+
unload to $LOG1
select first 28 dbsname, tabname, count(*) num_of_extents, sum(pe_size) total_size from systabnames, sysptnext where partnum = pe_partnum and  partnum  > 99  and  

dbsname <> "sysmaster" and tabname <> "TBLSpace" group by 1,2 order by total_size desc;
+
cat $LOG1 | awk -F "|" '{

   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-14s | %-34s | %10d | %10d |\n",$1,$2,$3,$4)}' > $LOG2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo 
echo
echo "+----------------+------------------------------------+------------+------------+"
echo "| Database       | Table Name/Index                   | Extents    | Size       |"
echo "+----------------+------------------------------------+------------+------------+"
cat $LOG2
echo "+----------------+------------------------------------+------------+------------+"
rm $LOG1
rm $LOG2

echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
EXTENTS
}


# ======================================================================================================
# ======================================================================================================

EXTENTS_TABLE_0002 ()
{
LOG1="/tmp/1234_pode_deletar_1234_0.log"
LOG2="/tmp/1234_pode_deletar_1234_1.log"
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo "                    +---------------------------------------------------------+"
echo "                    |                                                         |"
echo "                    |                aguarde alguns segundos ...              |"
echo "                    |                                                         |"
echo "                    +---------------------------------------------------------+"
echo
dbaccess sysmaster > /dev/null <<+
unload to $LOG1
select first 27 dbsname, tabname, count(*) num_of_extents, sum(pe_size) total_size from systabnames, sysptnext where partnum = pe_partnum and  partnum  > 99  and  

dbsname <> "sysmaster" and tabname <> "TBLSpace" group by 1,2 order by num_of_extents desc;
+
cat $LOG1 | awk -F "|" '{

   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-14s | %-34s | %10d | %10d | \n",$1,$2,$3,$4)}' > $LOG2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo 
echo

echo "+----------------+------------------------------------+------------+------------+"
echo "| Database       | Table Name/Index                   | Extents    | Size       |"
echo "+----------------+------------------------------------+------------+------------+"
cat $LOG2
echo "+----------------+------------------------------------+------------+------------+"
rm $LOG1
rm $LOG2

echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
EXTENTS
}

# ======================================================================================================
# ======================================================================================================

EXTENTS_TABLE_0002 ()
{
LOG1="/tmp/1234_pode_deletar_1234_0.log"
LOG2="/tmp/1234_pode_deletar_1234_1.log"
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo "                    +---------------------------------------------------------+"
echo "                    |                                                         |"
echo "                    |                aguarde alguns segundos ...              |"
echo "                    |                                                         |"
echo "                    +---------------------------------------------------------+"
echo
dbaccess sysmaster > /dev/null <<+
unload to $LOG1
select first 27 dbsname, tabname, count(*) num_of_extents, sum(pe_size) total_size from systabnames, sysptnext where partnum = pe_partnum and  partnum  > 99  and  

dbsname <> "sysmaster" and tabname <> "TBLSpace" group by 1,2 order by num_of_extents desc;
+
cat $LOG1 | awk -F "|" '{

   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-14s | %-34s | %10d | %10d | \n",$1,$2,$3,$4)}' > $LOG2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo 
echo
echo "+----------------+------------------------------------+------------+------------+"
echo "| Database       | Table Name/Index                   | Extents    | Size       |"
echo "+----------------+------------------------------------+------------+------------+"
cat $LOG2
echo "+----------------+------------------------------------+------------+------------+"

rm $LOG1
rm $LOG2

echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
EXTENTS
}


# ======================================================================================================
# ======================================================================================================

EXTENTS_TABLE_0003 () {

LOG1="/tmp/1234_pode_deletar_1234_0.log"
LOG2="/tmp/1234_pode_deletar_1234_1.log"
LOG3="/tmp/1234_pode_deletar_1234_3.log"
LOG4="/tmp/1234_pode_deletar_1234_4.log"

dbaccess sysmaster > /dev/null <<+
unload to $LOG1
select name from sysdatabases;
+
clear
cat $LOG1 | awk -F "|" '{

printf(" | %-16s | \n",$1)}' > $LOG2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo -n " Digite o NOME DA TABELA : "
read NOME_DA_TABELA
echo
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo "                    +---------------------------------------------------------+"
echo "                    |                                                         |"
echo "                    |                aguarde alguns segundos ...              |"
echo "                    |                                                         |"
echo "                    +---------------------------------------------------------+"
echo

dbaccess sysmaster > /dev/null <<+
unload to $LOG3
select first 27 dbsname, tabname, count(*) num_of_extents, sum(pe_size) total_size from systabnames, sysptnext where partnum = pe_partnum and  partnum  > 99  and  

dbsname <> "sysmaster" and tabname <> "TBLSpace" and tabname = 
"$NOME_DA_TABELA" group by 1,2 order by num_of_extents desc;
+
cat $LOG3 | awk -F "|" '{

   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("| %-14s | %-34s | %10d | %10d | \n",$1,$2,$3,$4)}' > $LOG4

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo 
echo
echo "+----------------+------------------------------------+------------+------------+"
echo "| Database       | Table Name/Index                   | Extents    | Size       |"
echo "+----------------+------------------------------------+------------+------------+"
cat $LOG4
rm $LOG1
rm $LOG2
rm $LOG3
rm $LOG4
echo "+----------------+------------------------------------+------------+------------+"
echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
EXTENTS
}


# ======================================================================================================
# ======================================================================================================

EXTENTS_TABLE_0004 () {

LOG1="/tmp/1234_pode_deletar_1234_0.log"
LOG2="/tmp/1234_pode_deletar_1234_1.log"
LOG3="/tmp/1234_pode_deletar_1234_3.log"
LOG4="/tmp/1234_pode_deletar_1234_4.log"

dbaccess sysmaster > /dev/null <<+
unload to $LOG1
select name from sysdatabases;
+
clear
cat $LOG1 | awk -F "|" '{

printf(" | %-16s | \n",$1)}' > $LOG2

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo " +------------------+"
echo " | BANCOS DE DADOS  |"
echo " +------------------+"
cat $LOG2
echo " +------------------+"
echo
echo
echo -n " Digite o NOME DO BANCO  : "
read BANCO_DE_DADOS
echo
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo "                    +---------------------------------------------------------+"
echo "                    |                                                         |"
echo "                    |                aguarde alguns segundos ...              |"
echo "                    |                                                         |"
echo "                    +---------------------------------------------------------+"
echo

dbaccess sysmaster > /dev/null <<+
unload to $LOG3
select first 28 dbsname, tabname, count(*) num_of_extents, sum(pe_size) total_size from systabnames, sysptnext where partnum = pe_partnum and  partnum  > 99  and  

dbsname <> "sysmaster" and tabname <> "TBLSpace" and dbsname = 
"$BANCO_DE_DADOS" group by 1,2 order by num_of_extents desc;
+
cat $LOG3 | awk -F "|" '{

   t_iso=$1
if ($1 == "|")
{ t_iso=" " }

printf("%-14s %-34s %10d %10d \n",$1,$2,$3,$4)}' > $LOG4

clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo 
echo
echo "============== ================================== ========== =========="
echo "Database       Table Name/Index                   Extents    Size      "
echo "============== ================================== ========== =========="
cat $LOG4
rm $LOG1
rm $LOG2
rm $LOG3
rm $LOG4

echo
echo -n "Pressione qualquer tecla para continuar..."
read MSG
clear
EXTENTS
}

# ======================================================================================================
# ======================================================================================================

EXTENTS
Correção e Resolução de Problemas

Você já aprendeu várias maneiras de monitorar seus servidores, observando o desempenho e prevenir problemas. Mas às vezes o problema é que virá, não importa o que você faz. É inevitável: as coisas vão mal . Aqui vamos discutir como abordar e corrigir alguns problemas comuns.

Há muitos erros que fará com que Informix pare imediatamente e fique off line, possivelmente causando danos aos seus dados e bases de dados. Possíveis problemas incluem:
- Problemas de hardware como disco e CPU.
- Erros internos Informix: páginas corrompidas, etc;
- Erros de memória.
- Falhas no sistema operacional.
- Programas do usuário com erro gritantes.
Como administrador, você precisa estar preparado para lidar com qualquer um desses erros. A regra número um de um administrador é:
NÃO ENTRE EM PÂNICO;
Um enorme número de falhas do sistema não causam danos e são recuperados através do sistema de recuperação de Informix. Verificando o Log das Mensagens

Por exemplo se o seu banco Informix ficar Off-Line, você deve primeiro verificar o log das ​​mensagens para ver o que aconteceu. Para exibir as últimas 20 linhas do log da mensagem, escreva onstat -m . Se você precisa ver mais do registo de mensagens, acesse o arquivo de log do informix usando o um editor de texto ou outro comando. Para descobrir onde esta o arquivo de log do Informix este é um comando rápido para descobrir;
[teste]$/export/home/informix> onstat -m | grep 'Message Log File:' | awk '{print $4 }'
/export/home/informix/online.log
[teste]$/export/home/informix> 
Dica: As mensagens no log de ​​mensagens são listadas no guia do Informix Dynamic Server Administrator's guide.

Muitos detalhes sobre o erro são incluídas no registo de mensagens. Por exemplo, a menção de um "I/O error" é uma boa indicação de um problema com hardware.

Manipulação de falhas de declaração

A mensagem comum para falhas Informix indica uma "assertion failure". Uma AF é simplesmente uma mensagem do Informix afirmando que não pode realizar uma operação necessária e precisou ficar Off. Esses erros muitas vezes exigem uma parada simples e de inicialização da instância, mas ainda deve ser investigado.

A partir da versão 7.30, Informix tenta capturar falhas de declaração e matar apenas que a sessão Informix, automaticamente salvando as informações de depuração necessário. Isso deve impedir de deixar de funcionar durante o Informix falhas de declaração. A falha, naturalmente, ser documentada no registro de mensagens para essa instância Informix.

Um AF quase sempre cria um ou mais arquivos que dão informações completas sobre o erro. O arquivo mais comum é AF.nnn onde nnn é um número hexadecimal único. Outros arquivos possíveis são um arquivo de memória compartilhada (shm. nnn), um dump de memória de processos VP (gcore. nnn ), e um core dump regular. Os dados nestes arquivos podem não significar nada para você, mas eles são muito importantes para o suporte técnico do Informix.

Criei um script para facilitar a busca dos AF, ele chega o arquivo de log do Informix e lista todos que ele encontrar lá;
LOG1="/tmp/1234_$(whoami)_pode_deletar_1234_0.log"
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n "      "
echo -n "                ***** INFORMIX BASIC SERVICES *****   "
echo -n "                   "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo

LOG="$(onstat -c | grep MSGPATH | grep / | awk '{print $2}')"
cat $LOG  | grep "/af." > $LOG1 ; tail -n 32 $LOG1; rm $LOG1

echo
Resultado
[teste:informix]$/export/home/informix> ./af_gerados.sh

-------------------------------------------------------------------------------------------------
18/02/2014                      ***** INFORMIX BASIC SERVICES *****                      13:31:15
-------------------------------------------------------------------------------------------------

01/30/14 07:44:36  stack trace for pid 18829 written to /opt/informix64/tmp/af.6582d14
01/30/14 07:44:36   See Also: /opt/informix64/tmp/af.6582d14
01/30/14 07:46:02  stack trace for pid 18829 written to /opt/informix64/tmp/af.6582d14
01/30/14 07:46:02   See Also: /opt/informix64/tmp/af.6582d14

[teste:informix]$/export/home/informix> 
Nota: Você pode configurar o que acontece durante um AF através da definição de certos parâmetros no arquivo de ONCONFIG. Estes parâmetros começam com a palavra DUMP e incluem DUMPCORE, DUMPSHMEM, DUMPDIR e DUMPCNT. Definição desses parâmetros permite que as informações sobre a falha.

Descrição desses comandos;

DUMPDIR - Especifica um diretório no qual o banco vai salvar o erro do AF quando ele ocorrer, defina um DUMPDIR que tenha espaço pois pode ocorrer do Informix gerar um arquivo muito grande..

DUMPSHMEM - Indica se ocorrer um (dump) de shared memory será gravado no arquivo shmem.pid.cnt no diretório especificado pelo parâmetro de configuração DUMPDIR. Se DUMPSHMEM é definido como 1, toda a shared memory que o servidor de banco usa é gravada, o que pode resultar em um arquivo grande. Quando o espaço é limitado, definido DUMPSHMEM a 2 é salvo um arquivo menor de despejo de shared memory. O valor pid é o número de identificação do processo para o processador virtual. Os valores aceitaves são: (0 - Desatilitado), (1 - grava tudo da shared memory, gera um arquivo grande) e (2 exclui o pool de buffers do dump).

DUMPGCORE - É usada com sistemas operacionais gcore apoio. Se você definir DUMPGCORE, mas seu sistema operacional não suporta gcore, as mensagens no log de mensagens banco de dados do servidor indicam que foi feita uma tentativa de despejo de uma imagem central, mas o servidor de banco de dados não pode encontrar o arquivo que o esperado.

DUMPCORE - Controles DUMPCORE se falhas de declaração causar um processador virtual para despejar uma imagem central. O arquivo de núcleo fica no diretório do qual o servidor de banco de dados foi a última chamada. (O parâmetro DUMPDIR não tem impacto sobre a localização do arquivo central.) Aviso: Quando DUMPCORE é definido como 1, um AF faz com que um processador virtual possa despejar uma imagem do núcleo, que por sua vez faz com que o banco de dados possa abortar. Definir DUMPCORE apenas para fins de depuração em um ambiente controlado.

O Informix as vezes passa informações durante um AF, muitas vezes, incluindo uma possível solução para o problema;
04/16/12 18:29:01  Assert Failed: Row allocation error on 'teste:"dba".aidf'
04/16/12 18:29:01  IBM Informix Dynamic Server Version 
04/16/12 18:29:01   Who: Session(27032, informix@teste, 0, 0x55623ce0)
                Thread(27138, CDRD_86, 55f04ad8, 5)                    
                File: rsbitmap.c Line: 2653                            
04/16/12 18:29:01   Results: Internally corrected                      
04/16/12 18:29:01   Action: Run 'oncheck -cD 1049378'                  
04/16/12 18:29:01  stack trace for pid 17205 written to /opt/informix/tmp/af.6dea9d2c
04/16/12 18:29:01   See Also: /opt/informix/tmp/af.6dea9d2c            
04/16/12 18:29:03  Row allocation error on 'teste:"dba".aidf'
Neste AF a ACTION é rodar o 'oncheck -cD 1049378'. Neste caso é só rodar para ver no que vai dar, neste caso exclusivamente não resolveu dar este comando tive que fazer um backup da tabela, deletar ela (drop) e recriar e recarregar o backup que fiz, dai resolveu

Certifique-se de analisar cuidadosamente esta informação para descobrir o que causou o problema, e se for o caso, tente a ação corretiva. Quando ocorre um AF, você deve:

1 - Verifique o arquivo de log para encontrar o processo que causou o AF.

2 - Se a instância é suspensa, ou ainda esta on-line, você deve salvar o AF gerado e repassar ao suporte técnico.

3 - Veja no site da IBM e veja os histórico do sistema e falhas por um erro semelhante. Se for encontrado, observe o que a causou e como foi resolvido.

4 - Tentar determinar a causa do erro. Se você não conseguir determinar a causa, que poderia ser melhor acionar o suporte técnico do Informix neste momento. Se o seu engine está suspenso, o Informix pode executar diferentes comandos onstat e oncheck.

5 - Verifique se a instância Informix ainda está on-line, executando o comando onstat - na linha de comando UNIX. Se o status estiver "On-Line", a instância ainda está em execução - você pode verifique o que causou este AF
[teste:informix]$/export/home/informix > onstat -

IBM Informix Dynamic Server Version 11.70.FC2 -- On-Line -- Up 2 days 14:53:33 -- 307672 Kbytes

[teste:informix]$/export/home/informix> 
Agora se a instancia estiver off-line;
 [teste:informix]$/export/home/informix> onstat -
shared memory not initialized for INFORMIXSERVER 'teste'
[teste:informix]$/export/home/informix> 
Coloque a instancia online, se subir veja o AF o que faz a instancia cair - comando oninit -v
[teste:informix]$/export/home/informix> oninit -v
Reading configuration file '/opt/informix64/etc/onconfig.teste'...succeeded
Creating /INFORMIXTMP/.infxdirs...succeeded
Checking config parameters...succeeded
Allocating and attaching to shared memory...succeeded
Creating resident pool 23330 kbytes...succeeded
Allocating 29808 kbytes for buffer pool of 2K page size...succeeded
Allocating 960016 kbytes for buffer pool of 16K page size...succeeded
Creating infos file "/opt/informix64/etc/.infos.teste"...succeeded
Linking conf file "/opt/informix64/etc/.conf.teste"...succeeded
Initializing rhead structure...succeeded
Writing to infos file...succeeded
Initialization of Encryption...succeeded
Initializing ASF...succeeded
Initializing Dictionary Cache and SPL Routine Cache...succeeded
Bringing up ADM VP...succeeded
Creating VP classes...succeeded
Onlining 0 additional cpu vps...succeeded
Onlining 2 IO vps...succeeded
Forking main_loop thread...succeeded
Initializing DR structures...succeeded
Forking 1 'soctcp' listener threads...succeeded
Forking 1 'soctcp' listener threads...succeeded
Starting tracing...succeeded
Initializing 7 flushers...succeeded
Initializing SDS Server network connections...succeeded
Initializing log/checkpoint information...succeeded
Initializing dbspaces...succeeded
Opening primary chunks...succeeded
Opening mirror chunks...succeeded
Validating chunks...succeeded
Initialize Async Log Flusher...succeeded
Starting B-tree Scanner...succeeded
Initializing DBSPACETEMP list...succeeded
Checking database partition index...succeeded
Initializing dataskip structure...succeeded
Checking for temporary tables to drop...succeeded
Updating Global Row Counter...
Forking onmode_mon thread...succeeded
Creating periodic thread...succeeded
Starting scheduling system...succeeded
Verbose output complete: mode = 5
Se não ficar online;
[teste:informix]$/export/home/informix> oninit -v
Reading configuration file '/opt/informix64/etc/onconfig.teste'...succeeded
Creating /INFORMIXTMP/.infxdirs...succeeded
Illegal number of buffs -129542144, or buffers configuration parameter
not specified. It must be between 100 and 2147483647.
Checking config parameters...FAILED

WARNING: server initialization failed, or possibly timed out (if -w was used).
Check the message log, online.log, for errors.
[teste:informix]$/export/home/informix> 
6 - Provavelmente é hora de chamar suporte técnico do Informix ou de você checa com calma o AF gerado.

Dicas Importantes - Arquivos que o suporte técnico vai pedir;

6.1 - Se tiver arquivos de AF peque eles para enviar (AF + AFxxxxxs.rawstk)
[s106:informix]$/opt/informix/tmp> ls -la
total 130276
drwxrwx---  3 informix informix    4096 Sep 26 12:07 .
drwxr-xr-x 27 informix informix    4096 Sep 23 10:42 ..
drwxrwx---  2 root     informix    4096 Jun 27 21:11 0
-rw-rw----  1 informix informix 2873763 Sep 26 10:03 af.ad7a8476
-rw-rw----  1 informix informix  633636 Sep 26 09:56 af.ad7a8476.rawstk
6.2 - Pegar no log a data do dia do erro do online.log

6.3 - De o comando onstat -a e mande para um arquivo para enviar.
[teste:informix]$/export/home/informix> onstat -a > onstat_a
[teste:informix]$/export/home/informix>
Display do arquivo
[teste:informix]$/export/home/informix> ls -la onstat*
-rw-r--r-- 1 informix informix 1653631 Sep 26 12:49 onstat_a
[teste:informix]$/export/home/informix>
7 - Se o log de ​​mensagens sugeriu uma ação corretiva (oncheck -cDI, por exemplo), tente executar esse comando antes de permitir que os usuários on-line.

Na maioria das vezes, um dos três passos passos acima serão suficiente para trazer de volta Informix on-line e você não terá que levá-la ainda mais. Se não, você vai precisar para aplicar as habilidades de alguns administrador reais.

Usando o que você sabe: Senso Comum e Conhecimento de Trabalho

Depois de um tempo, os administradores do Informix desenvolvem um sexto sentido sobre os problemas. Através da experiência, você será capaz de reconhecer erros intuitivamente e saber como corrigi-los. Estes são o tipo de coisas que são difíceis de ensinar em um livro, pois eles vêm naturalmente. Mas é uma maneira de pensar.

Realmente considerar o que aconteceu e o que poderia ter causado. Pensar logicamente através das mensagens e das condições do sistema e tentar eliminar o óbvio. Considere o que aconteceu com o seu sistema no passado. Executar vários comandos Informix para tentar rastrear problemas. Lembre-se que alguns acidentes são causados ​​por problemas com a liberação no Informix atuais e suas aplicações. Mais uma vez, não entre em pânico e logicamente verifique o que possa ter ocorrido.

Segue-se uma anedota interessante de Clem Akins, engenheiro e Suporte Técnico do Informix. Observe como Clem seguiu os passos lógicos, mas teve que realmente improvisar para encontrar o problema:
O erro de um Assert Fail (AF) é devido a uma violação da segmentação de memória. A engine foi dado um endereço que estava fora dos limites, e ele caiu. Depois de uma semana de todos os dias de duração, o esforço no local provamos que a culpa estava com uma parte do disco rígido que foi usado para armazenamento temporário. O Informix iria escrever um endereço lá, e recuperar outro. A verificação de limites internos é bom o suficiente para encontrar a falha e salvar antes corrompendo os dados. Como o cliente era uma instituição financeira, que conta que, mesmo após o período difícil que nos deram no início. Corremos oncheck como ele diz para fazer, mas não encontrou erros. Examinamos o rastreamento de pilha, e comparou-o ao código fonte otimizador que estava correndo quando caiu . Enviamos as lixeiras nucleares e . Arquivos af para Informix Suporte Avançado para análise posterior. Reproduzimos o erro usando o banco de dados stores7 (embora tivemos que fazer algumas das tabelas várias vezes maior para ver o erro). Suporte Avançado finalmente construiu uma máquina exatamente como o cliente de , executou a consulta exata com os mesmos dados , e não teve erros. Tendo em conta que , demos algum pensamento pesado e análise de longo, profundo e encontrou o disco ruim.
Essa história demonstra uma época em que o óbvio não resolveu o problema e levou improvisação real. Se algo simplesmente não faz sentido, começar a pensar em outras coisas que poderia ter causado o problema.

Chamando Suporte Técnico Informix

Informix oferece excelente suporte técnico. Em alguns casos, ou você tem esgotado todas as suas idéias ou o problema não pode ser fixado por você. Isto é, quando você deve ligar para o suporte técnico. Certifique-se de que suas informações juntos antes de ligar. Mais uma vez, dar uma olhada as opiniões de Clem Akins.

"A coisa mais importante a fazer é tomar o ponto de vista do engenheiro de suporte Esta visão inclui coisas como.:

- Posso reproduzir o problema à vontade?
- Já pensei sobre o porquê de esse problema ocorre?
- Quais são as possíveis causas?
- Posso isolá-los e testá-los individualmente?
- O que mudou que causou o problema? (Sistema, rede, banco de dados de alterações, a aplicação?)

É o caso de teste o mais simples possível que irá reproduzir o problema? Será que se reproduzem no banco de dados stores7?

Será que se reproduzem apenas com SQL simples em vez de exigir código personalizado complexos ou aplicativos ou tabelas?

Tenho um contrato de dial-up no lugar com suporte Informix? (Gee, eu gostaria de ter pensado nisso durante o horário comercial ...) O que é o número do meu contrato de suporte (ou número de série do produto) e que tipo de apoio que eu tenho? É toda a minha informação de suporte pronto para fornecer a Informix?

Quando falo com o engenheiro de suporte vou soar como um profissional de TI que tem tomado todas as medidas razoáveis ​​para resolver o problema? Melhor ainda, como uma pessoa que também tem de suportar código e que pensa sobre a pobre alma que está tentando ajudar-me do outro lado de um telefone! "

Restaurando o backup

Certos erros serão simplesmente irrecuperável. Nestes tempos, você pode ver o temido "restaurar a partir de um arquivo" erro. Neste ponto, o administrador vai olhar como um herói se tivesse implementado um backup forte e plano de recuperação (que é claro que todos nós fazemos!).

Atenção: Às vezes, uma mensagem de erro Informix irá sugerir "restauração de um backup." Isso nem sempre é uma afirmação verdadeira! Muitas vezes, é apenas uma questão de o engine Informix temporariamente confuso sobre o que está acontecendo. Mesmo quando a "restaurar a partir de uma mensagem de backup" é exibida, eu sugiro fortemente a passar por todas as etapas para tentar obter a instância de volta na linha. Se isso não funcionar, tente chamar o suporte técnico antes de fazer a restauração, o que poderia causar uma grande perda de dados.

Existem dois tipos de restaurações (quentes e frias). O tipo que você escolher depende do seu erro. Consulte a documentação do Informix para a estratégia de backup que você está usando ( onbar , ontape , onarchive , etc.)

A quantidade de dados de restaurar vai depender do seu nível de backup. De um modo geral, o processo é:

- Restaurar o backup no nível 0-passado.
- Restaurar todos os backups de nível 1 e nível 2 desde o nível 0, se houver.
- Restaurar todos os logs lógica apropriada, se houver.
- Se você não estiver usando o log, você só pode ir tão longe como o passo 2. O ponto de restauração depende de sua agenda de backup. Se você precisa chegar tão perto quanto possível do ponto-in-time do banco de dados, você precisa ter implementado bancos de dados registrados e devidamente backup de todos os logs lógicos.

Sumário

Este capítulo descreveu o processo em curso de manutenção de seus servidores Informix. Você aprendeu vários comandos que pode ser feito em uma base contínua para assistir seus servidores para possíveis problemas ou gargalos. E você aprendeu o melhor método para contatar o suporte Informix em tempos para baixo.

Este artigo é um excerto de um capítulo nos próximos Informix Handbook deve sair ainda este ano. O Manual Informix promete ser uma solução global, guia de referência deve ter a produtos Informix. O livro fornece informações bastante detalhadas e informações de referência sobre vários produtos e assuntos.

Créditos - Clique Aqui