Migração entre SGBDs Hugo Roger Migração entre SGBDs [agenda] ● Introdução ● Por que migrar? ● Principais desafios ● Antes de migrar ● Durante a migração ● Migrações – Oracle x PostgreSQL – SQLServer x PostgreSQL Migração entre SGBDs [Introdução] ● ● Projeto de Migração, Fazer uma avaliação do SGBDs existentes, ● Definição dos critérios de avaliação, ● Avaliação dos produtos, ● Definição das estratégias de migração. Migração entre SGBDs [Por que migrar?] ● Diminuição de custos; ● Desempenho; ● Suporte; ● Segurança; ● Imposição; Migração entre SGBDs [Principais desafios] ● ● Apoio da diretoria? – Suporte as mudanças; – Suporte Financeiro. Qualificação da área técnica? – Preparação e Treinamento; – Consultoria Externa. Migração entre SGBDs [Antes de migrar] ● ● ● ● ● Estudar a documentação dos SGBDs e identificar as diferenças de sintaxe e funcionalidades; Realizar backup enquanto ainda é tempo; Utilizar um servidor de testes. Nunca em produção diretamente; Verificar localização de caracteres (importantíssimo); Verificar espaço de armazenamento: entre SGBDs diferentes isso pode variar; – Investimento em Hardware? Migração entre SGBDs [Durante a migração] ● Registrar todo o processo; ● Migrar antes tabelas e índices; ● Adaptar primeiro os sistemas não críticos; ● ● – não utilizam Stored Procedures; – não dependem de extensões específicas... Importar Tabelas, Dados e Procedures separadamente; Homologar separadamente cada etapa antes de prosseguir... MIGRAÇÃO ORACLE x POSTGRESQL Migração Oracle x PostgreSQL [Por que migrar?] Migração Oracle x PostgreSQL [Por que migrar?] Migração Oracle x PostgreSQL [Principais desafios] ● Extensões específicas do SGBD; ● Não utilização do Padrão ANSI SQL; ● Utilização de Mixed case ● Falta de documentação; ● Utilização de tipos binários; ● etc. (notação Húngara); Migração Oracle x PostgreSQL [Diferenças – tipos de dados] VARCHAR2(size) VARCHAR(size) max. 4kb, min. 1 min. 4b + string NUMBER(p,s) NUMERIC(p,s) p[1,38], s[-84,127] sem limite Migração Oracle x PostgreSQL [Diferenças - JOIN] SELECT t1.*, t2.* FROM t1, t2 WHERE t1.id=t2.id(+) SELECT t1.*, t2.* FROM t1 LEFT JOIN t2 ON t1.id=t2.id Migração Oracle x PostgreSQL [Diferenças - funções] DECODE(sexo, CASE 'M', WHEN sexo='M' 'Masculino, THEN 'Masculino' 'F', WHEN sexo='F' 'Feminino' THEN 'Feminino' ) END NVL COALESCE Migração Oracle x PostgreSQL [Diferenças - UNION] SELECT id SELECT id FROM t1 FROM t1 MINUS EXCEPT SELECT t1_id SELECT t1_id FROM t2; FROM t2; Migração Oracle x PostgreSQL [Diferenças – LIMIT e OFFSET] SELECT * SELECT * FROM t1 FROM t1 WHERE LIMIT 15, 3 ROWNUM > 3 AND ou ROWNUM <= 15 SELECT * FROM t1 LIMIT 15 OFFSET 3 Migração Oracle x PostgreSQL [Diferenças] ● ● ● ● O catálogo de sistema SYS e SYSTEM do Oracle é equivalente ao pg_catalog e information_schema do PostgreSQL; PostgreSQL é sensível ao caso. Todos os nomes que devem ser maiúsculos devem estar entre (“); PostgreSQL não faz uso da tabela “DUAL”; PostgreSQL não possui visões materializadas... Migração Oracle x PostgreSQL [PL/SQL x PLpg/SQL] ● ● ● Ambos possuem PL/Java, funções C. O PostgreSQL também suporta (se compilado para isso) outras linguagens: PL/Perl, PL/PHP, PL/Python etc. Não existe procedure no PostgreSQL. Utiliza-se uma function que retorna um void; Uma trigger no PostgreSQL chama apenas uma function... Migração Oracle x PostgreSQL [PL/SQL x PLpg/SQL] CREATE OR REPLACE PROCEDURE nome IS declarações BEGIN corpo -- comentário CREATE OR REPLACE FUNCTION nome() RETURNS void AS $func$ DECLARE declarações BEGIN END; corpo / -- comentário show errors; END; $func$ LANGUAGE plpgsql; Migração Oracle x PostgreSQL [Storage - PostgreSQL] ● ● ● O conceito de espaço de tabela se refere a uma pasta que é gerenciada pelo SGBD. Não é possível definir datafile específico; Não implementa explicitamente o conceito de extensão e segmentos; Ainda não é possível especificar o local de armazenamento separado para áreas temporárias (rollback, ordenação, indexação etc.); Migração Oracle x PostgreSQL [Backup] ● O conceito de DUMP é semelhante em ambos; – ● ● ● no PostgreSQL permite redirecionamento via pipe. O conceito de cópia de arquivo de dados é semelhante em ambos; O PostgreSQL não possui uam ferramenta de flashback; O PostgreSQL não possui ferramenta nativa tipo RMAN... Migração Oracle x PostgreSQL [Ferramenta - ora2pg.pl] Migração Oracle x PostgreSQL [Ferramenta - ora2pg.pl] ● ● ● Escrito em Perl. Depende dos módulos DBI, DBD::Pg e DBD::Oracle; Importa dados e definições do Oracle para um arquivo texto ou diretamente para um banco PostgreSQL; Suporta a extração de DDL de tabelas, índices, constraints, views, trigges, procedures, functions, packages e grants; Migração Oracle x PostgreSQL [Ferramenta - ora2pg.pl] ● ● ● ● ● Dados do DUMP Oracle podem estar no formato INSERT ou COPY; Corrige nomes de tipos e dados diferentes; Extrai o código do corpo de uma trigger em uma function; Funções em PL/SQL, geralmente, necessitam de edição manual; ... Migração Oracle x PostgreSQL [Ferramenta - DBI-Link] Migração Oracle x PostgreSQL [Ferramenta - DBI-Link] ● ● ● ● Permite acessar tabelas e dados de outros SGBDs via Perl; Requer PostgreSQL 8.0 ou superior; Acesso transparente a tabelas de banco de dados remotos (Oracle, MSSQL, MySQL); ... MIGRAÇÃO SQL SERVER x POSTGRESQL Migração SQLServer x PostgreSQL [Motivação] ● SGBD OpenSource X SGBD Proprietário ● Postgresql SGBD bastante completo Migração SQLServer x PostgreSQL [Motivação] Migração SQLServer x PostgreSQL [Dificuldades] ● ● ● ● Falta de documentação oficial migração Necessário bom conhecimento nos dois SGBD's Dois bancos não seguem o mesmo padrão de linguagem (SQL, T-SQL) SQLServer permite integrações específicas entre seus produtos (.Net) Migração SQLServer x PostgreSQL [Etapas – Migração Estrutura] ● SCHEMA (tabelas, chaves) – Case sensitive – Tipo de dados (poucas diferenças) ● ● ● – datetime -> timestamp identity - > serial Money -> numeric ALTER TABLE Migração SQLServer x PostgreSQL [Etapas – Migração Dados] ● ● ● Dados são dados Verificar se os tipo de dados alterados no schema precisam tratamento Verificar terminadores / delimitadores de arquivo se plataforma for diferente (dos2unix) Migração SQLServer x PostgreSQL [Etapas – Store Procedures ] Migração SQLServer x PostgreSQL [Etapas – Store Procedures ] Migração SQLServer x PostgreSQL [Etapas – Linguagem] ● Comandos, operadores e funções próprios da linguagem – TOP -> LIMIT – Datediff() -> (Date – Date) – Len() - > Length() – isNull() -> Coalesce() – contatenação (+) -> || – left outer join (*=) -> left outer join – interpretação LIKE é case sensitive Migração SQLServer x PostgreSQL [Ferramentas - DTS] Migração SQLServer x PostgreSQL [Ferramentas - DTS] Migração SQLServer x PostgreSQL [Ferramentas - DTS] Migração SQLServer x PostgreSQL [Ferramentas - DTS] Migração SQLServer x PostgreSQL [Ferramentas - DTS] MIGRAÇÃO PostgreSQL 7.4.17 x PostgreSQL 8.0 PostgreSQL 7.4.17 x PostgreSQL 8.0 ● É um SGBD; SGBD ● No início se chamava Postgres; ● Código Aberto; ● ● Compatível com os padrões SQL92/SQL96; SQL92/SQL96 Nasceu na Universidade Berkeley PostgreSQL 7.4.17 x PostgreSQL 8.0 ● ● Sob a licença BSD; BSD Patrocinado pelo DARPA, DARPA e outros órgãos USA; ● Tornando-se público 1987; ● Release 8.2.4; 8.2.4 PostgreSQL 7.4.17 x PostgreSQL 8.0 ● Transparente para o Administrador; ● SGBDs Diferentes; ● Mesma Plataforma; PostgreSQL 7.4.17 x PostgreSQL 8.0 ● ● ● ● Roda nativamente na Microsoft Windows como um servidor; Pode rodar como um serviço Windows; No Windows não tem os benefícios de anos de uso em ambientes de produção que o PostgreSQL tem nas plataformas Unix; Já PostgreSQL tem nativamente suportado clientes Windows por anos. PostgreSQL 7.4.17 x PostgreSQL 8.0 ● ● ● ● Tem maior compatibilidade com o padrão SQL ANSI; TABLESPACE: pode mudar o local de armazenamento de índices e tabelas; tabelas Os tipo de dados de colunas pode agora serem trocados com ALTER TABLE; TABLE Antes só era possível dropando a coluna e readicionando o coluna; PostgreSQL 7.4.17 x PostgreSQL 8.0 ● ● Adicionou a habilidade para prolongar o vacuum para reduzir impacto da performance; Use IPv6 ::1/128 para localhost por default pg_hba.conf; ● Use formato CIDR em pg_hba.conf; ● Ouve o localhost por default; PostgreSQL 7.4.17 x PostgreSQL 8.0 ● ● Permite que os arquivos de configuração fique fora do diretório de dados; /etc/postgresql/8.2/main/postgresql.conf; PostgreSQL 7.4.17 x PostgreSQL 8.0 ● ● ● Limpar as senhas de usuário MD5 quando um usuário é renameado; PostgreSQL usa o nome de usuário como um salt quando criptografa senha via MD5. MD5 Quando o nome de usuário é trocado, uma nova senha deve ser assinada para que o usuário seja habilitado para logar; PostgreSQL 7.4.17 x PostgreSQL 8.0 usuário = HUGO senha = 123456 senha + MD5 = asf9y20saf3 senha + MD5 + salt (HUGO) = wqf1y9sbhf61bp PostgreSQL 7.4.17 x PostgreSQL 8.0 usuário = JOSE senha = 123456 senha + MD5 = asf9y20saf3 senha + MD5 + salt (HUGO) = PostgreSQL 7.4.17 x PostgreSQL 8.0 usuário = JOSE senha = senha + MD5 = senha + MD5 + salt (HUGO) = PostgreSQL 7.4.17 x PostgreSQL 8.0 usuário = JOSE senha = 123456 Não mudou senha + MD5 = asf9y20saf3 Mudou senha + MD5 + salt (JOSE) =s51k091bnfiz97 Migração SQLServer x PostgreSQL [Conclusão] ● Em um processo de migração de banco de dados, existem diversos fatores que devem ser levados em consideração e o sucesso de uma migração é reflexo de uma completa análise destes fatores, sejam eles técnicos (diferenças entre SGBD's) ou não (apoio da diretoria). Migração entre SGBDs [Bibliografia] ● http://tellesr.multiply.com/video/item/5 ● http://psoug.org/reference/pseudocols.html ● http://www.postgresql.org ● http://www.oracle.org ● http://pgfoundry.org/projects/dbi-link/ ● http://freshmeat.net/projects/ora2pg/ ● http://pgdocptbr.sourceforge.net/pg80/ ● http://www.devmedia.com.br/articles/viewcomp.asp?comp=3967 ● http://www.postgresql.org/docs/techdocs.29 ● http://www.postgresql.org/docs/8.2/static/release-8-0.html; ● http://www.devmedia.com.br/articles/viewcomp.asp?comp=1490&vt =-1