Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos


FISL 10 - Software Livre, a tecnologia que liberta

Comunidade

r5 - 19 Jan 2009 - AndreCarneiro

Instalando o DBD::Oracle com o instant client + sdk

Problema

Instalar o DBD::Oracle

Solução

Instalar o instant client ao invés do client completo, configurar o ambiente e compilar o DBD::Oracle

Discussão

Introdução

Frequentemente vejo em listas de perl a dificuldade de muitas pessoas em instalar o DBD::Oracle, ou porque não conseguem instalar o próprio client, ou porque não conseguem configurar o seu S.O.. Como já fiz isso várias vezes, resolvi compartilhar minha experiência em instalar o DBD::Oracle utilizando um client mais enxuto do Oracle, o 'instant client' + sdk.

A seguir, descrevo como é o processo de instalação do instant client do Oracle, explicando porque é melhor instalar o instant client do que o client completo, e explico também como instalar o DBD::Oracle, mostrando quais são os requisitos de ambiente para que o DBD::Oracle seja instalado sem problemas.

OBS1: Tudo isso é basado numa instalação que eu fiz do client para o Oracle 10g release 2. Mas deve valer também para o 11g, embora eu não tenha certeza.

OBS2: Eu fiz isso(da última vez) numa máquina de arquitetura de 64 bits com o Debian como Sistema Operacional. Não incluí notas de instalação em outras distribuições ou mesmo no Windows.

Instalando o instant client e por quê

A seguir descrevo os passos a serem seguidos para instalar o instant client. Mas antes acho importante ressaltar o porque de instalar o instant client ao invés do client completo do Oracle, e há vários motivos para isso:

Mas o que é esse 'instant client'?

O instant client é um conjunto de bibliotecas fornecidas pela Oracle para que os compiladores/interpretadores, como Perl, PHP, C/C++, Python, Ruby, JAVA dentre outros, possam se conectar a uma base de dados Oracle, e acessar recursos disponíveis nessa base de dados. O client completo inclui o instant client mais um conjunto enorme de ferramentas que não são necessárias para o DBD::Oracle, como por exemplo o enterprise manager.

Baixando o instant client

O instant client pode ser baixado do seguinte endereço: http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxx86_64soft.html

Repare que esta é uma instalação para computadores com arquitetura de 64bits, então cuidado para não instalar a versão incorreta! Veja aqui as outras arquiteturas disponiveis

Escolha a arquitetura apropriada, assim como a versão correta do cliente Oracle, no meu caso foi a versão 10.0.2.3. Certifiquem-se de que é a versão correta.

É necessário instalar instalar também os headers adicionais, pois o DBD::Oracle vai precisar quando for compilar, este é o SDK.

Os nomes dos links(pelo menos da última vez), que você deve clicar para baixar o instant client e o SDK são:

Preparando o ambiente

Nesse exemplo, precisava-se do cliente funcionando para um usuário específico, que era o mesmo usuário da aplicação. Então resolvi instalar com o usuário da aplicação, dentro do home desse usuário, para evitar problemas de permissão. Como só esse usuário vai utilizar o client, não há problemas. No entanto, se a sua aplicação é executada por mais de um usuário, é melhor criar um usuário oracle, instalar o client dentro do home desse usuário, e incluir os usuários que vão utilizar o client no grupo do usuário oracle( E acertar as permissões, obviamente).

Uma vez escolhido o local onde o client será instalado, descompacte os arquivos do instant client e do SDK. Eles já gravarão os dados na mesma estrutura de diretórios(desde que sejam descompactados no mesmo diretório). O resultado será a seguinte estrutura de diretórios:

Dentro do diretório instantclient_10_2, crie a seguinte estrutura de diretórios:

$mkdir network/admin

Essa estrutura de diretório é necessária porque o DBD::Oracle vai perguntar qual é o caminho do arquivo TNS. Esse arquivo diz ao Oracle onde ele deve se conectar(podem ser vários locais), e resume tudo a um único nome, e isso ajuda na hora de definir a string de conexão, porque você não precisa passar host, sid e esse tipo de coisa, basta passar o TNS, o usuário e a senha.

Sobre a estrutura de diretórios, eu só escolhi essa estrutura, porque é a estrutura padrão do Oracle, mas poderia ter colocado em outro lugar. Porém, independentemente disso, é bom lembrar que o nome do arquivo tns deve ser 'tnsnames.ora', e esse arquivo deve conter a seguinte estrutura:

##MEUNOMEDECONEXAO##= 
   (DESCRIPTION = 
       (ADDRESS_LIST = 
          (ADDRESS = (PROTOCOL = TCP)(HOST = ##IPDABASE##)(PORT =##MINHAPORTA##)) 
       ) 
       (CONNECT_DATA = 
          (SERVER = DEDICATED) 
          (SERVICE_NAME = ##NOMEDOSERVICO##) 
       ) 
   ) 

Você deve se preocupar com três coisas aqui:

Essa estrutura pode se repetir para definir vários locais de base de dados para se conectar. Se você tem uma base de testes, uma de homologação e uma e produção, por exemplo, é claro q vc vai ter que definir três estruturas iguais a essa(e mudar os parâmetros, que fique claro).

Salve esse arquivo em network/admin.

Acerte as permissões de diretórios e arquivos com os comandos chmod e chown(A não ser que esteja no Windows). Deixe todos os diretórios e arquivos abaixo do diretório instantclient_10_2(inclusive), com permissão para ler, e executar para o dono e para o grupo. E permissão de leitura para os outros.

Configurando variáveis de ambiente

A instalação do DBD::Oracle vai procurar por uma série de caminhos para bibliotecas que devem ser configuradas em variáveis de ambiente específicas. São elas:

Para definir as variáveis de ambiente de forma definitiva, salve as definições das variáveis dentro de /etc/profiles, usando o comando export. Exemplo abaixo:

 #Variáveis de ambiente do Oracle:
 ORACLE_HOME=/home/USUARIO/instantclient_10_2 
 export ORACLE_HOME 
 ... 
 

Se você tem um usuário que acessa o Oracle apenas, pode definir no arquivo /home/USUARIO/.bashrc.

Reinicie a máquina ou carregue a sequência de inicialização com o init.

Incluindo as bibliotecas do oracle no ld.conf

Vá ao diretório /etc/ld.so.conf.d/

Agora crie um arquivo chamado 'oracle.conf'. Dentro dele inclua o caminho para as bibliotecas do Oracle. Para esse exemplo, ficaria assim:

 /home/USUARIO/instantclient_10_2 

Esse arquivo faz com que o sistema operacional inclua esse caminho na sua lista de caminhos para bibliotecas. Isso evita problemas com caminhos de libs que não poderiam não serem encontradas. Carregue o ld.so.conf, digitando:

 sudo ldconfig

Seo sistema 'reclamar' que alguma biblioteca não é um link simbólico, então crie um link simbólico, usando o comando 'ln -s'. Para mais detalhes desse comando, verifique o manual digitando:

 man ln 

Pronto! Agora só falta instalar o DBD::Oracle. Para isso digite :

$sudo perl -MCPAN
-e 'install DBD::Oracle'

A instalação tentará encontrar o seu ORACLE_HOME. Como você instalou como sudo, é uma boa idéia que isto esteja configurado em /etc/profile ao invés do .bashrc do usuário, caso contrário, você terá que exportar as variáveis de ambiente para o usuário 'root'(lembrando que sudo faz você executar um comando como usuário root), antes de instalar o DBD::Oracle.

O instalador pedirá o caminho do TNS. Passe o caminho, confirme o que estiver correto, e espere terminar a compilação. Se estiver tudo de acordo, não dará erro algum.

Testes

Se tudo estiver 'OK', faça dois testes:

      #! /usr/bin/perl -w
      use strict;
      use DBI; 
      my $dbh = DBI->connect("DBI:Oracle:MEUNOMEDECONEXAO", USUARIO,SENHA, {AutoCommit => 0,PrintError => 1, RaiseError => 0})|| die "Impossivel conectar ao oracle...\n" . $DBI->errstr;
      my $sql = 'SELECT *
      from TABELADASUABASE';
      my $sth = undef;    
      eval{   $sth = $dbh->prepare($sql);
            $sth->execute;
      };
      if($@ || $DBI->errstr){
         print "\nErro ao executar a query '$sql' ".$DBI->errstr."\n";
      }
      else{
         while(my $res = $sth->fetchrow_hashref){
            #imprima os seus dados aqui. Algo do tipo print $res->{campo};
         }
      }   
Salve, e execute o script. Se correr algum erro, o script vai mostrar a você, caso contrário mostrará o o resultado da sua query, e isso significa que a instalação foi bem-sucedida.

Agradecimentos

Dúvidas/Sugestões

Envie para André Garcia Carneiro andregarciacarneiro@gmail.com

Licença

Este é um documento totalmente livre, sob a licença 'Artistic License'. E isso significa que você pode alterá-lo e publicá-lo onde quiser sobre os termos da licença.

Comentários