AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 48438
Accepted
Simon
Simon
Asked: 2009-07-31 23:07:57 +0800 CST2009-07-31 23:07:57 +0800 CST 2009-07-31 23:07:57 +0800 CST

无法恢复 PostgreSQL 数据库备份

  • 772

备份是从使用 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

原始数据库不再可用。

如何恢复此数据或找到导致问题的字节序列?

backup postgresql
  • 4 4 个回答
  • 6814 Views

4 个回答

  • Voted
  1. Best Answer
    Simon
    2009-08-04T15:46:06+08:002009-08-04T15:46:06+08:00

    我通过以下步骤解决了这个问题:

    pg_restore -f db1.sql-v db1.tar
    

    然后我从db1.sql文件中删除了除table1复制命令之外的所有内容。然后跑:

    psql -d db1 < db1.sql
    

    然后,这给了我发生错误的文件中的确切行号。然后我打开文件并删除问题字符并重新运行脚本。

    • 3
  2. Console
    2009-07-31T23:42:56+08:002009-07-31T23:42:56+08:00

    旧版本的 Postgres 允许将无效的字节序列输入数据库。在最近的发布说明中有关于此的说明和建议的修复:

    一些用户在将 UTF-8 数据加载到 8.1.X 时遇到问题。这是因为以前的版本允许将无效的 UTF-8 字节序列输入到数据库中,而这个版本正确地只接受有效的 UTF-8 序列。更正转储文件的一种方法是运行命令 iconv -c -f UTF-8 -t UTF-8 -o cleanfile.sql dumpfile.sql。-c 选项删除无效的字符序列。两个文件的差异将显示无效的序列。iconv 将整个输入文件读入内存,因此可能需要使用 split 将转储分解为多个较小的文件进行处理。

    如果数据库不是很大或不是很复杂,则可能更容易在原始数据库中找到有问题的文本并在进行新的转储之前更正它。具有用户输入的输入或包含从其他来源导入的数据的字段可能是罪魁祸首。

    • 2
  3. wazoox
    2009-08-01T02:14:12+08:002009-08-01T02:14:12+08:00

    这个小 Perl 脚本可能会拯救你: 修复混合 UTF-8 和 ISO-8859-1 的损坏文档

    将脚本输出重定向到新文件。所有非法字符都应替换为正确的 UTF-8 化身。该脚本也逐行读取输入,因此它不需要太多内存。

    • 1
  4. edomaur
    2009-08-01T00:44:05+08:002009-08-01T00:44:05+08:00

    从 7.4 迁移到 8.2 db 时,这可能与我曾经遇到的问题相同。我使用this web article上的说明来解决问题。这假设您仍然可以访问原始数据库。否则,您可能可以在旧版本的 Postgresql 中恢复它并尝试使用该过程。

    • 0

相关问题

  • 具有 26 周覆盖保护期和 1 年可附加期的媒体集是什么意思?

  • 社区对备份解决方案的意见

  • 无法读取不同 LTO-3 驱动器上的 LTO-3 磁带

  • 使用 TSM 备份时跳过硬链接

  • 使用 rsync 维护名称更改的目录的副本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve