Migração de dados de Oracle para SQL Server

Migrate · · 5 min de leitura

Vai levar tabelas do Oracle para o SQL Server? O dbSlice copia os dados por um app Windows ou pela linha de comando, mantém o SQL Server sincronizado enquanto o Oracle ainda está no ar e compara os dois lados chave a chave antes da troca.

Migrar de Oracle para SQL Server: o que muda no destino

Se a tabela não existe no SQL Server, o dbSlice para e mostra um CREATE TABLE traduzido para o SQL Server, para o seu DBA revisar e rodar. Por padrão, ele não cria nada nos seus bancos. Estes são os detalhes do Oracle para planejar:

  • DATE tem hora. Um DATE do Oracle guarda a data e a hora até o segundo; por isso, é sugerido como DATETIME2, e não DATE. Troque para DATE só nas colunas que nunca guardam hora.
  • NUMBER sem precisão. É sugerido como DECIMAL(38,10). Confira os valores reais e defina precisão e escala antes de rodar o CREATE TABLE. Um NUMBER(p,s) declarado mantém precisão e escala. A precisão é limitada a 38, que também é o limite do Oracle.
  • Chaves inteiras e flags. O Oracle não tem um tipo inteiro separado; então NUMBER(10) vira DECIMAL(10,0). Troque para INT ou BIGINT no DDL onde preferir. Uma flag NUMBER(1) ou CHAR(1) ('Y'/'N') pode virar BIT por um SELECT na origem, por exemplo CASE active WHEN 'Y' THEN 1 ELSE 0 END AS active.
  • Ids RAW(16) de SYS_GUID(). Chegam como binário e são sugeridos como VARBINARY(MAX). Declare BINARY(16) para a coluna poder ser chave. Convertê-los para UNIQUEIDENTIFIER muda a ordem dos bytes; teste em algumas linhas antes.
  • Strings vazias. O Oracle guarda '' como NULL; então não há strings vazias para copiar. Uma coluna do SQL Server declarada NOT NULL rejeita essas linhas. Deixe-a aceitar nulo ou preencha um padrão num SELECT, como NVL(middle_name, ' ').
  • VARCHAR2, CLOB e LONG. Texto vira NVARCHAR(n) até 4.000 caracteres, e NVARCHAR(MAX) acima disso. CLOB, NCLOB e o antigo tipo LONG também viram NVARCHAR(MAX). O NVARCHAR guarda todos os caracteres de um banco AL32UTF8.
  • TIMESTAMP WITH TIME ZONE. É sugerido como DATETIME2, e o offset não é levado. Se o fuso importa, normalize na origem com um SELECT como SYS_EXTRACT_UTC(created_at) AS created_at, e guarde o valor em DATETIME2 como UTC.
  • XMLTYPE, INTERVAL, ROWID e tipos espaciais. Não têm equivalente direto e são sugeridos como NVARCHAR(MAX). Converta-os num SELECT na origem, por exemplo XMLSERIALIZE(CONTENT doc AS CLOB), ou deixe-os fora.
  • Nomes em maiúsculas. O Oracle guarda os nomes sem aspas em maiúsculas. Escolha os nomes de tabela e coluna do SQL Server no CREATE TABLE; o dbSlice mapeia as colunas pelo nome, então mantenha os nomes batendo.
  • Sequences em vez de identity. Os ids do Oracle costumam vir de uma sequence ou de um trigger. Se a chave no SQL Server for uma coluna IDENTITY, ligue Keep identity, que exige permissão de ALTER na tabela e é confirmado na tela antes. Sem essa opção, o SQL Server gera ids novos; então não use o id como chave da sincronia. Uma chave BIGINT comum não precisa de nada disso.
  • O Upsert roda como MERGE e as cargas em massa usam SqlBulkCopy, com triggers e constraints verificados.
Aba Synchronize do dbSlice

Como o dbSlice controla a carga

  • Lê o Oracle em lotes pequenos, ordenados pela chave, para o banco em uso continuar atendendo os usuários.
  • Casa as linhas por uma chave que você escolhe. Modos: Initial load, depois Upsert, Insert new, Update only ou incremental por coluna. Uma execução incremental por uma coluna DATE filtra com TO_DATE, para o Oracle continuar usando o índice dessa coluna.
  • Confere antes de gravar com o Record Diff e as conferências na tela, e prova o resultado com o Compare e a lista completa de chaves divergentes.
  • Mascara no caminho as cópias de desenvolvimento e teste, mantendo chaves e chaves estrangeiras intactas.
  • Exportar em vez de carregar: quando você só precisa de um arquivo, o mesmo app exporta uma tabela do Oracle para CSV, JSON, XML ou HTML.

Passo a passo: converter uma tabela de Oracle para SQL Server

  1. Conecte no Oracle com o usuário dono das tabelas, e no SQL Server. O dbSlice lista as tabelas do usuário conectado; para tabelas de outro esquema, conecte como esse dono ou exponha-as por uma view no seu próprio esquema.
  2. Escolha a tabela de origem (ou um SELECT, como nos exemplos da flag e do XMLTYPE) e a tabela de destino.
  3. Escolha a coluna-chave, e ligue Keep identity se a chave do destino for uma coluna IDENTITY e os ids precisarem continuar iguais.
  4. Escolha o modo: Initial load, depois Upsert ou Insert new.
  5. Rode o Record Diff e depois a cópia, ou salve como job para a CLI e o Agendador de Tarefas do Windows.

Mover dados entre Oracle e SQL Server

O dbSlice copia os dados do Oracle para tabelas do SQL Server. O Microsoft SSMA converte o esquema e o código PL/SQL; veja como os dois se encaixam em alternativa ao SSMA. Para Oracle para PostgreSQL, veja Oracle para PostgreSQL e a rotina noturna em Sincronizar Oracle com PostgreSQL. Vindo do Firebird? Veja Firebird para SQL Server.

Perguntas frequentes

O dbSlice converte packages PL/SQL, triggers ou views?

Não. Ele move dados; o código PL/SQL precisa ser reescrito em T-SQL, à mão ou com o SSMA.

Preciso de GoldenGate, LogMiner ou supplemental logging no Oracle?

Não. O dbSlice lê as tabelas com consultas comuns.

Quais versões do Oracle?

Oracle 12c ou posterior, porque a paginação usa FETCH FIRST.

As execuções incrementais copiam as exclusões?

Não. Rode o Compare ou uma recarga antes da troca.

Existe versão gratuita?

Sim, na Microsoft Store: ela conecta, navega, compara e exporta para CSV. Gravar num destino exige uma licença Desktop ou Server.

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