备份是从使用 UTF-8 编码的数据库创建的,使用pg_dump
. 备份是tar
格式。
然后,我使用以下命令在另一台运行相同版本的 PostgreSQL (8.2.4) 的服务器上创建了一个新数据库:
createdb -E utf8 db1
运行时pg_restore
出现以下错误:
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
原始数据库不再可用。
如何恢复此数据或找到导致问题的字节序列?
我通过以下步骤解决了这个问题:
然后我从
db1.sql
文件中删除了除table1
复制命令之外的所有内容。然后跑:然后,这给了我发生错误的文件中的确切行号。然后我打开文件并删除问题字符并重新运行脚本。
旧版本的 Postgres 允许将无效的字节序列输入数据库。在最近的发布说明中有关于此的说明和建议的修复:
如果数据库不是很大或不是很复杂,则可能更容易在原始数据库中找到有问题的文本并在进行新的转储之前更正它。具有用户输入的输入或包含从其他来源导入的数据的字段可能是罪魁祸首。
这个小 Perl 脚本可能会拯救你: 修复混合 UTF-8 和 ISO-8859-1 的损坏文档
将脚本输出重定向到新文件。所有非法字符都应替换为正确的 UTF-8 化身。该脚本也逐行读取输入,因此它不需要太多内存。
从 7.4 迁移到 8.2 db 时,这可能与我曾经遇到的问题相同。我使用this web article上的说明来解决问题。这假设您仍然可以访问原始数据库。否则,您可能可以在旧版本的 Postgresql 中恢复它并尝试使用该过程。