Não é possível restaurar o backup do banco de dados do PostgreSQL

2

O backup foi criado a partir de um banco de dados com a codificação UTF-8 usando pg_dump . O backup está no formato tar .

Eu então criei um novo banco de dados em outro servidor rodando a mesma versão do PostgreSQL (8.2.4) usando este comando:

createdb -E utf8 db1

Ao executar pg_restore , recebo o seguinte erro:

pg_restore: [archiver (db)] Error from TOC entry 1667; 0 14758638 TABLE DATA table1 db1 
pg_restore: [archiver (db)] COPY failed: ERROR: invalid byte sequence for encoding "UTF8": 0xc520

A base de dados original não está mais disponível.

Como posso restaurar esses dados ou encontrar a sequência de bytes que está causando o problema?

    
por Simon 31.07.2009 / 09:07

4 respostas

2

Eu resolvi este problema com os seguintes passos:

pg_restore -f db1.sql-v db1.tar

Em seguida, removi tudo do arquivo db1.sql , exceto o comando table1 copy. Então corri:

psql -d db1 < db1.sql

Isso me deu o número exato da linha dentro do arquivo onde o erro estava ocorrendo. Em seguida, abri o arquivo, removi o caractere problemático e executei novamente o script.

    
por 04.08.2009 / 01:46
2

Versões mais antigas do Postgres permitiriam que sequências de bytes inválidos fossem inseridas em um banco de dados. Havia uma observação sobre isso e uma correção sugerida em um recente comunicado :

Some users are having problems loading UTF-8 data into 8.1.X. This is because previous versions allowed invalid UTF-8 byte sequences to be entered into the database, and this release properly accepts only valid UTF-8 sequences. One way to correct a dumpfile is to run the command iconv -c -f UTF-8 -t UTF-8 -o cleanfile.sql dumpfile.sql. The -c option removes invalid character sequences. A diff of the two files will show the sequences that are invalid. iconv reads the entire input file into memory so it might be necessary to use split to break up the dump into multiple smaller files for processing.

Se o banco de dados não for muito grande ou complexo, talvez seja mais fácil localizar o texto incorreto no banco de dados original e corrigi-lo antes de fazer um novo dump. Um campo que tenha entrada inserida pelo usuário ou contenha dados importados de outras fontes pode ser um culpado.

    
por 31.07.2009 / 09:42
1

Este pequeno script Perl pode salvar você: Reparando documentos quebrados que misturam UTF-8 e ISO-8859-1

Redirecione a saída do script para um novo arquivo. Todos os caracteres ilegais devem ter sido substituídos pela encarnação UTF-8 correta. O script lê a linha de entrada por linha também, então não deve precisar de muita memória.

    
por 31.07.2009 / 12:14
0

É provavelmente o mesmo problema que tive uma vez, ao migrar de um 7.4 para um 8.2 db. Eu usei as instruções neste artigo na Web para resolver o problema. Isso pressupõe que você ainda tenha acesso ao banco de dados original. Caso contrário, você provavelmente poderá restaurá-lo em uma versão mais antiga do Postgresql e tentar com esse procedimento.

    
por 31.07.2009 / 10:44