2

今天早些时候,我尝试使用 pgAdmin III 从生产环境中恢复我的 PostgreSQL (8.1.22) 数据库。但是,在恢复过程完成后,它开始抛出如下错误:

WARNING: errors ignored on restore: 4 

此外,经过调查,我发现在所有表中,有 3 个表尚未恢复(包含 0 行)。当我检查日志时,我在 3 个表附近发现了以下错误:

pg_restore: [archiver (db)] Error from TOC entry 5390; 0 442375 TABLE DATA tablename postgres
pg_restore: [archiver (db)] COPY failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xea0942
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT:  COPY tablename , line 7875

我尝试在 Google 上研究我的问题,但没有产生任何结果。请帮助恢复这三个表而不会出现任何错误。

4

1 回答 1

11

旧版本的 PostgreSQL 在 UTF-8 合规性方面没有新版本那么严格。大概您正在尝试将包含无效 UTF-8 的数据从这样的旧版本恢复到新版本。

必须清除无效字符串。您可以对由于这些错误而未导入的每个表执行该过程:

  1. 将表的内容从转储文件中提取到 SQL 纯文本文件中:

    pg_restore --table=tablename --data-only dumpfile >plaintext.sql
    
  2. 在文本编辑器中删除无效字符或使用以下命令自动删除iconv

    iconv -c -f UTF-8 -t UTF-8 <plaintext.sql >plaintext-cleaned.sql
    
  3. 导入净化后的数据:

    psql dbname < plaintext-cleaned.sql
    
于 2013-07-05T11:51:54.307 回答