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 ...
fonte
Respostas:
Eu acho que a maneira mais simples é usar essa
--hex-blob
opçãomysqldump
e restaurar pelo psql, comdecode(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:sessão psql:
fonte
sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump