Migração de Firebird para PostgreSQL, no Windows

Migrate · · 3 min de leitura

Muitos sistemas de gestão ainda rodam em Firebird. Na hora de levar os dados para o PostgreSQL, o dbSlice copia as tabelas por um app Windows ou pela linha de comando, e mantém o PostgreSQL sincronizado com o Firebird enquanto os dois sistemas rodam lado a lado.

Dados, não código

O dbSlice move dados: tabelas, linhas, chaves e tipos. Ele não converte stored procedures, triggers nem código PSQL para PL/pgSQL; planeje essa parte à parte. A maioria dos projetos em Firebird tem regra de negócio em triggers e procedures, e nenhuma ferramenta converte tudo isso automaticamente.

Aba Synchronize do dbSlice

O que o dbSlice faz

  • Conecta no seu servidor Firebird com o caminho ou o alias do banco, como a sua aplicação faz.
  • Lê em lotes pequenos, para o banco de produção continuar atendendo os usuários.
  • Grava no PostgreSQL em massa nas cargas iniciais e completas.
  • Mostra o DDL do destino. Se a tabela não existe no PostgreSQL, o dbSlice para antes de gravar e mostra um CREATE TABLE traduzido do Firebird para o seu DBA revisar e rodar. Ele não cria objetos nos seus bancos por conta própria.
  • Protege os ids. Depois que as linhas são copiadas com os ids originais, a sequence do PostgreSQL pode ficar atrás do maior id. O dbSlice avisa e mostra o comando para avançá-la.
  • Mascara no caminho quando a cópia é para desenvolvimento ou teste.

Três detalhes do Firebird para planejar

1. Nomes em maiúsculas. O Firebird guarda nomes de tabela e coluna em maiúsculas (CUSTOMERS, CUST_NAME). Se você mantiver esses nomes entre aspas no PostgreSQL, toda consulta vai precisar das aspas para sempre. A maioria das equipes troca para minúsculas no CREATE TABLE antes de rodar. O dbSlice casa as colunas pelo nome sem diferenciar maiúsculas, então CUST_NAME no Firebird preenche cust_name no PostgreSQL sem mapeamento manual.

2. Conjunto de caracteres. O dbSlice conecta em UTF-8. Bancos antigos criados com charset NONE ou WIN1252 podem parar com o erro "cannot transliterate" em caracteres acentuados. Informe o charset real do banco na string de conexão e rode de novo.

3. Tipos para revisar no DDL sugerido.

  • BLOB SUB_TYPE 1 (texto) vira TEXT; BLOB binário vira BYTEA.
  • Os tipos do Firebird 4 entram no DDL sugerido: INT128 → NUMERIC(38,0), DECFLOAT → NUMERIC sem precisão, e TIME/TIMESTAMP WITH TIME ZONE → TIME/TIMESTAMP. O fuso não é copiado: se ele importa, normalize o valor para UTC num SELECT na origem.

Passo a passo

  1. Conecte no Firebird (host, porta, caminho ou alias do banco, usuário) e no PostgreSQL.
  2. Escolha a tabela de origem ou escreva um SELECT, e a tabela de destino.
  3. Escolha a coluna-chave usada para casar as linhas.
  4. Escolha o modo: Initial load na primeira vez, depois Upsert ou Insert new.
  5. Confira antes de gravar: o Record Diff compara as chaves dos dois lados.
  6. Rode, ou salve como job e agende pela CLI. O Replicador copia uma lista de tabelas numa execução, as pais antes das filhas.

Mantenha os dois sincronizados até a virada

A aplicação em Firebird costuma continuar em produção enquanto a nova é testada. Agende um job Upsert toda noite; com uma coluna que só cresce (um timestamp ou um id alimentado por generator), cada execução lê só as linhas acima do último valor visto. Exclusões no Firebird não são detectadas pelas execuções incrementais; por isso, planeje uma comparação completa ou uma recarga antes da troca.

Também serve para

Firebird para SQL Server, MySQL, MariaDB, Oracle, SQLite ou InterSystems IRIS, e de volta para o Firebird. Para origens Oracle, veja Oracle para PostgreSQL.

O pgloader não tem Firebird como origem; veja a página alternativa ao pgloader.

Ainda não usa o dbSlice?
Experimente a versão gratuita da Microsoft Store: ela conecta, navega pelos dados, compara estruturas e exporta para CSV.

Experimente grátis Veja as demonstrações

Em produção há mais de 6 anos · Garantia de 14 dias · Roda na sua máquina