Migração de dados de Oracle para PostgreSQL, no Windows

Migrate · · 5 min de leitura

Copie tabelas do Oracle para o PostgreSQL por um app Windows ou pela linha de comando, e depois mantenha o PostgreSQL sincronizado com o Oracle até o dia da troca. Sem cliente Oracle para instalar, sem Perl, sem agentes nos servidores.

Use o dbSlice para os dados e um conversor para o código

Um projeto de Oracle para PostgreSQL tem duas metades:

  • Código: packages, procedures, triggers e views em PL/SQL precisam virar PL/pgSQL. Ferramentas como o ora2pg ou o AWS Schema Conversion Tool cuidam disso, e uma parte é trabalho manual. O dbSlice não converte código.
  • Dados: cada linha precisa chegar com os tipos, as chaves e as contagens certas, muitas vezes mais de uma vez durante o projeto. Essa é a parte que o dbSlice faz.
Aba Synchronize do dbSlice

O que o dbSlice faz

  • Conecta sem cliente Oracle. Não há Instant Client nem tnsnames.ora para configurar na sua máquina Windows.
  • Lê em lotes pequenos, para o banco de produção continuar atendendo os usuários em vez de carregar uma exportação demorada.
  • 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 Oracle para o seu DBA revisar e rodar. Ele não cria objetos nos seus bancos por conta própria.
  • Protege os ids. Depois de copiar as linhas com os ids originais, uma sequence do PostgreSQL pode ficar atrás do maior id. O dbSlice avisa, mostra o comando para avançá-la e pode aplicá-lo se você permitir.
  • Mascara no caminho quando a cópia é para desenvolvimento ou teste.

Revise estes tipos no DDL sugerido

O CREATE TABLE sugerido é um ponto de partida. Dois tipos do Oracle pedem uma decisão do seu DBA antes de rodar:

  • DATE no Oracle guarda uma data e uma hora; por isso, o dbSlice sugere TIMESTAMP. Se uma coluna só guarda datas, você pode trocar para DATE.
  • NUMBER sem precisão é sugerido como NUMERIC simples, que nunca corta um valor. Para ids e contadores, INTEGER ou BIGINT são menores e mais rápidos; escolha-os onde você conhece a faixa de valores.

Também vale saber: o Oracle guarda uma string vazia como NULL; então esses valores chegam ao PostgreSQL como NULL, e não como ''.

Como os tipos de coluna são sugeridos

OracleSugerido no PostgreSQLRevise antes de rodar
NUMBER(p,s)NUMERIC(p,s)Ids NUMBER(p,0): INTEGER ou BIGINT
NUMBER (sem precisão)NUMERICVeja acima
FLOAT, BINARY_FLOAT, BINARY_DOUBLEDOUBLE PRECISION—
DATETIMESTAMPDATE se nunca houver hora
TIMESTAMP(n)TIMESTAMP—
TIMESTAMP WITH TIME ZONETIMESTAMPTroque para TIMESTAMPTZ se o fuso importa
VARCHAR2(n), NVARCHAR2(n), CHAR(n), NCHAR(n)VARCHAR(n)Tamanho em caracteres; o preenchimento do CHAR não é mantido
CLOB, NCLOBTEXT—
BLOB, RAW, LONG RAWBYTEA—
LONGTEXT—
INTERVAL, ROWID, XMLTYPE, tipos espaciaisTEXTConverta num SELECT de origem se precisar do valor

É um ponto de partida, não um esquema final: chaves, índices e constraints ficam por sua conta.

Erros comuns e o que significam

  • numeric field overflow — um valor NUMBER não cabe na precisão escolhida no CREATE TABLE. Aumente a precisão, ou use NUMERIC simples.
  • null value in column … violates not-null constraint — o Oracle guardou uma string vazia, que é NULL no Oracle. Aceite NULL nessa coluna do PostgreSQL, ou use um SELECT de origem com NVL(column, ' ').
  • duplicate key value violates unique constraint … _pkey depois da cópia — a sequence está atrás do maior id. Rode o comando que o dbSlice mostra, ou marque "Adjust the id generator afterwards" antes da execução, se o seu usuário puder alterar a sequence.
  • ORA-01555: snapshot too old numa leitura muito longa — o Oracle não conseguiu manter a leitura consistente por tanto tempo. Divida a cópia (um SELECT com uma faixa de chaves) ou fale com o seu DBA sobre a retenção de undo.

Passo a passo

  1. Conecte no Oracle (host, porta, service name, 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 o job e rode pela CLI num agendamento.

Mantenha os dois sincronizados até a virada

O Oracle costuma continuar em produção enquanto o sistema novo é testado. Agende um job Upsert toda noite; com uma coluna que só cresce (um timestamp ou uma sequence), cada execução lê só as linhas acima do último valor visto. Exclusões no Oracle não são detectadas pelas execuções incrementais; por isso, planeje uma comparação completa ou uma recarga antes da troca. Detalhes: Sincronizar Oracle com PostgreSQL.

O que o dbSlice não faz

  • Converter PL/SQL, triggers, views ou packages.
  • Captura de mudanças em tempo real. As execuções são jobs em lote, sob demanda ou agendados.
  • Rodar no Linux ou no macOS. O app Windows e a CLI rodam no Windows; para servidores Linux há uma edição em Docker, vendida como projeto (fale com a gente). Os bancos podem estar em qualquer lugar que ele alcance.

Perguntas frequentes

O dbSlice converte PL/SQL, packages ou triggers?

Não. Use o ora2pg, o AWS SCT ou trabalho manual para o código; use o dbSlice para os dados e a sincronia até a virada.

Preciso do Oracle Instant Client?

Não. O dbSlice conecta com host, porta, service name e usuário.

O Oracle pode continuar em produção durante a migração?

Sim. O dbSlice lê em lotes pequenos, e execuções noturnas Upsert ou só de linhas novas mantêm o PostgreSQL perto do Oracle até você trocar.

Ele cria as tabelas no PostgreSQL?

Não por padrão. Ele para antes de gravar e mostra um CREATE TABLE para o seu DBA revisar e rodar.

Posso testar antes de comprar?

Sim. A versão gratuita da Microsoft Store não precisa de chave de licença; gravar num banco de destino exige uma licença Desktop ou Server.

Também serve para

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

Vai para o SQL Server? Oracle para SQL Server.

O pgloader ainda não lê Oracle; 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