RSS

Conversão de MySQL para PostgreSQL

04 fev

Enquanto o banco de dados de código aberto mais popular do mundo é o MySQL, o banco de dados de código aberto mais avançado do mundo é o PostgreSQL.  Não é raro termos de fazer conversões de um para outro.

Depois de alguma ajuda do Amigoogle, encontrei o script mysql2pgsql. Como o nome sugere, este script faz a conversão de bancos de dados do MySQL para o PostgreSQL. Depois de baixá-lo e atribuir permissão de execução para o arquivo, para fazer a conversão é necessário gerar um dump do banco MySQL e executar o seguinte comando:

$ ./mysql2pgsql.perl [MYSQL] [POSTGRESQL]

Onde:

  • [MYSQL] é o arquivo dump que você gerou
  • [POSTGRESQL] é o arquivo que será gerado. Cuidado para não sobrescrever um arquivo que já exista

Depois disso, é só você pegar o arquivo gerado, executar no psql, ou PgAdmin III e ganhar alguns pontos com seu chefe. Em tese.

Abrindo um parênteses. Quando executei foi no PgAdmin III (que é o que eu costumo usar) ele não executou pelo problema que descrevo abaixo. Estava com este artigo praticamente pronto, quando dei ouvidos a voz do além que dizia: Você não testou isso no psql! Dito e feito. Testei e o danado não reclamou de nada. Então o problema que descrevo só acontece no PgAdmin III – eu sempre achei que o PgAdmin usava o psql por baixo. Fecha parênteses.

O arquivo gerado mysql2pgadmin é um arquivo com comandos SQL de criação (CREATE) de objetos do banco (tabelas, sequências, índices etc.) e seus respectivos comandos de INSERT.  Mas o padrão dele é também incluir comandos de remoção (DROP) desses objetos. Acontece que para os DROP’s das tabelas, ele gera a seguinte saída:

DROP TABLE “nome_tabela” CASCADE\g

O PgAdmin vai reclamar desse “\g”. Oh, céus. E agora?

Como todo software (livre) que se preze, o mysql2pgsql tem uma ajuda. Help para os íntimos.  Basta executá-lo com o parâmetro -h, como abaixo:

$ ./mysql2pgsql.perl -h

Atenção para o que diz a descrição do parâmetro –nodrop:

–nodrop: strips out DROP TABLE statements
otherise harmless warnings are printed by psql when the dropped table does not exist

Ótimo. Podemos gerar o arquivo para o PostgreSQL sem os ‘DROP TABLE’s. E sermos felizes.

Peraí. E se precisarmos que o DROP TABLE seja gerado? Isso é assunto para o próximo artigo. Nos vemos em breve.😉

 
13 Comentários

Publicado por em 04/02/2009 em Tutorial

 

Tags: , , ,

13 Respostas para “Conversão de MySQL para PostgreSQL

  1. Adelar

    06/05/2009 at 20:40

    Muito boa a dica..
    valew🙂

     
  2. adorilson

    07/05/2009 at 11:52

    Opa Adelar,

    vc viu a continuidade? Aproveite para colocar o link nesse post pra ela.

     
  3. Adelar

    12/05/2009 at 20:32

    vi sim…🙂
    não me lembro muito de sed mas acho que isso resolve o problema do \g:

    ./mysql2pgsql.perl dumpMysql.sql postgre.sql;
    sed -i ‘s/\\g/;/’ postgre.sql

    flw..

     
  4. adorilson

    16/05/2009 at 13:54

    Adelar,

    é uma possibilidade. Mas uma solução dessa teria de ser executada toda vez. Por isso eu preferi cascaviar o código e corrigir nele. Show me the code.😉

     
  5. Cristiano

    03/07/2009 at 14:37

    Oi,

    No meu caso esse scrit não funcionou. deu um monte de erros de sintaxe.
    Por exemplo: no mysql eu tenho tabelas com campos que são do tipo datetime e que no postgres não existe, mas o script os coloca do mesmo jeito no create table…

    Será que fiz algo de errado?

     
  6. adorilson

    03/07/2009 at 15:11

    Cristiano,
    quais foram o monte de erros especificamente?

    Como você fá fazendo a execução?

    Execute o script com o arquivo de teste que tem no site antes.
    Eu não lembro se o banco converti tinha campos datetime, mas esse arquivo de teste tem sim.

     
  7. Cristiano

    03/07/2009 at 16:13

    Ei Adorilson, eu descobri pq não tava funcionando. O meu dump está com algumas informações não suportadas pelo script.
    A primeira é a criação do database/schema:

    CREATE DATABASE IF NOT EXISTS Banco;
    USE Banco;

    A segunda é o uso do schema na criação da tabela:

    DROP TABLE IF EXISTS `Banco`.`EMPRESA_CONVENIO`;
    CREATE TABLE `Banco`.`EMPRESA_CONVENIO` (….

    Quando está assim o script se perder e não converte direito… Mas ao remove-los funcionou.

    Obrigado pela dica e um abraço !!

     
  8. Antonio José

    16/01/2012 at 02:53

    Olá! gostaria de saber como eu faço para converter do Postgre para o mysql tem como?
    Obrigado!

     
  9. adorilson

    16/01/2012 at 16:12

    Ola Antonio Jose,

    eu nunca precisei fazer a conversão Postgres->MySQL, mas eu acredito que deva ter sim. Só continuar procurando.😉

    []’s
    Adorilson

     
  10. Fernando Binasco

    22/05/2012 at 21:36

    Também obtive erro de sintaxe:

    root@fer-Inspiron-1525:/home/fer/Downloads# psql -h localhost -d mydb -U postgres -f psql.sql
    Password for user postgres:
    psql:psql.sql:25: ERROR: syntax error at or near “(”
    LINE 2: “id” int(11) NOT NULL,
    ^
    psql:psql.sql:38: ERROR: syntax error at or near “(”
    LINE 2: “gte_usuario_id_pessoa” int(11) NOT NULL,
    ^
    psql:psql.sql:51: ERROR: syntax error at or near “(”
    LINE 2: “gte_usuario_id_pessoa” int(11) NOT NULL,

     
  11. Rafael

    07/10/2012 at 02:15

    Não funciona com procedures / functions?
    DELIMITER não rola…

    psql:backup-cms-tag-2012-10-06_224154-PGSQL.sql:3295: ERROR: syntax error at or near “DELIMITER”
    LINE 1: DELIMITER ;
    ^

     
  12. adorilson

    07/10/2012 at 13:31

    Rafael,

    não sei se tem suporte para procedures/functions. Mas eu até desconfio que não, pois eles costumam usar recursos específicos do SGBD, que ficam bem complicado fazer um conversor. Principalmente desse tipo, que basicamente só faz substituição de strings.

     

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: