Instalando e Implementando DBI-LINK no PostgreSQL

Existem ocasiões onde temos 2 servidores distintos e precisamos de um merge dessas informações, como obter o retorno de um select se tenho dados em 2 servidores separados ???????

Seus problemas acabaram!!!! … Nesse caso temos 2 soluções DBLINK e DBI-LINK, sendo que se os 2 servidores forem postgres, use dblink mas se um for postgres e outro for Oracle, Mysql ou seja la qual banco … usamos o dbi-link.

Vendo o site da pgcon 2008 Internacional achei uma palestra muito bacana do David Fetter sobre o DBI-LINK 3.0 resolvi testar esse bicho … e querem saber ??? é muito bacana !!!!!!.

Antes de começar só vamoslembrar que quando usamos esse tipo de recurso temos que levar em conta que ficamos “refens” da rede, seja interna ou externa, uma vez que as informações estão em servidores distintos

Instalando o postgres

Baixando pacotes

# aptitude install ssh
# aptitude install gcc
# aptitude install make
# aptitude install libreadline-dev
# aptitude install zlib1gdev
# aptitude install zlibc
# aptitude install zlib1g-dev
# aptitude install libio-zlib-perl
# aptitude install perl
# aptitude install libyaml-perl
# aptitude install libconfig-yaml-perl
# aptitude install libyaml-syck-perl
# aptitude install libtest-yaml-meta-perl
# aptitude install libtest-yaml-valid-perl

Compilando
$ tar -xvzf postgresql-8.3.1.tar.gz

$ mv postgresql-8.3.1 postgresql-8.3
$ cd postgresql-8.3
$ cd src/include/
$ vi pg_config_manual.h

#define BLCKSZ 8192 — Usado em BI por isso o bloco de gravação é maior
#define BLCKSZ 4096 —
Usado em Transacionais por isso o bloco de gravação é menor

$ cd ../../
$ ./configure –prefix=/home/postgres/postgresql-8.3 –with-python –with-perl
$ make $$ make install

Criando o cluster

O diretório pg83 deve ser criado para alocar o novo cluster

$ mkdir -p /postgres/pg83/dados/
$ /home/postgres/postgresql-8.3/bin/initdb -D /postgres/pg83/dados/ –encoding=latin1

Subindo o banco

$ cd /postgres/pg83/dados/
$ /home/postgres/postgresql-8.3/bin/pg_ctl -D . start

Baixando os pacotes para para DBI-LINK

Para esse procedimento são necessários 2 pacotes: DBI-LINK e o DBD-Pg

Instalando os pacotes

Esse recurso para ser instalado necessita de alguns pré requisitos, ou seja, alguns pacotes instalados:

DBI-LINK

build, test, and install Perl 5 (at least 5.6.1)

BDB-PG

build, test, and install Perl 5 (at least 5.6.1)
build, test, and install the DBI module (at least 1.52)

build, test, and install PostgreSQL (at least 7.4)
build, test, and install Test::Simple (at least 0.47)

Descompacte os pacotes e execute o Makefile.pl para que a instalação seja feita:

$ tar – xvjf dbi-link-2.0.0.tar.bz2
$ cd dbi-link-2.0.0
$ perl Makefile.PL
Writing Makefile for dbi-link

$ tar -xvzf DBD-Pg-2.7.2.tar.gz

O Makefile padrão usa algumas variáveis que devem ser definidas antes da instalação:
POSTGRES_HOME
– Instalação do PostgreSQL
POSTGRES_LIB
– bilbiotecas do PostgreSQL
POSTGRES_INCLUDE
– Diretório de include do PostgreSQL

Para fazer o export das variáveis:

$ export POSTGRES_LIB=”/home/postgres/postgresql-8.3/lib/”
$ export POSTGRES_HOME=”/home/postgres/postgresql-8.3/”
$ export POSTGRES_INCLUDE=”/home/postgres/postgresql-8.3/include/”

Os primeiros passos da instalação devem ser feitos com o usuário comum postgres:

$ cd DBD-Pg-2.7.2
$ perl Makefile.PL
Configuring DBD::Pg 2.7.2
PostgreSQL version: 80301 (default port: 5432)
POSTGRES_HOME: /home/postgres/postgresql-8.3/
POSTGRES_INCLUDE: /home/postgres/postgresql-8.3/include/
POSTGRES_LIB: /home/postgres/postgresql-8.3/lib/
OS: linux
Checking if your kit is complete…
Looks good
Using DBI 1.604 (for perl 5.010000 on i486-linux-gnu-thread-multi) installed in /usr/lib/perl5/auto/DBI/
Writing Makefile for DBD::Pg

$ make

O make install criará alguns diretórios em locais de sistema que não é permitido a usuário comum, sendo assim execute-o com o usuário root

# make install

Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl/5.10.0/auto/DBD/Pg/Pg.so
Installing /usr/local/lib/perl/5.10.0/auto/DBD/Pg/Pg.bs
Installing /usr/local/lib/perl/5.10.0/Bundle/DBD/Pg.pm
Installing /usr/local/lib/perl/5.10.0/DBD/Pg.pm
Installing /usr/local/man/man3/Bundle::DBD::Pg.3pm
Installing /usr/local/man/man3/DBD::Pg.3pmWriting /usr/local/lib/perl/5.10.0/auto/DBD/Pg/.packlist
Appending installation info to /usr/local/lib/perl/5.10.0/perllocal.pod

Adicionando um DBI-LINK

Antes de tudo é necessário criar a linguagem plperl no banco em questão, pois o dbi-link foi desenvolvido em PL/PERL.

$ createlang plperlu portgres

Agora rode o script que criará toda estrutura dbi-link

$ psql -p 5432 < /home/postgres/dbi-link-2.0.0/dbi_link.sql

Note que no banco foi criado o schema dbi_link, com 3 tabela, 26 funções e 1 trigger

Adicionando uma conexão Remota

MYSQL

Criando nova conexão

SELECT dbi_link.make_accessor_functions(
‘dbi:mysql:database=teste;host=localhost’,Driver:banco:host
‘root’, — usuário
”, — senha
‘— AutoCommit: 1 RaiseError: 1 ‘,
— atributos do banco remoto
NULL,
— ambiente de conexão
NULL,
— schema remoto
NULL
, — catalogo remoto
‘teste’
— schema local

Usando a conexão

SELECT * FROM teste.tabela;

Transferindo dados de um banco para outro

É possivel transferir dados direto de um banco para outro, porém com algumas restrições (que serão resolvidas futuramente, segundo o desenvolvedor). Todos os dados retornados do banco externo são formato text, sendo assim ou a tabela destino tem os campos text ou trate as informações antes de fazer a inserção.

CREATE SCHEMA testepg
AUTHORIZATION postgres;
GRANT ALL ON SCHEMA testepg TO postgres;

CREATE TABLE testepg.tabela
(
campo1 character varying,
campo2 character varying,
campo3 character varying,
campo4 date,
campo5 character varying,
campo6 text
CONSTRAINT tabela_pk PRIMARY KEY (campo1)
)
WITH (OIDS=FALSE);
ALTER TABLE testepg.tabela OWNER TO postgres;

INSERT INTO testepg.tabela
(SELECT campo1:: character varying,
campo1:: character varying,
campo2:: character varying,
campo3:: date,
campo4:: character varying,
campo5:: text
FROM teste.tabela
WHERE campo1 = ‘XXX’);

Bom .. por hoje é só pessoal !!!!!!
PS: vou fazer mais algumas brincadeiras com o DBI-LINK e posto aqui.
PS2: Conversei com o David e vou traduzir o pacote dele !!!

Kenia Milene