r5 - 19 Jan 2009 - AndreCarneiro
Instalando o DBD::Oracle com o instant client + sdk
Problema
Instalar o DBD::OracleSolução
Instalar o instant client ao invés do client completo, configurar o ambiente e compilar o DBD::OracleDiscussã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:- O client não instala em todos os S.Os(me refiro ao client do 10g no Debian);
- O client tem aproximadamente 470MB de tamanho contra cerca de 40MB do instant client;
- O DBD::Oracle não usa absolutamente nada a mais do que está no instant client;
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:- Instant Client Package - Basic Lite: Tem o source, que vem num arquivo zip e o rpm. Se você não usa RedHat, Suse, CentOS? etc.recomendo fortemente que não tente converter o rpm para deb(se for o caso), ou para qualquer outra versão de pacote. Pare de ser preguiçoso e compile!
- Instant Client Package - SDK: Da mesma forma, tem o source e tem o rpm. Baixe o source!
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/adminEssa 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:
- ##MEUNOMEDECONEXAO## - é o nome da conexão que se usará na string de conexão(SID);
- ##IPDABASE ## - é o ip onde se encontra a base de dados(o servidor de banco de dados) Oracle;
- ##NOMEDOSERVICO## - é o nome do serviço de conexão configurado na base(Consulte o administrador de banco de dados para saber isso);
- ##MINHAPORTA## - normalmente é a porta 1521, mas você deve consultar o seu DBA para ter certeza.
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:- ORACLE_HOME: é o caminho onde você instalou o instant client(é o caminho do diretório instantclient_10_2);
- LD_LIBRARY_PATH: é o caminho para as bibliotecas do ORACLE. Nesse caso, é o mesmo caminho que está em $ORACLE_HOME;
- ORACLE_OWNER: é o usuário que tem permissão de acessar o oracle, por isso todos os usuários que quiserem acessá-lo, devem estar no mesmo grupo;
- ORACLE_SID: necessário somente se você não quiser fazer a conexão via TNS;
- NLS_LANG: define o idioma e a codificação para se conectar ao banco, por exemplo: NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1.
#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_2Esse 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 ldconfigSeo 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 lnPronto! 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:- Digite: $perl -e 'use DBD::Oracle'. Se estiver tudo ok, perl não retornará nada e isso significa que ele encontrou DBD::Oracle dentro da estrutura de bibliotecas do perl;
- Crie um script perl com o seguinte conteúdo:
#! /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
- A todos que participam da minha querida lista dos monges de são paulo(http://sao-paulo.pm.org);
- Luis Campos de Carvalho(O 'Champs'), meu amigo e mentor;
- Solli, amigo, atual líder do sao-paulo.pm e que me ajudou bastante com DBD::Oracle;

