[firebase-br] Replicar Dados

Sandro Souza escovadordebits em gmail.com
Sex Dez 5 11:00:31 -03 2014


Bom dia/tarde/noite Gilson.

Na empresa em que trabalho, tive que desenvolver dois níveis de 
sincronização.

No primeiro nível, uma aplicação, atualmente em Delphi 7, acessa uma 
base de dados em Oracle 10g (em CentOS Linux) e outra em Firebird 2.5.3 
(em outra máquina com CentOS Linux 5.4). Esse primeiro nível de 
sincronização é apenas dentro da própria rede da unidade matriz da 
empresa (em Teresina/PI).

Nas outras unidades da empresa (como aqui em Recife/PE), existe um 
segundo nível de sincronização, em que uma aplicação que fiz em Lazarus 
acessa a base de dados em Firebird 2.5.3 (em CentOS Linux 5.4) da 
unidade matriz (via link dedicado) e outra base de dados local em 
Firebird 2.5.3 (em Ubuntu Linux 12.04).

A lógica que eu uso nas bases de dados das unidades filiais, 
basicamente, é a seguinte:

Criei uma tabela onde registro cada exclusão de registro, salvando o 
nome da tabela e a condição de pesquisa do registro (apenas com os 
campos da chave primária com os seus respectivos valores).

Cada registro de cada tabela que está sendo sincronizada (não estou 
sincronizando todas as tabelas da base Oracle), possuem uma coluna/campo 
do tipo "CHAR(1) DEFAULT 'S' NOT NULL" que eu uso como "flag de 
alteração", ou seja, se o valor dessa coluna for "S", significa que esse 
registro acabou de ser inserido ou foi modificado e precisa ser 
sincronizado com as outras bases de dados.

O sincronizador das unidades, em Lazarus, lê um arquivo de configuração 
(um arquivo *.ini comum) contendo a relação das tabelas a serem 
sincronizadas, os campos que serão sincronizados (não preciso de todos) 
e quais campos formam a chave primária.

Dentro do sincronizador, eu crio uma thread para sincronizar cada 
tabela, e no método principal de execução da thread de sincronização, 
tenho um laço principal que fica executando continuamente a sincronização.

A primeira etapa é ler os registros de exclusão de uma base e aplicar na 
outra base (executar a mesma exclusão na outra base), excluindo o 
registro de exclusão posteriormente. Depois fazer o mesmo da segunda 
base para a primeira, e para priorizar a segunda etapa da sincronização, 
eu limito a quantidade de registros a serem excluídos (FIRST 10), só 
para não gastar muito tempo nessa etapa e priorizar a segunda que é 
muito mais importante.

A segunda etapa consiste em ler todos os registros (limito de 1000 em 
1000) que estão marcados para sincronização (com a flag de alteração com 
o valor 'S') e inserir (insert) ou atualizar (update) o mesmo registro 
na outra base. Depois faço o mesmo processo invertendo as bases.

A questão de limitar a quantidade de registros é apenas para ajustar o 
"tamanho" das transações.

Só tem que ter o cuidado de colocar (caso não haja) uma coluna que 
indique para que unidade deve ir aquele determinado registro, e mesmo 
assim, apenas em tabelas em que isso seja necessário, pois existem 
tabelas globais que todas as unidades devem ter.

Expliquei bem superficialm

On 05-12-2014 06:58, Gilson wrote:
>
> Bom Dia meus amigos,
>
> Eu preciso de replicar um banco de dados local para a WEB e faço isso 
> com o IBexpert,
> Gostaria de saber se tem como eu criar alguma Trigger que faça isso 
> automaticamente ?
>
> Grato
>
>
> Gilson Moreira dos Santos
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: 
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista