oracle para postgresql: conseguir migrar e não parar uti
DESCRIPTION
Migração de Oracle para PostgreSQL mostrando o que é viável, ferramentas, casos, etcTRANSCRIPT
![Page 1: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/1.jpg)
Fernando Ike de Oliveira
![Page 2: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/2.jpg)
![Page 3: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/3.jpg)
Antes de Tudo...
● Migrar projetos são difícies
● Compatilidade e compatibilidade por camadas são uma ilusão
● Migrar usando ferramentas mágicas não são tão mágicas assim
● Tem um bom suporte contratado para ajudar na migração.
● Sim, migrar é doloroso, sacrificante, difícil. Porém pode ser bem compensador.
![Page 4: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/4.jpg)
![Page 5: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/5.jpg)
Boas práticas
● Evitar utilizar extenções específicas de um SGBD.
● Utilizar ao máximo a sintaxe padrão ANSI SQL.
● Evite o uso de mixed case (notação Húngara), use minúsculas para nomes de objetos e maiúsculas para palavras reservadas.
● Documentar rigorosamente todo o código armazenado no banco.
● Utilizar tipos de dados binários somente quando necessário.
![Page 6: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/6.jpg)
Pensando em migrar...
● Leia atentamente toda a documentação dos SGBDs e identifique diferenças na sintaxe e funcionalidades utilizadas.
● Realizar Backup antes de realizar qualquer teste.
● Realizar testes em um servidor de teste.
● Verificar codificação de caracteres e localização.
● Verificar espaço em disco disponível, o espaço ocupado pelo banco pode variar de SGBD para SGBD.
![Page 7: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/7.jpg)
● Registre todo o processo.
● Migre primeiros sistemas não críticos.
● Migre primeiro o que é mais simples como tabelas e índices.
● Se possível, gere scripts em texto puro com todo DDL e DML.
● Importe tabelas, dados e constraints separadamente.
● Habilitar e checar logs durante exportações e importações.
● Migre primeiro o que é mais simples como tabelas e índices.
● Homologue cada etapa antes de prosseguir.
Durante a migração
![Page 8: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/8.jpg)
Oracle != PostgreSQL
Tipos de dados
● varchar2 → varchar, text
● number → numeric, bigint, int, smallint, double precision
● clob, long → varchar, text
● nchar, nvarchar2, nclob → varchar, text
● binary_float/binary_double → real/double precision
● blob, raw, long raw → bytea (migração adicional)
● date → date, timestamp
![Page 9: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/9.jpg)
Oracle != PostgreSQL
JOIN● FROM t1, t2 > FROM t1 LEFT OUTER JOIN t2 WHERE t1.id = t2.id(+) ON t1.id = t2.id
Funções:● DECODE (sexo, 'M', > CASE WHEN sexo = 'M' then 'Masculino' 'Masculino,'F','Feminino') WHEN sexo = 'F' then 'Feminino' END
●NVL > COALESCE● sysdate, systimestamp > current_date, current_timestamp, localtimestamp
UNION● MINUS > EXCEPT
Clausula LIMIT e OFSET:● ROWNUM, ROWID > LIMIT, OFFSET, OID
![Page 10: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/10.jpg)
Oracle != PostgreSQL
Localização
NLS CALENDAR —
NLS COMP lc collate = ’pt_BR’
NLS CURRENCY lc monetary
NLS DATE FORMAT DateStyle
NLS DATE LANGUAGE lc messages, lc time (8.4?)
NLS NCHAR —
NLS NUMERIC CHARACTERS lc numeric
NLS SORT lc collate
NLS TERRITORY LANG, lc *
NLS LANG, NLS LANGUAGE LANG, client encoding
![Page 11: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/11.jpg)
SQL
● Catálogo de sistema SYS e SYSTEM do Oracle são equivalentes ao pg_catalog e information_schema no PostgreSQL.
● PostgreSQL é Sensitive Case. Todos nomes de objetos com letras maiúsculas devem estar entre aspas.
● O PostgreSQL não necessita do uso da tabela “DUAL”. Pode ser criada uma para manter a compatibilidade.
● Implementação de hierarquia entre tabelas, XML, Database Link e outras funções avançadas possuem diferenças.
● O PostgreSQL não possui visões materializadas. No entanto é possível contornar este problema com gatilhos e funções.
![Page 12: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/12.jpg)
PL/SQL X PLpg/SQL
● Ambos possuem PL/Java, funções em C dentro do banco. No PostgreSQL há outras linguagens como PL/Perl, PL/Pyhton, etc.
● Não existem procedures no PostgreSQL, no entanto uma função pode ser utilizada retornando o tipo VOID.
● Não existem valores DEFAULT para parâmetos recebidos no PL/SQL, no entanto é possível utilizar sobrecarga de funções.
● Não existem Packages no PostgreSQL, no entanto os objetos podem ser organizados num esquema separado. Variáveis de nível de pacote podem ser armazenadas em tabelas temporárias mantidas durante a sessão.
![Page 13: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/13.jpg)
PL/SQL X PLpg/SQL
● Cursores não são necessários no PostgreSQL. A consulta deve ser declarada junto a cláusula FOR do laço.
● O corpo da função deve estar delimitado com marcas de dólar no PostgreSQL
● Os gatilhos no PostgreSQL chamam uma e apenas uma função, não havendo código em seu corpo.
![Page 14: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/14.jpg)
Armazenamento
● O conceito de Espaço de Tabelas no PostgreSQL se refere a uma pasta que é gerenciada pelo SGBD. Não é possível definir DataFiles específicos. A única influência sobre os DataFiles é especificar o formato de armazenamento nas colunas com valores grandes.
● O PostgreSQL não tem implementado explicitamente o conceito de extensões e segmentos.
● Ainda não é possível especificar o local de armazenamento separado para áreas temporárias (para operações de Rollback, Ordenação, Indexação, etc). Estas áreas ficam todas no mesmo local que o catálogo do sistema.
![Page 15: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/15.jpg)
Backup● Conceito de Redo no Oracle é semelhante ao conceito de WAL no PostgreSQL.
● Conceito de DUMP é semelhante em ambos.
● DUMP no PostgreSQL permite redirecionamento via pipe.
● Conceito de cópia de arquivos de dados é semelhante em ambos.
● Conceito de Stand By é semelhante em ambos.
● O PostgreSQL não possui uma ferramenta de FlashBack.
● O PostgreSQL não possui ferramenta nativa no estilo do RMAN.
![Page 16: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/16.jpg)
Segurança
● GRANT e REVOKE tem funcionalidade semelhante.
● SCHEMAS não são automaticamente atrelados ao usuário no PostgreSQL. Eles precisam ser criados manualmente. Depois disso se comporta de maneira parecida. No entanto um esquema pode possuir objetos de outro dono se ele tiver as permissões necessárias para isso.
● O ROLE “connect” no Oracle é realizado através do pg_hba.conf no PostgreSQL.
![Page 17: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/17.jpg)
Segurança
● O ROLE “resource” no Oracle é semelhante a possuir privilégio para criar objetos num esquema do PostgreSQL.
● O Role DBA é no Oracle é semelhante ao superusuário do PostgreSQL.
● O Role SYS é no Oracle é semelhante ao usuário POSTGRES no PostgreSQL.
* Os GROUPs foram convertidos para ROLEs na versão 8.1
![Page 18: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/18.jpg)
w
![Page 19: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/19.jpg)
Clusters
● Um cluster não é somente um Oracle RAC.
● Similar ao RAC é o PgCluster
● Stand by em ambos são equivalente
● Não tem ainda um similar ao Oracle Dataguard (em desenvolvimento)
● Pool de conexões usando PgPool{2} e PgBouncer
![Page 20: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/20.jpg)
DBlink
● Conecta em outros instâncias PostgreSQL.
● Presente como extensão no diretório contrib do códigofonte ou como um pacote separado nas principais distribuições Linux.
● Possível inserir, alterar, remover qualquer informação remota
![Page 21: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/21.jpg)
Lógica da Migração - Ora2pg
![Page 22: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/22.jpg)
Ora2pg
● Feito em PERL. Depende dos módulos DBI, DBD::Pg e DBD::Oracle.
● Importa dados e definições do Oracle para um arquivo texto ou direto para um banco no PostgreSQL.
● Suporte a extração de DDL de tabelas, indices, constraints, views, triggers, procedures, functions, packages e grants.
● Dados podem ser exportados no formato INSERT ou COPY.
![Page 23: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/23.jpg)
Ora2pg
● Pode ser selecionado um esquema ou tabela específico para ser importado.
● Corrige nomes de tipos de dados diferentes.
● Extrai o código do corpo de triggers numa função.
● Algumas funções com nome diferente precisam.
● Funções em PL/SQL geralmente precisam de um pouco de edição manual.
● Funções SQL diferentes precisam de edição manual.
![Page 24: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/24.jpg)
![Page 25: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/25.jpg)
DBI-Link
SQL 2003/MED
Pl/Perl Untrusted.
DBI/DBD.
Mapeamento de tabelas remotas utilizando Views + Rules + Triggers.
Acesso Transparente a tabelas de Banco de Dados Remotos (Oracle, MSSQL, MySQL).
![Page 26: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/26.jpg)
Orafce
● Um grande conjunto de funções compatíveis com Oracle
● Disponíveis para as principais distribuições
● Fácil instalação e uso
● Documentação: http://www.postgres.cz/index.php/Oracle_functionality_(en)
![Page 27: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/27.jpg)
Pg::snapshot
● Desenvolvido em Perl e PL/Perl
● Fornece visões materializadas
● Os dados podem ser do Oracle ou PostgreSQL
![Page 28: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/28.jpg)
Postgres Plus
● Um PostgreSQL modificado pela EnterpriseDB
● É incrementado com extensões SQL adotadas pela Oracle
● Produto pago
![Page 29: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/29.jpg)
![Page 30: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/30.jpg)
Como você pode contribuir
● Porte de projetos são fonte de idéias para novas funções
● Registre suas experiências em migração e disponibileze na internet (Wiki).
● Contribuia com orafce e ora2pg.
● Contribua com Pl/pgSQL e PL/Java.
![Page 31: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/31.jpg)
Referências
Oracle http://www.oracle.comPostgreSQL http://www.postgresql.orgMigração http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#Oracle
Ora2Pg http://www.samse.fr/GPL/ora2pg/ora2pg.html DBILink http://pgfoundry.org/projects/dbilink/ História de horror de Migração para PostgreSQL http://www.frankhilliard.com/horrorstory.cfm Orafce http://pgfoundry.org/projects/orafce/EnterpriseDB http://www.enterprisedb.comPg::Snapshot http://pgfoundry.org/projects/snapshot/
![Page 32: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/32.jpg)
Outras referências
● Oracle: Ask Tom: http://asktom.oracle.com/
● PostgreSQL: Ask Tom brazuca: http://www.midstorm.org/~telles
![Page 33: Oracle para PostgreSQL: Conseguir migrar e não parar UTI](https://reader034.vdocuments.mx/reader034/viewer/2022051313/54967059ac7959342e8b5109/html5/thumbnails/33.jpg)
TODO
● Diferenças do PL/Java
● Migrar a palestra para Latex
● Diferenças de Cluster
● Exemplos