quinta-feira, 18 de fevereiro de 2010

Shell Script para Atualizar o Logix 5.10

Saudações a todos!!!

Estou postando esse script, pois um colega de trabalho , o Caio me pediu, ele esta fazendo um script para atualizar o logix 5.10, aqui ele vai ter uma boa ideia.  Boa sorte a todos.

Força ai Caio.
#!/bin/sh
# Script elaborado por Amilcar em 10-10-2003
LgxBkp="/bkpifx/bkp_fnt"
DtLgx=`date +"%Y%m%d_%H%M"`
Logo="/logix"
LogoTst="/logix_tst"
FntLgx="$Logo/fnt"
FntLgxTst="$LogoTst/fnt"
echo ""
echo "Scrip de Atualizacao de Fontes e OS Logix - Logocenter"
echo "======================================================"
echo ""
echo "Tecle Enter para Continuar..."
read enter
echo ""
echo "Atualizacao somente da base Teste ??? [y/n]"
echo "====================================="
read AtuTst
if [ $AtuTst == "n" ]
then
    echo "Processo de atualizacao somente da Base de Producao"
    echo "==================================================="
    echo ""
    read enter
    ls -l $FntLgx/*.zip > /dev/null 2> /dev/null
    cat /dev/null > /tmp/bkpfnt.tmp 2> /dev/null
    ConfArq=$?
    if [ ! $ConfArq == 0 ]
    then
            echo "Nao existem Fontes/OSs a serem Atualizados no momento!"
    else
            rm /tmp/bkpfnt.tmp > /dev/null 2> /dev/null
            echo "Foram encontrados os seguintes arquivos para atualizacao:"
            ls -l $FntLgx/*.zip
            echo ''
            for ZipLogo in `ls -A $FntLgx/*.zip`
            do
                echo "Analisando o arquivo $ZipLogo..."
                OSFNT=`echo $ZipLogo | awk -F '/' {'print $5'} | awk -F '-' {'print $1'} 2> /dev/null`
                unzip -j -o  $ZipLogo -d $FntLgx
                echo '' >> /tmp/bkpfnt.tmp
                echo "- Arquivos existentes na OS/Fnt $OSFNT e nao efetuado backup:" >> /tmp/bkpfnt.tmp 
                for OrgLogo in `unzip -l $ZipLogo | awk -F '\' {'print $6'} | grep -v '.cnv'`  
                do
                        VerDir=`echo $OrgLogo | awk -F '.' {'print $1'} |awk -F"[0-9]" '{print $1}' | cut -c 1-3`
                        if [ $VerDir = 'con' ]
                        then
                                VerDir=`echo 'contab'`
                        fi
                        FixDir="$Logo/$VerDir"
                        ls $FixDir | grep $OrgLogo > /dev/null
                        NotVer=$?
                        if [ $NotVer == 0 ]
                        then
                                if test ! -d $LgxBkp/$DtLgx/$OSFNT
                                then
                                        mkdir -p $LgxBkp/$DtLgx/$OSFNT
                                        echo "SELECT log_versao_prg.*, " >> $LgxBkp/$DtLgx/$OSFNT/files.sql
                                        echo "'$DtLgx' as date_time,'$OSFNT' as OS_Fnt,'$LgxBkp/$DtLgx/$OSFNT' as caminho "  >> $LgxBkp/$DtLgx/$OSFNT/files.sql
                                        echo "FROM log_versao_prg" >> $LgxBkp/$DtLgx/$OSFNT/files.sql
                                        echo "WHERE lower(log_versao_prg.num_programa) in (" >> $LgxBkp/$DtLgx/$OSFNT/files.sql
                                fi
                                echo "Movendo o arquivo $FixDir/$OrgLogo para $LgxBkp/$DtLgx/$OSFNT"
                                mv $FixDir/$OrgLogo $LgxBkp/$DtLgx/$OSFNT
                    echo "Copiando arquivo $FntLgx/$OrgLogo para $FixDir"
                    cp $FntLgx/$OrgLogo $FixDir
                    chmod 777 $FixDir/$OrgLogo
                    chown admlog.logix $FixDir/$OrgLogo
                                ARQFNT=`echo $OrgLogo | awk -F '.' {'print $1'}`
                                echo "'$ARQFNT', "  >> $LgxBkp/$DtLgx/$OSFNT/files.sql
                        else
                                echo "Arquivo $FixDir/$OrgLogo nao encontrado!" >> /tmp/bkpfnt.tmp
                    echo "Copiando arquivo $FntLgx/$OrgLogo para $FixDir"
                    cp $FntLgx/$OrgLogo $FixDir
                    chmod 777 $FixDir/$OrgLogo
                    chown admlog.logix $FixDir/$OrgLogo
                        fi
                done
                rm $ZipLogo
            done
            echo ''
            echo '*** CONVERSORES ENCONTRADOS ***'
            ls -lA $FntLgx/*.cnv > /dev/null 2> /dev/null
            ConfCNV=$?
            if [ ! $ConfCNV == 0 ]
            then
                 echo "Nao existem conversores a serem executados!"
            else      
                    echo "Foram encontrados os seguintes conversores para serem executados:"
                    for CNVLogo in `ls -A $FntLgx/*.cnv 2> /dev/null`
                    do
                        echo "Movendo conversor $CNVLogo para $Logo/cnv"
                        mv $CNVLogo $Logo/cnv
                    done
            fi
            rm -rf $FntLgx/*
            echo ''
            echo 'ERROS: Os seguintes erros foram encontrados durante a atualizacao:'
            cat /tmp/bkpfnt.tmp
            echo ''
            echo '*** FIM do scrip de backup das OSs/Fontes ***'
    fi
    echo ''
else
    echo "Processo de atualizacao somente da Base de Teste..."
    echo "==================================================="
    read enter
    ls -l $FntLgxTst/*.zip > /dev/null 2> /dev/null
    cat /dev/null > /tmp/bkpfnt.tmp 2> /dev/null
    ConfArq=$?
    if [ ! $ConfArq == 0 ]
    then
            echo "Nao existem Fontes/OSs a serem Atualizados no momento!"
        read enter
    else
            rm /tmp/bkpfnt.tmp > /dev/null 2> /dev/null
            echo "Foram encontrados os seguintes arquivos para atualizacao:"
            ls -l $FntLgxTst/*.zip |more
            echo ''
            for ZipLogo in `ls -A $FntLgxTst/*.zip`
            do
                echo "Analisando o arquivo $ZipLogo..."
                OSFNT=`echo $ZipLogo | awk -F '/' {'print $5'} | awk -F '-' {'print $1'} 2> /dev/null`
                unzip -j -o  $ZipLogo -d $FntLgxTst
                echo '' >> /tmp/bkpfnt.tmp
                    for OrgLogo in `unzip -l $ZipLogo | awk -F '\' {'print $6'} | grep -v '.cnv'`  
                    do
                            VerDir=`echo $OrgLogo | awk -F '.' {'print $1'} |awk -F"[0-9]" '{print $1}' | cut -c 1-3`
                            if [ $VerDir = 'con' ]
                            then
                                    VerDir=`echo 'contab'`
                            fi
                            FixDir="$LogoTst/$VerDir"
                            ls $FixDir | grep $OrgLogo > /dev/null
                            NotVer=$?
                            if [ $NotVer == 0 ]
                            then
                                    echo "Removendo o arquivo $FixDir/$OrgLogo"
                                    rm $FixDir/$OrgLogo
                        echo "Copiando arquivo $FntLgxTst/$OrgLogo para $FixDir"
                        cp $FntLgxTst/$OrgLogo $FixDir
                        chmod 777 $FixDir/$OrgLogo
                        chown admlog.logix $FixDir/$OrgLogo
                                    ARQFNT=`echo $OrgLogo | awk -F '.' {'print $1'}`
                            else
                                    echo "Arquivo $FixDir/$OrgLogo nao encontrado!" >> /tmp/bkpfnt.tmp
                        echo "Copiando arquivo $FntLgxTst/$OrgLogo para $FixDir"
                        cp $FntLgxTst/$OrgLogo $FixDir
                        chmod 777 $FixDir/$OrgLogo
                        chown admlog.logix $FixDir/$OrgLogo
                            fi
                    done
                    rm $ZipLogo
            done
            echo ''
    fi
        echo '*** CONVERSORES ENCONTRADOS ***'
        ls -lA $FntLgxTst/*.cnv > /dev/null 2> /dev/null
        ConfCNV=$?
        if [ ! $ConfCNV == 0 ]
        then
            echo "Nao existem conversores a serem executados!"
        else      
            echo "Foram encontrados os seguintes conversores para serem executados:"
            for CNVLogo in `ls -A $FntLgxTst/*.cnv 2> /dev/null`
            do
                       echo "Movendo conversor $CNVLogo para $LogoTst/cnv"
                       mv $CNVLogo $LogoTst/cnv
            done
        fi
        rm -rf $FntLgxTst/*
        echo ''
        echo '*** FIM do scrip de backup das OSs/Fontes ***'
fi

sexta-feira, 5 de fevereiro de 2010

Declaração SQL Cache no Informix Dynamic Server

Introdução

Este artigo descreve as funcionalidades da Declaração do SQL Cache ( SQL Statement Cache SSC)) no IDS. O SSC é uma area na SHARED MEMORY que é usada para armazenar e compartilhar estrutura de dados com declarações semelhantes ao longo das sessões dos usuarios.
Abaixo os beneficios de usar os recursos do SSC:
  • Redução do consumo de memoria porque as estruturas das consultas de dados são compartilhadas entre diferentes usuarios;
  • Processamento mais rapido para a consulta porque as declarações estão presentes no cache, o Servidor de Banco de Dados pode otimizar e pular fases de analise, dando assim melhor resposta as consultas.
 Quando o recurso do SSC esta habilitado, o Servidor de BD faz o seguinte:
  1. Quando um usuario (user1) dispara uma declaração SQL, SGBD verifica o cache para ver se existe ou não uma declaração identica;
  2. Se a declaração não estiver presente no cache, então o SGBD ira analisar, otimizar e executar a declaração. O SGBD ira verificar se a declaração esta qualificada para ser inserida no cache, se tiver tudo ok então a declaração sera inserida em cache;
  3. Quando outro usuario (user2) executar a mesma declaração, o SGBD ira verificar o cache e encontrando essa declaração não ira analisar nem otimizar novamente. Ele somente executara a instrução usando as informações do cache.
Há um conjunto de condições que devem satisfazer uma declaração para que possa ser inserida em cache. Algumas delas incluem:
  1. A declaração deve ser SELECT, UPDATE, DELETE ou  INSERT;
  2. A declaração não deve conter nenhuma rotina definida por usuario;
  3. Tambem não pode conter nenhuma tabela temporaria ou remota;
  4. Não deve conter subconsultas.
Parametros de configuração do SSC

As declarações cache SQL pode ser configurada de acordo com cada aplicação utilizando um conjunto de paramentros. Estes parametros tambem são utilizados para determinarem quais declarações devem ser inseridas no cache. Abaixo faremos uma breve explicação de cada parametro:
  • STMT_CACHE_HITS - Esse parametro é utilizado para especificar o numero de vezes que a consulta pode ser executada antes que o SGBD fazer uma entrada definitiva em cache. Se o numero de vezes que a consulta é executada é inferior ao parametro, então o SGBD fara uma entrada de uma unica chave no cache para esta declaração que contera somente o texto dessa declaração. Para cada execução subsequente, o numero de acessos é incrementado. Quando o numero de vezes que a declaração é executada tornar-se igual ao valor do parametro, a entrada do cache é totalmente completa, contendo a declaração e a estrutura da consulta.
  • STMT_CACHE_SIZE - Essa variavel é usada para especificar o tamanho do cache de instrução. O valor padrão é de 512 kilobytes.
  • STMT_CACHE_NOLIMIT - Esta variavel especifica se deve ou não limitar o tamanho do cache para o valor STMT_CACHE_SIZE. Por padrão, o SGBD vai inserir a declaração, mesmo se o tamanho do cache excede o valor STMT_CACHE_SIZE.
  • STMT_CACHE_NUMPOOL - Quando o SGBD precisa carregar uma entrada completa no cache de instrução, por padrão o server alocara mais memoria em um unico pool. Quando o numero de usuario utilizando a aplicação é muito elevado, isso pode ter um efeito adverso sobre o desempenho. Nesses casos, o numero de pool pode ser configurado com um numero maior usando este parametro.
Usando o utilitario onstat para monitorar o ssc

A opção onstat -g ssc mostrara entradas no cache de instruções. A coluna hits indicara o numero de vezes que a mesma instruação foi executada. Portanto, um valor maior na coluna hits implica que o SSC tem sido utilizado de forma eficaz para compartilhar estruturas de consulta, assim melhorando a performance. A coluna hits corresponde ao parametro de configuração STMT_CACHE_HITS.
A coluna flag indica se a entrada é totalmente carregada ou não. Quando o numero de vezes que uma instrução é executada torna-se valor para a coluna hits, então uma entrada é totalmente feita no cache. Um valor "F" na coluna flag indica que a entrada esta totalmente carregada. Entradas de chave unica, onde apenas declarações testadas são inseridas no cache, são indicados por um "-" na coluna flag. 

Usando o utilitario onmode para configurar os parametros do SSC
Os parametros de configuração podem ser alterados dinamicamente, usando o utilitario onmode.

Voce pode usar a opçao onmode -W para alterar o valor dos parametros SSC conforme abaixo:
onmode -W {STMT_CACHE_NOLIMIT {0|1} | STMT_CACHE_HITS amp;lt;#hitsamp;gt;}

Voce tambem pode ativar, ligar/desligar ou limpar o SSC usando o onmode -e amp;lt;modeamp;gt; utilizando, onde amp;lt;modeamp;gt; := {ENABLE |ON|OFF|FLUSH}. 

Quando o modo SSC esta definido para ENABLE, o SSC é utilizado apenas por sessoes individuais que usam explicitamente pedido do SSC. Isso permite que aplicações que fazem poucas consultas adhoc para tirar vantagem do SSC, sem ter um grande  numeros de consultas odhoc a partir do espaço de residuos de outras aplicações ou de declarações fora do SSC. Uso de sessão SSC atraves de seu ambiente (STMT_CACHE =  1) ou executando a instrução SET STATEMENT CACHE ON.

Continua.....