Logo

Firebird SQL

Replicação Assíncrona: Porque nem tudo precisa ser pra ontem.

Definindo nosso Ambiente

Para este guia, vamos assumir o seguinte cenário de "campo de batalha":

NOTA IMPORTANTE: Não se prenda ao Sistema Operacional! A lógica de replicação do Firebird é agnóstica. O que funciona no Windows funciona no Linux e vice-versa. A única coisa que muda de verdade é onde os arquivos moram (o caminho das pastas) e o nome dos serviços. De resto, é tudo igual!

O QUE É (E porque você deveria se importar)

Imagine que você tem um banco de dados e quer um "dublê" dele em outro servidor. A replicação assíncrona é exatamente isso: o servidor principal (Publicador) anota tudo o que aconteceu e, de tempos em tempos, manda essas notas para o servidor secundário (Leitor) aplicar. É como se o Publicador enviasse cartas e o Leitor as lesse para atualizar o seu próprio diário.

A vantagem? Se o servidor principal explodir (metaforicamente, esperamos), você tem um reserva quase idêntico. A desvantagem? "Quase" porque, como é assíncrono, pode haver um pequeno atraso (delay). Nada é perfeito, nem mesmo o café.

REGRAS DE OURO (Ou você vai chorar depois):
  • Versões iguais: Não tente replicar do Firebird 4.0 para o 5.0. É como tentar rodar fita VHS num PlayStation 5. Mantenha os servidores na mesma versão (ou muito próximas).
  • Chaves Primárias: Sem PK, sem replicação. O Firebird precisa saber exatamente *qual* registro mudar. Sem identidade, ele se perde.

Lado PUBLICADOR: O Chefe que anota tudo

Preparação Recomendada:

No Windows, crie um usuário local chamado firebird. Ele será nosso "operário padrão" para permissões de arquivos e acessos de rede. Não precisa de privilégios de administrador, apenas uma senha forte.

1. Momento de Preparação (Parando o Serviço)

Antes de mexermos nas configurações internas do Firebird, precisamos garantir que o motor esteja desligado. No Windows, abra o Prompt de Comando (CMD) como Administrador e execute:

net stop FirebirdServerDefaultInstance

Ou, se preferir o caminho visual, abra o services.msc (Serviços), localize o Firebird Server e mande-o parar por lá.

DICA: Se você estiver usando uma instância nomeada, troque FirebirdServerDefaultInstance pelo nome da sua instância.

2. Configurando o Replicador (replication.conf)

Vá até c:\fb5\replication.conf. Procure por "(for the primary side)". No final dele, vamos dizer onde ele deve guardar as anotações (o "Journal"). Abra o arquivo com um editor de texto o arquivo c:\fb5\replication.conf e então acrescente ao seu final o que deve ser replicado, a saber:

#
# Minha replicação - O DIÁRIO DO CHEFE
#
database = c:\fdb\acme.fdb
{
  # Pasta onde os rascunhos são criados (Journal)
  journal_directory = c:\fdb-repl\journal\acme
  
  # Pasta onde as notas prontas são arquivadas para o Leitor buscar
  journal_archive_directory = c:\fdb-repl\archive\acme 
  
  # Tempo para fechar a nota e mandar pro arquivo (60=1m; 900=15m; 1800=30m; 3600=60m)
  journal_archive_timeout = 60  # em segundos (60=1m; 900=15m; 1800=30m; 3600=60m)
  verbose_logging = true 
}

database = c:\fdb\correios.fdb
{
  journal_directory = c:\fdb-repl\journal\correios
  journal_archive_directory = c:\fdb-repl\archive\correios
  journal_archive_timeout = 60  # em segundos (60=1m; 900=15m; 1800=30m; 3600=60m)
  verbose_logging = false 
}
Entendendo os Parâmetros:
  • database: Caminho físico completo do banco de dados no servidor Publicador.
  • journal_directory: O "rascunho" em tempo real. É aqui que o Firebird anota cada INSERT, UPDATE e DELETE no momento em que acontecem.
  • journal_archive_directory: O "centro de expedição". Quando o rascunho é fechado, ele vem para cá para ser coletado pela réplica.
  • journal_archive_timeout: O tempo máximo (em segundos) que o Firebird espera antes de fechar o "rascunho" atual e enviá-lo para a expedição.
    Entenda o ciclo: Para não sobrecarregar o sistema criando centenas de pequenos arquivos por segundo, o Firebird acumula as mudanças na pasta journal. Quando este tempo acaba, ele "lacra o pacote", move o arquivo para a pasta archive e limpa o rascunho para começar um novo. É na pasta archive que o servidor Leitor buscará as novidades para aplicar na réplica.
  • verbose_logging: Se true, o Firebird detalha cada passo da replicação no arquivo firebird.log. Útil para debug.

Supondo que seu banco de dados esteja em c:\fdb, vamos criar uma nova pasta centralizadora de nossas replicações. Vamos chamá-la de C:\fdb-repl.

DICA DE ARQUITETURA: Por que usar C:\fdb-repl e não uma subpasta dentro de C:\fdb?
  • Isolamento de Permissões: Fica muito mais fácil (e seguro) dar permissões de rede apenas para a pasta de logs, sem correr o risco de expor seus arquivos .fdb originais.
  • Performance: Em servidores de alta carga, você pode colocar essa pasta num disco físico diferente, evitando a competição por I/O entre os arquivos de dados e os arquivos de logs.
  • Organização: Facilita backups, monitoramento de cotas de disco e limpezas periódicas sem misturar "arquivos vivos" com "logs temporários".

3. Segurança Máxima (Permissões e Herança)

Tanto para a pasta dos seus bancos (c:\fdb) quanto para a de replicação (c:\fdb-repl), precisamos de uma configuração profissional para evitar bisbilhoteiros:

Clique com o botão direito na pasta, depois em Propriedades, depois em Segurança, depois em Avançadas. Clique em Desabilitar Herança e escolha "Remover todas as permissões herdadas deste objeto". Agora adicione apenas estes usuários com Controle Total:

Lembre-se: Sem o motor do Firebird (LocalSystem/firebird) ter acesso total aqui, nada funcionará.

Configuração de Permissões no Windows

Nota para Linux: No pinguim basta garantir que as pastas tenham o usuário firebird:firebird como dono. Ex:

sudo chown -R firebird:firebird /var/fdb-repl
sudo chmod 770 /var/fdb-repl
sudo chown -R firebird:firebird /var/fdb
sudo chmod 770 /var/fdb

4. Estrutura Física das Pastas

Dentro dessa pasta fdb-repl, o Firebird precisa de duas pastas para trabalhar:

No final, sua estrutura física de pastas deve ficar exatamente assim:

# Estrutura completa para nossos dois bancos de exemplo:
c:\fdb-repl\journal\acme
c:\fdb-repl\journal\correios
c:\fdb-repl\archive\acme
c:\fdb-repl\archive\correios

5. Compartilhando as pastas fdb-repl e fdb

As pastas c:\fdb-repl e c:\fdb precisam ser visíveis para o Linux para que a ponte funcione. Vamos criar um compartilhamento seguro para ambas as pastas:

Vamos começar com a pasta c:\fdb-repl, precisamos fazer com que o Linux enxergue-a. Vamos compartilhá-la pela rede com o nome fdb-repl. Usando o Explorer do Windows, clique com o botão direito na pasta c:\fdb-repl, depois:

Configuração de Compartilhamento no Windows

Repita o processo para a pasta c:\fdb, criando o compartilhamento fdb e compartilhe com as mesmas pessoas do compartilhamento anterior. Utilizaremos esse compartilhamento mais adiante.

Lado LEITOR: O Nó de Réplica

Aqui o servidor vai apenas "ouvir" e aplicar o que vier do Publicador. Vamos supor que seja um Linux, porque é mais elegante (e provável).

1. Momento de Preparação (Parando o Serviço)

Antes de configurar o Leitor, precisamos garantir que o motor esteja desligado para que possamos mexer nas engrenagens com segurança. No Linux, pare o serviço do Firebird:

sudo systemctl stop firebird

2. Criando o quartinho das notas (Landing Zone)

O servidor Leitor precisa de um diretório físico para receber os arquivos de journal vindos do Publicador. Vamos criar a estrutura em /var/fdb-repl. Esta será a nossa "zona de pouso" (Landing Zone):

sudo mkdir -p /var/fdb-repl

# Garanta que o Firebird consiga ler e escrever aqui:
sudo chown -vR firebird:firebird /var/fdb-repl
sudo chmod -vR 770 /var/fdb-repl

Por que? Porque o Firebird Leitor vai ficar "vigiando" estas pastas. Nós iremos montá-la ligando-a à c:\fdb-repl que criamos no servidor Windows. Assim que o lado PUBLICADOR criar um arquivo dentro de c:\fdb-repl\archive\<nome_do_banco>, ele aparecerá aqui e o Firebird Leitor o processa imediatamente. Se ele não tiver permissão para ler ou apagar o arquivo depois de processado, a replicação vai engasgar, e foi por isso que criamos no servidor Windows o usuário firebird e demos permissão total a ele, porque usaremos este usuário para montar o compartilhamento no Linux.

3. A Ponte entre Mundos (Ligação com o Windows)

Para que a mágica aconteça, o Linux precisa "enxergar" a pasta de arquivos do Windows como se fosse uma pasta local. Vamos construir uma ponte transparente usando o protocolo SMB (Samba/CIFS). Primeiro, vamos criar um arquivo de credenciais escondido para que sua senha não fique exposta no histórico de comandos:

# Crie o arquivo de credenciais
sudo nano /etc/cifs-credentials.agente_firebird
# Cole dentro dele e informe as credenciais usadas pelo usuário firebird no Windows:
username=firebird
password=sua_senha_forte_aqui
domain=

Salve e saia (Ctrl+O, Enter, Ctrl+X)

Dê permissão apenas para o root ler (segurança):

sudo chmod 600 /etc/cifs-credentials.agente_firebird

Antes de montar a pasta, precisamos nos certificar de que temos as ferramentas necessárias:

sudo apt-get install cifs-utils

Agora, vamos inaugurar a nossa ponte (montar a pasta):

# Monte a pasta (usando vers=2.0 que é mais seguro/rápido)
sudo mount -t cifs //IP_DO_WINDOWS/fdb-repl /var/fdb-repl -o credentials=/etc/cifs-credentials.agente_firebird,iocharset=utf8,vers=2.0,uid=firebird,gid=firebird,file_mode=0660,dir_mode=0770

Verifique se a ponte está firme, execute:

ls -l /var/fdb-repl

Se vir as pastas archive e journal, parabéns: o Linux agora tem um pé dentro do Windows! Se der erro, verifique o IP e as permissões que demos ao usuário firebird no Windows.

Se deu certo, vamos desmontar a pasta, execute:

sudo umount /var/fdb-repl

Visto que essa ponte deve ser permanente e precisa sobreviver a reboots, vamos registrá-lo no arquivo /etc/fstab:

sudo nano /etc/fstab

Vá até o final do arquivo e adicione a seguinte linha:

# Montando o compartilhamento //IP_DO_WINDOWS/fdb-repl em /var/fdb-repl
//IP_DO_WINDOWS/fdb-repl /var/fdb-repl cifs credentials=/etc/cifs-credentials.agente_firebird,iocharset=utf8,vers=2.0,uid=firebird,gid=firebird,file_mode=0660,dir_mode=0770 0 0

Salve e saia (Ctrl+O, Enter, Ctrl+X).

Mudanças no fstab só têm efeito após reiniciar o servidor. Para evitar este reinício, execute os comandos abaixo:
Note: recarregar o sistema de controle do linux garantirá que o novo ponto de montagem seja reconhecido.

systemctl daemon-reload

E finalmente, podemos testar montando nossa ponte

sudo mount -a

Agora, poderá repetir o teste

ls -l /var/fdb-repl

Se na listagem de arquivos aparecerem as pastas archive e journal, sua "ponte" agora é indestrutível e resistirá a reinicializações!

4. O Diário de Erros (Importante!)

Se algo der errado, você vai querer saber. Crie o log:

sudo mv /opt/firebird/replication.log /opt/firebird/replication.log.$(date +%Y%m%d_%H%M%S)
sudo touch /opt/firebird/replication.log
sudo chown firebird:firebird /opt/firebird/replication.log

5. Automatizando a Autenticação

Para que o motor de replicação consiga "conversar" com os bancos de dados sem interrupções e sem pedir senha a todo momento, utilizaremos um recurso do Linux chamado variáveis de ambiente globais. Ao configurar o SYSDBA no arquivo /etc/environment, o serviço do Firebird ganha um "passe livre" para ler e aplicar os logs de forma automática, silenciosa e totalmente transparente. Execute

sudo nano /etc/environment

Adicione as seguintes linhas ao arquivo:

ISC_USER=SYSDBA
ISC_PASSWORD=masterkey
FIREBIRD_MSG=/opt/firebird

Onde masterkey é a senha do usuário SYSDBA do Firebird no lado LEITOR.

Salve e saia (Ctrl+O, Enter, Ctrl+X). Para efetivar estas instruções sem reiniciar o servidor, execute:

source /etc/environment

6. A Primeira Cópia

Chegou a hora do transplante. Mas antes de prosseguir, o serviço do Firebird deve estar desligado tanto no Publicador quanto no Leitor.

No Publicador (Windows), execute no terminal:

net stop FirebirdServerDefaultInstance

Dica: Você também pode fazer isso visualmente pelo services.msc.

No Leitor (Linux), execute no terminal:

sudo systemctl stop firebird

Agora, podemos realizar a cópia dos bancos porque é imperativo que ambos os lados comecem a vida exatamente IGUAIS.

Vamos montar a unidade de rede do Windows no Linux para facilitar o processo:

sudo mkdir -p /mnt/publicador

Depois montamos essa pasta com a nossa credencial apontando para o servidor PUBLICADOR Windows:

sudo mount -t cifs //IP_DO_WINDOWS/C$/fdb /mnt/publicador -o credentials=/etc/cifs-credentials.agente_firebird,iocharset=utf8,vers=2.0,uid=firebird,gid=firebird,file_mode=0660,dir_mode=0770

Onde C$ corresponde ao drive C:\ do Windows (unidade administrativa oculta). Agora, certifique-se de que a montagem foi realizada com sucesso:

ls -l /mnt/publicador

Então, tendo listado os arquivos, copie para o lado LEITOR, os bancos que estão no lado PUBLICADOR:

cp /mnt/publicador/acme.fdb /var/fdb/acme.fdb
cp /mnt/publicador/correios.fdb /var/fdb/correios.fdb

Depois disso, podemos desmontar a pasta, execute:

sudo umount /mnt/publicador

Agora que temos os bancos exatamente iguais tanto o lado PUBLICADOR quanto o LEITOR, ajuste a posse dos arquivos no Linux:

sudo chown -vR firebird:firebird /var/fdb

Agora, vamos configurar o Leitor (replication.conf no Linux). Execute:

sudo nano /opt/firebird/replication.conf

Em /opt/firebird/replication.conf, adicione um bloco para cada banco:

database = /var/fdb/acme.fdb
{
  # Onde o Leitor deve buscar as "notas" (arquivos de journal) que o Publicador enviou
  journal_source_directory = /var/fdb-repl/archive/acme  
  
  # Ativa o log detalhado em replication.log. Ótimo para saber o que está acontecendo por baixo do capô.
  verbose_logging = true
  
  # Tempo (em segundos) que o Leitor descansa quando não há notas novas para processar
  apply_idle_timeout = 60  
  
  # Tempo (em segundos) de espera antes de tentar novamente após um erro de processamento
  apply_error_timeout = 60
}

database = /var/fdb/correios.fdb
{
  # Landing Zone para the segundo banco
  journal_source_directory = /var/fdb-repl/archive/correios
  verbose_logging = true
  
  # Intervalo de verificação quando ocioso
  apply_idle_timeout = 60  
  
  # Intervalo de recuperação após erros
  apply_error_timeout = 60
}
SOBRE O apply_idle_timeout:

Utilizamos apply_idle_timeout = 60 (1 minuto) para fins de teste, permitindo que acompanhemos a replicação quase em tempo real. No entanto, em um ambiente de produção, você pode ajustar esse tempo conforme a necessidade de atualização da sua réplica e a carga do servidor:

  • 5 minutos: 300 segundos
  • 10 minutos: 600 segundos
  • 15 minutos: 900 segundos
  • 30 minutos: 1800 segundos

Ou qualquer outro tempo em segundos que você preferir.


Dica de Segurança: Protegendo a Integridade (Read Only)

Uma réplica, por definição, não deve ser alterada manualmente — senão ela perde a sincronia com o Publicador. Para evitar acidentes, o Firebird exige que arquivos de banco de dados estejam em modo replica read_only, caso contrário ele rejeitará a replicação e os bancos copiados serão bases regulares como qualquer outro banco e não uma replica de outra base.

Use o utilitário gfix para alterar o cabeçalho do banco de dados, primeiro o banco /var/fdb/acme.fdb:

sudo /opt/firebird/bin/gfix -replica read_only /var/fdb/acme.fdb

Depois o banco /var/fdb/correios.fdb:

sudo /opt/firebird/bin/gfix -replica read_only /var/fdb/correios.fdb

A HORA DA VERDADE: Ativando a Replicação

Agora que o palco está montado, os atores estão em seus lugares e o ponto de transporte (CIFS) está operante, chegou a hora de apertar o botão "ON".

1. Acordando o PUBLICADOR

Como paramos tudo para a cópia inicial, a primeira coisa é religar os motores do PUBLICADOR (Windows), execute no CMD:

net start FirebirdServerDefaultInstance

Ou use o services.msc para fazê-lo visualmente.

2. Habilitando os bancos

Use uma ferramenta de acesso SQL (como IbExpert, FlameRobin ou isql) apenas no servidor Publicador. Conecte-se a cada um dos seus bancos de dados individualmente e execute estes comandos para despertar a replicação:

-- Execute no acme.fdb
ALTER DATABASE ENABLE PUBLICATION;

-- Execute no correios.fdb
ALTER DATABASE ENABLE PUBLICATION;

3. Escolhendo o que será replicado

Este é o "pulo do gato": o comando de ENABLE PUBLICATION que rodamos no passo anterior apenas liga o motor de replicação, mas ele ainda não sabe o que deve observar. É como ligar uma câmera sem apontar para lugar nenhum. Você precisa dizer explicitamente quais tabelas devem ser monitoradas:

Todas as tabelas:

ALTER DATABASE INCLUDE ALL TO PUBLICATION;

E depois remover tabelas indesejadas na replicação:

ALTER DATABASE EXCLUDE TABLE PLG$PROF_SESSIONS, PLG$PROF_STATEMENTS, PLG$PROF_CURSORS, PLG$PROF_RECORD_SOURCES, PLG$PROF_REQUESTS, PLG$PROF_PSQL_STATS, PLG$PROF_RECORD_SOURCE_STATS FROM PUBLICATION;

Outra alternativa é selecionar apenas as tabelas essenciais (Seletivo):

ALTER DATABASE INCLUDE TABLE CLIENTES, VENDAS TO PUBLICATION;
COMO CONFERIR? Para ter certeza de quais tabelas o Firebird aceitou na "lista de transmissão", execute este comando no banco do Publicador:
SELECT RDB$TABLE_NAME FROM RDB$PUBLICATION_TABLES;

4. Acordando o LEITOR

Agora é a vez do LEITOR (Linux). Certifique-se de que o motor dele também esteja rodando para que ele possa começar a processar os arquivos que o Publicador vai enviar:

sudo systemctl start firebird

5. O Teste de DNA (Verificação)

Como saber se a "mágica" realmente aconteceu? Vamos criar um rastro deliberado no lado do Publicador. Via qualquer programa de acesso a banco de dados, como FlameRobin ou IBExpert, execute:

CREATE TABLE TESTE_REPLICA (ID INT PRIMARY KEY);
COMMIT;

Este comando cria uma tabela chamada TESTE_REPLICA com uma coluna ID do tipo INT e define ela como a chave primária. Mas apenas a criação da tabela não é suficiente para que a replicação funcione. O Firebird precisa saber que essa tabela deve ser publicada na lista de replicação, então execute o seguinte comando SQL no banco do Publicador:

ALTER DATABASE INCLUDE TABLE TESTE_REPLICA TO PUBLICATION;

Feche o gerenciador de banco de dados, abra o Explorer e aponte-o para a pasta c:\fdb-repl\journal\acme e veja se surgem novos arquivos de journaling a medida que alterações são feitas no banco de dados. Notará que alguns deles, depois de 60 segundos vão sumindo, na realidade, estão sendo processados e seguindo para nossa área de expedição c:\fdb-repl\archive\acme que você também poderá observar usando o Explorer. Se conseguir enxergar essa movimentação de arquivos de lá para cá, você entenderá como o processo de replicação funciona. Esse método lembra muito como bancos antigos funcionavam usando o protocolo Named Pipes, estabelecendo um arquivo em rede para que os serviços se comunicassem.

Assim que começar a notar que arquivos em c:\fdb-repl\archive\acme estão sumindo, você sabe que o lado Leitor está consumindo-os, o que por si só é indicativo de que a replicação está funcionando. Mas se você só acredita vendo, pode usar o gerenciador de banco de dados e conectá-lo a base acme no lado do Leitor e observar se a tabela TESTE_REPLICA apareceu lá, se sim, parabéns: seu motor de replicação está em perfeito estado!

Mas e se não aparecer? Calma, vamos verificar o que está acontecendo. Execute no lado Leitor o comando:

tail -f /opt/firebird/replication.log

Observar este arquivo de log da replicação mostrará o que está acontecendo.

Se mostrar algo como:

Database: /var/fdb/acme.fdb
VERBOSE: No new segments found, suspending

Significa que o Leitor não encontrou novos segmentos para processar, portanto ele suspende a operação e tentará novamente em 60 segundos. Mas se houver falhas de operações com arquivos, ele também as mostrará e por isso é tão importante verificar o log.

Lembre-se de que no replication.conf você configurou o parametro apply_idle_timeout que define o tempo de espera quando ocioso e o parametro apply_error_timeout que define o tempo de espera após um erro. Portanto, você deve aguardar o tempo configurado (em nosso exemplo, 60 segundos).

Vídeos para quem prefere pipoca

← Voltar para Firebird