Compartilhando conhecimento com o mundo

Com tecnologia do Blogger.

Pesquisa

Download

Blogger Tricks

Blogger Themes

Visitas

Assuntos

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

0 comentários:

Enviar um comentário