Como migrar grandes tabelas de blob do mysql para o postgresql?

14

Agora estou migrando meu banco de dados MySQL para o PostgreSQL. Quase tudo correu bem (bem, depois de pesquisar bastante os parâmetros corretos do mysqldump etc.), exceto uma tabela que tenho - na verdade a tabela mais importante no meu aplicativo.

A estrutura da tabela é muito simples:

mysql> show create table samples;
.. skipped ...
CREATE TABLE `samples` (
      `File_ID` int(11) NOT NULL,
      `File` longblob,
      PRIMARY KEY (`File_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=binary

mas é muito grande (> 20 Gb).

Eu tentei usar --hex-blob parâmetro do mysqldump - mas dados neste formato não são aceitos pelo PostgreSQL quando tentei usar o arquivo de despejo resultante como um arquivo de comando. Outra opção que eu tentei é usar a opção --tab para obter um despejo e inseri-lo no PostgreSQL com o comando COPY - mas --hex-blob não está funcionando com o --tab e o PostgreSQL ainda não aceita o dumpfile dizendo lá são caracteres inválidos.

Eu ficaria muito feliz em receber conselhos sobre esse assunto - embora eu esteja começando a pensar que escrever uma ferramenta de migração personalizada não é uma má idéia, afinal ...

Sergey Kudriavtsev
fonte
A última vez que verifiquei, o dblink do PostgreSQL só pôde se conectar a outras instâncias do PostgreSQL. Eu não acho que o MySQL Proxy seja melhor. Você pode precisar usar seu idioma favorito (IE: Java, etc) para ler a partir do MySQL, a fim de inserir no PostgreSQL ...
@OMG: Como observei em questão, estou quase pronto para seguir esse caminho - apenas tenho uma pequena esperança de que alguém saiba alguma coisa sobre esse assunto.
Em que tipo de dados no final do pgsql você está tentando inseri-los? Eu faria isso comigo mesmo.
@ Scott: Sim, claro que é bytea.
2
O posgresql 9 suporta a sintaxe hexadecimal para bytea diretamente, veja aqui: postgresql.org/docs/9.0/interactive/… (você precisará de um pouco de sed)

Respostas:

12

Eu acho que a maneira mais simples é usar essa --hex-blobopção mysqldumpe restaurar pelo psql, com decode(string text, type text). No entanto, não é tão simples, porque você precisa alterar um pouco de dump produzido (sed, awk), adicionando essa função de decodificação. Por exemplo:

mysqldump -u root -p --skip-quote-names --hex-blob --skip-triggers \
    --compact --no-create-info mysql samples > prepg.dump

sed "s/0x\([0-9,A-F]*\))/decode('\1','hex'))/g" prepg.dump > pg.dump

sessão psql:

CREATE TABLE samples
(
    file_id integer PRIMARY KEY,
    file bytea
);

\i 'path/to/pg.dump'
Grzegorz Szpetkowski
fonte
Obrigado por uma sugestão, Grzegorz, vou tentar e relatar os resultados.
Funcionou como um encanto :) Teste 10 arquivos importados corretamente, todas as somas de verificação são originais correspondentes. Muito obrigado!
1
Se você tiver outros campos, não desejará que ele combine vírgulas ou parênteses à direita. Isso deve funcionar:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan