Seja migrando um banco de dados ou um aplicativo de Oracle para PostgreSQL com apenas um tipo de conhecimento de banco de dados, há poucas coisas a saber sobre as diferenças entre os dois sistemas de banco de dados.
PostgreSQL é o banco de dados de código aberto mais avançado do mundo. A comunidade PostgreSQL é muito forte e eles estão continuamente melhorando os recursos existentes do PostgreSQL e também adicionando novos recursos. De acordo com o db-engines.com, o PostgreSQL é o DBMS do ano de 2017.
Existem algumas incompatibilidades no Oracle e no PostgreSQL. O comportamento de algumas funções é diferente entre Oracle e PostgreSQL.
Por que migrar do Oracle para o PostgreSQL
- Custo:Como você deve saber, o custo da licença do Oracle é muito caro e há um custo adicional para alguns recursos, como particionamento e alta disponibilidade. Portanto, no geral, é muito caro.
- Licenciamento flexível de código aberto e fácil disponibilidade de provedores de nuvem pública como AWS.
- Aproveite os complementos de código aberto para melhorar o desempenho.
Verificação preliminar
Como você deve saber, a migração do Oracle para o PostgreSQL é uma tarefa cara e demorada. É importante entender qual parte deve migrar. Não perca tempo migrando objetos que não são mais necessários. Além disso, verifique se há algum dado histórico necessário ou não. Não perca tempo replicando dados que você não precisa, por exemplo, dados de backup e tabela temporária de manutenções anteriores.
Avaliação de migração
Após a verificação preliminar, a primeira etapa da migração é analisar o aplicativo e o objeto de banco de dados, descobrir as incompatibilidades entre os dois bancos de dados e estimar o tempo e o custo necessários para a migração.
A ferramenta Ora2pg é muito útil para avaliação de migração. Ele se conecta ao banco de dados Oracle, faz a varredura automaticamente e extrai os dados, gerando o relatório de migração do banco de dados. Você pode verificar um relatório de amostra em Ora2pg.
O que você deve saber
Entenda as diferenças entre Oracle e PostgreSQL e converta-o usando qualquer ferramenta. Não existe nenhuma ferramenta que possa converter banco de dados 100% Oracle em PostgreSQL, algumas alterações manuais são necessárias. Confira abaixo algumas diferenças importantes que você deve saber antes de migrar.
Mapeamento de tipo de dados
O PostgreSQL possui um rico conjunto de tipos de dados. Algumas das importantes conversões de tipos de dados entre Oracle e PostgreSQL são as seguintes.
Oráculo | PostgreSQL | Comentário |
---|---|---|
VARCHAR2(n) | VARCHAR(n) | No Oracle 'n' é o número de bytes enquanto no PostgreSQL 'n' é o número de caracteres |
CHAR(n) | CHAR(n) | No Oracle 'n' é o número de bytes enquanto no PostgreSQL 'n' é o número de caracteres |
NÚMERO(n,m) | NUMERIC(n,m) | O tipo NUMBER pode ser convertido em NUMERIC, mas se você usar SMALLINT, INT e BIGINT, o desempenho será melhor. |
NÚMERO(4) | SMALLINT | |
NÚMERO(9) | INT | |
NÚMERO(18) | GRANDE | |
NÚMERO(n) | NUMERIC(n) | NUMERIC(n) ,Se n>=19 |
DATA | TIMESTAMP(0) | Ambos os bancos de dados têm o tipo DATE, mas o tipo Oracle DATE retorna data e hora, enquanto o tipo PostgreSQL DATE retorna apenas data sem hora. |
TIMESTAMP COM FUSO HORÁRIO LOCAL | TIMESTAMPTZ | O tipo PostgreSQL Timestamptz(Timestamp com fuso horário) é diferente do Oracle Timestamp com fuso horário. É equivalente ao Timestamp da Oracle com fuso horário local, mas essa pequena diferença pode causar problemas de desempenho ou bugs no aplicativo. |
CLOB | TEXTO | O tipo TEXT do PostgreSQL pode armazenar até 1 GB de texto. |
BLOB RAW(n) | BYTEA(limite de 1 GB) Objeto grande | No Oracle, o tipo de dados BLOB armazena dados binários não estruturados no banco de dados. O tipo BLOB pode armazenar até 128 terabytes de dados binários. O PostgreSQL BYTEA armazena dados binários, mas apenas até 1 GB. Se os dados estiverem acima de 1 GB, use o objeto Grande. |
Transações
O banco de dados Oracle sempre usa transações, mas no PostgreSQL você precisa ativar isso. No Oracle, a transação inicia ao executar qualquer instrução e termina quando a instrução COMMIT é executada. No PostgreSQL, a transação começa quando executa BEGIN e termina quando a instrução COMMIT é executada. Mesmo os níveis de isolamento também não têm problema. O banco de dados PostgreSQL conhece todos os níveis de isolamento que o banco de dados Oracle conhece. O nível de isolamento padrão do PostgreSQL é leitura confirmada.
Exemplo:
Oráculo:
DELETE FROM table_name WHERE id = 120;
COMMIT;
PostgreSQL:
BEGIN;
DELETE FROM table_name WHERE id = 120;
COMMIT;
Mesa dupla
No Oracle, a cláusula FROM é obrigatória para cada instrução SELECT, portanto, o banco de dados Oracle usa a tabela DUAL para a instrução SELECT, onde o nome da tabela não é necessário. No PostgreSQL, a cláusula FROM não é obrigatória, portanto a tabela DUAL não é necessária. A tabela Dual pode ser criada no PostgreSQL para eliminar o problema de portabilidade. A ferramenta Orafce implementou isso para que você também possa usar o Orafce.
Exemplo:
postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
ERROR: relation "dual" does not exist
LINE 1: SELECT CURRENT_TIMESTAMP FROM DUAL;
^
postgres=# SELECT CURRENT_TIMESTAMP;
current_timestamp
-------------------------------
2018-03-16 09:36:01.205925+00
(1 row)
Após instalar o módulo Oracle:
postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
current_timestamp
-------------------------------
2018-03-16 09:36:01.205925+00
(1 row)
SYSDATE
A função SYSDATE do Oracle retorna data e hora. O comportamento da função SYSDATE é diferente em lugares diferentes. O PostgreSQL não possui nenhuma função correspondente à função SYSDATE. No PostgreSQL existem vários métodos para obter a data e hora e é baseado no propósito da aplicação.
Método de recuperação de tempo | Função a ser usada |
---|---|
Hora de início do SQL | Statement_timestamp() |
Hora de início da transação | agora() ou Transaction_timestamp() |
Hora em que a função é implementada | Clock_timestamp() |
No exemplo abaixo, clock_timestamp() retorna a hora em que a função real é executada e outra statement_timestamp() retorna a hora em que a instrução SQL iniciou sua execução.
postgres=# SELECT now(), statement_timestamp(), current_timestamp, transaction_timestamp(), clock_timestamp();
now | statement_timestamp | current_timestamp | transaction_timestamp | clock_timestamp
-------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163281+00
(1 row)
TO_DATE(dois argumentos)
A função TO_DATE do Oracle retorna o valor do tipo DATE (ano, mês, dia, hora, minuto, segundo) enquanto o TO_DATE do PostgreSQL (two_argument) retorna o valor do tipo DATE (ano, mês, dia).
A solução para esta incompatibilidade é converter TO_DATE() para TO_TIMESTAMP(). Se você usa a ferramenta Orafce, não é necessário alterar nada porque o Orafce implementou essa função para obtermos o mesmo resultado no Oracle.
Oráculo:
SELECT TO_DATE ('20180314121212','yyyymmddhh24miss') FROM dual;
PostgreSQL:
SELECT TO_TIMESTAMP ('20180314121212','yyyymmddhh24miss')::TIMESTAMP(0);
SINÔNIMO
CREATE SYNONYM não é suportado no PostgreSQL. No Oracle CREATE SYNONYM é usado para acessar objetos remotos enquanto no PostgreSQL podemos usar SET search_path para incluir a definição remota.
Oráculo:
CREATE SYNONYM abc.table_name FOR pqr.table_name;
PostgreSQL:
SET search_path TO 'abc.table_name';
Comportamento de String Vazia e NULL
No Oracle, strings vazias e valores NULL no contexto de string são os mesmos. A concatenação de NULL e string obtém string como resultado. No PostgreSQL o resultado da concatenação é nulo neste caso. No Oracle, o operador IS NULL é usado para verificar se a string está vazia ou não, mas no PostgreSQL o resultado é FALSE para string vazia e TRUE para NULL.
Sequências
Há uma pequena diferença na sintaxe da sequência no Oracle e no PostgreSQL.
Oráculo:
Sequence_name.nextval
PostgreSQL:
Nextval(‘sequence_name’)
Para alterar essa sintaxe, você pode criar um script ou alterá-lo manualmente.
SUBSTR
O comportamento da função SUBSTR no Oracle e no PostgreSQL é diferente. A função SUBSTR funciona no PostgreSQL sem erros, mas retorna um resultado diferente. Essa diferença pode causar bugs no aplicativo.
Oráculo:
SELECT SUBSTR(‘ABC’,-1) FROM DUAL;
Returns ‘C’
PostgreSQL:
postgres=# SELECT SUBSTR('ABC',-1);
substr
--------
ABC
(1 row)
A solução para isso é usar a função SUBSTR do Orafce que retorna o mesmo resultado que o Oracle no PostgreSQL.
Excluir declaração
No Oracle, a instrução DELETE pode funcionar sem a cláusula FROM, mas no PostgreSQL ela não é suportada. Precisamos adicionar a cláusula FROM na instrução DELETE do PostgreSQL manualmente.
Oráculo:
DELETE table_name WHERE column_name = 'Col_value';
PostgreSQL:
DELETE FROM table_name WHERE column_name = 'Col_value';
Acoplamento Externo +
O Oracle usa o operador + para junção esquerda e direita, mas o PostgreSQL não o usa.
Oráculo:
SELECT a1.name1, a2.name2
FROM a1, a2
WHERE a1.code = a2.code (+);
PostgreSQL:
SELECT a1.name1, a2.name2
FROM a1
LEFT OUTER JOIN a2 ON a1.code = a2.code;
COMEÇAR COM..CONECTAR POR
O Oracle usa START WITH..CONNECT BY para consultas hierárquicas. O PostgreSQL não suporta a instrução START WITH..CONNECT BY. O PostgreSQL tem WITH RECURSIVE para consultas hierárquicas, então traduza a instrução CONNECT BY para a instrução WITH RECURSIVE.
Oráculo:
SELECT
restaurant_name,
city_name
FROM
restaurants rs
START WITH rs.city_name = 'TOKYO'
CONNECT BY PRIOR rs.restaurant_name = rs.city_name;
PostgreSQL:
WITH RECURSIVE tmp AS (SELECT restaurant_name, city_name
FROM restaurants
WHERE city_name = 'TOKYO'
UNION
SELECT m.restaurant_name, m.city_name
FROM restaurants m
JOIN tmp ON tmp.restaurant_name = m.city_name)
SELECT restaurant_name, city_name FROM tmp;
Conversão de PLSQL para PLPGSQL
A linguagem PL/pgSQL do PostgreSQL é semelhante à linguagem PL/SQL da Oracle em muitos aspectos. É uma linguagem imperativa estruturada em blocos, e todas as variáveis devem ser declaradas. Em ambas as atribuições de bancos de dados, loops, condicionais são semelhantes.
As principais diferenças que você deve ter em mente ao migrar do PL/SQL do Oracle para o PL/pgSQL do PostgreSQL
Baixe o whitepaper hoje PostgreSQL Management &Automation with ClusterControlSaiba o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o PostgreSQLBaixe o whitepaper
Ferramentas de migração
Existem algumas ferramentas que são muito úteis para uma migração de Oracle para PostgreSQL. Você também pode criar sua própria ferramenta como uma extensão e usá-la dentro do PostgreSQL.
Orafice
Funções, tipos de dados e pacotes compatíveis com Oracle podem ser usados como no PostgreSQL. Esta é uma ferramenta de código aberto com licença BSD para que qualquer pessoa possa usar esta ferramenta.
A maioria das principais funções são cobertas no Orafce.
Os aplicativos geralmente usam essas funções com várias ocorrências. Você pode reduzir o custo de modificação do SQL usando esta ferramenta.
Todas as funções e pacotes são implementados corretamente e são bem testados.
Algumas das funções:
- Dbms_output
- dbms_random
- utl_file – funções relacionadas ao sistema de arquivos
- Dbms_pipe e dbms_alert
- PLVdata,PLVstr, PLVchr
- Tipo de dados DATE compatível com Oracle e funções como ADD_MONTHS, LAST_DAY, NEXT_DAY e assim por diante.
- Função NVL
- Função SUBSTR e SUBSTRB
- Suporte a VARCHAR2 e NVARCHAR2
- TO_DATE()
Ora2pg
Ora2Pg é uma ferramenta gratuita usada para migrar um banco de dados Oracle para um esquema compatível com PostgreSQL.
Ele se conecta ao banco de dados Oracle, verifica-o automaticamente, extrai sua estrutura ou dados e gera scripts SQL que você pode carregar em seu banco de dados PostgreSQL.
A estimativa de custo em uma migração de Oracle para PostgreSQL não é fácil.
Ora2Pg inspeciona todos os objetos de banco de dados, todas as funções e procedimentos armazenados para detectar se ainda há alguns objetos e código PL/SQL que não podem ser convertidos automaticamente pelo Ora2Pg.
Esta ferramenta é muito útil para as seguintes conversões:
- Conversão de esquema
- Conversão de PLSQL para PLPGSQL
Teste
Testar todo o aplicativo e o banco de dados migrado é muito importante porque algumas das funções são as mesmas nos dois bancos de dados, porém o comportamento é diferente.
- Alguns cenários comuns precisam ser verificados:
- Verifique se todos os objetos foram convertidos corretamente ou não.
- Verifique se todos os DMLS estão funcionando corretamente ou não.
- Carregue alguns dados de amostra em ambos os bancos de dados e verifique o resultado. O resultado do SQL de ambos os bancos de dados deve ser o mesmo.
- Verifique o desempenho do DML e melhore-o, se necessário.